Bit RXNEIE włącza przerwanie od dwóch flag: RXNE i ORE (overrun) - patrz tabelka USART interrupt requests . Odczyt z DR kasuje RXNE. ORE jest kasowane przez (cytat z opisu bitu ORE): "an read to the USART_SR register followed by a read to the USART_DR register".
Zerowanie flagi na końcu przerwania - niedopuszczalne
Czytając o rejestrach liczników, jedyną taką flagą (którą znalazłem), jest TIMx_SR_UIF, czyli UpdateInterruptFlag. Co prawda nie będę włączał przerwania, ale jest to chyba jedyna flaga którą mogę w tym celu wykorzystać, czy też jest jakaś inna lepsza do tego celu? To jest właśnie flaga która jest Ci potrzebna. 4\/3!!
Skoro zerujesz ręcznie piny to czego się spodziewasz jeśli nie wyzwolenia przerwania od zbocza opadającego? Moduł EXTI działa niezależnie od tego czy ma włączone przerwania czy nie - jeśli są wyłączone to po prostu nic się nie wywoła, ale flagi zostaną sprawdzone. Jeśli włączysz przerwanie, a flaga była ustawiona, to przerwanie zostanie aktywowane najszybciej...
- Nie do końca wiem co poszczególne linijki kodu powodują w samym układzie. Jeśli masz problem ze zrozumieniem rejestrów uC ich obsługi, co robi flaga, dlaczego i kiedy trzeba ją kasować, użyj HAL. Następnie podejrzyj (nie zawsze jest łatwo, bo HAL jest uniwersalny przez co czasem nieźle "zakręcony") jak to jest zrobione. Łatwiej będzie Ci zrozumieć...
I właśnie o tym piszę. Kiedy wystąpi samo przepełnienie, a ustawia się flaga porównania to to jest poprawne działanie?
Racja, w F1 jest jedynie flaga IDLE ktora moze się przydać. Jej procedura czyszczenia jest jedynie trochę dziwna.
Debouncing w przerwaniu - tylko nie mów, że robisz to przez aktywne oczekiwanie wewnątrz przerwania. Jeśli tak, to zauważ, że to, że skasowałeś flagę przerwania i jesteś w przerwaniu wcale nie oznacza, że flaga nie może zostać ustawiona ponownie. Możliwy jest taki scenariusz: wciskasz przycisk, pojawia się zbocze opadające które ustawia flagę a więc...
Nie znam nowych avrów, ten kod przypomina mi STM32, natomiast w starych była globalna flaga uruchomienia przerwań, sprawdzałeś czy tutaj takiej nie potrzeba? I przez analogię do STM, czy po zmianach częstotliwości zegara, nie trzeba poczekać ileś cykli aż się ustabilizuje? Jak tam prosty przykład? No i przeniósłbym zliczanie minut do przerwania, u siebie...
A to nie jest tak że jak włączę np timer i będzie sobie chodził i jak się w końcu przekręci, (przepełni) to ustawi flagę np UIF (piszę z pamięci mogę pomylić nazwę, ale chodzi o przepełnienie). Flaga jest ustawiona, włączam przerwanie w peryferialu i następnie w NIVC. Jeśli flagi nie skasuję to odpali się przerwanie czy nie?
Bardzo dziękuję za pomoc, skorzystałem ze sprawdzania flagi od DMA i śmiga. Swoją drogą, to nigdy bym nie pomyślał, że flaga ta ustawia się w innym momencie niż generowane jest przerwanie. A tu się okazuje, że TC to nie TC.
Chciał bym żeby po przerwaniu program od razu startował w nowym efekcie. Ustawiaj w przerwaniu flagę. Program główny będzie ją sprawdzał, jak jest ustawiona zmieni efekt i skasuje flagę.
Jeśli pisząc "wiesza" masz na myśli HardFault to nie. Wygląda na to, że cały czas stoi w linii z whilem gdzie sprawdzana jest właśnie ta flaga. Nie chce w tym czasie wejść do przerwania. Generalnie po tych wszystkich zmianach program zachowuje się tak jak przedtem, tzn. gdy wszystko chodziło z FLASHa.
Pochodzi od czujnika przerwania wiązki, drgań styków nie ma : ), znalazłem że czyszczenie flagi przerwania powinno być na początku, ale to niestety nie pomaga, i nadal pozostaje problem z wykrywaniem obu zbocz a nie tylko jednego Dodano po 10 Przeszukałem forum, kilka kursów po polsku i angielsku i ten kod z pierwszego postu jest identyczny jak te z...
Może pokaż cały kod. Poza tym, przerwania mogą być tak szybko wywoływane, że przy debuggingu się one gdzieś zgubią (bo nie odbierzesz wszystkich znaków z bufora a już przyjdą następne znaki). Mówisz, że nie działa w ogóle, więc może posprawdzaj flagi transmisji ?
jeśli flaga jest ustawiana po zakończeniu konwersji, to w trakcie pomiaru nie jest ona ustawiona, więc powinno być: while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0); // czekaj na koniec konwersji następnie odczyt, i tak w kółko…
Witam, mam dziwny problem przy obsłudze przerwania od ADC End of Conversion. Gdy przetwornik ADC jest skonfigurowany do pracy z DMA procesor nie wchodzi do if`a gdzie jest zerowana flaga zakonczenia konwersji. Wchodzi jedynie do funkcji obslugi przerwania i po sprawdzeniu źródła przerwania wychodzi z niej. [syntax=c]void ADC1_2_IRQHandler ( void ) {...
Tyle że to jest bezsensu... Przecież flaga ustawia się sama - wystarczy sprawdzać rejestr statusowy timera (czy czego tam trzeba) i już wiadomo, że można coś robić. Tym sposobem z "przerwań" robi się najzwyklejszy "polling". 4\/3!!
Jest coś nie tak z UART_BUFOR. W przedstawionym fragmencie brak definicji tego tworu więc nie wiadomo dlaczego. Poza tym typowy błąd AVRowca - nieskasowana flaga przerwania. Powtórzę to co przedmówca: poradnik szczywronka wyłuszcza to prosto i zrozumiale. Nazwy wektorów przerwań biorę z Reference Manuala albo z plików startowych np. vectors_stm32f10x.c...
Witam Zaczynam zabawę z STM32 i HALem. Mam następujący dylemat. Otóż uruchomiłem przerwania od dwóch UARTów funkcją: [syntax=c] HAL_UART_Receive_IT(&huart1, &znak, 1); HAL_UART_Receive_IT(&huart2, &znak, 1); [/syntax] Po pojawieniu sie jednego znaku w Uarcie 1 lub Uarcie 2 uruchamia mi się wspólna procedura: [syntax=c] void HAL_UART_RxCpltCallback(UART_HandleTypeD...
Miałem podobny problem z przerwaniem od RTC (przeliczanie/odświeżanie dnia/miesiąca/godziny itd do struktury). Po zainicjowaniu przerwań: [syntax=c]/* Enable the RTC 1s Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemp... = 4; NVIC_InitStructure.NVIC_IRQChannelSubPri... = 0; NVIC_InitStructure.NVIC_IRQChannelCmd...
A jak się upewnisz bez while'a o zmianie flagi? wszystkich sie nie da wyrzucić... W przerwaniu. Chyba, że lubisz/możesz sobie pozwolić na robienie while w pętli głównej. Ale ten błąd I2C nie wynikał z tego, że zastosowano while tylko dlatego, że w zły sposób była sprawdzana flaga.
Witam, zaczynam dopiero przygodę z Cortexami i utknąłem na konfiguracji kontrolera NVIC. Chciałem uzyskać reakcje procesora na przerwanie od GPIOC Pin0. Wydaje mi się, że wszystko jest OK, a jednak nie chcę działać, program po wystąpieniu przerwania nie wchodzi w funkcję jego obsługi. Poniżej zamieszczam kod: Funkcja konfigurująca NVIC, GPIOC, EXTI,...
Zapytałem się czy istnieje bit w rejestrze który wskaże mi koniec transmisji. Napisałeś, że jest, więc ja napisałem że flaga STOP działa jeśli I2C jest jako SLAVE. http://obrazki.elektroda.pl/5391711300_1... Chyba się nie zrozumieliśmy. P.S. Pojawił mi się przed chwilą problem. W pętli zapisuje coś po I2C, a potem odczytuje (jako 2 oddzielne...
Złą flagę czyścisz w przerwaniu (13 ≠ 1) ;)
Wiedziałem o tym tylko nie bardzo właśnie wiem co to zmienia, tak czy tak powinna się ta flaga wyzerować po pierwszym przerwaniu, nie? Bo nad wysyłaniem mogę zapanować ustawianiem TXE w CR1 tylko czy o to chodzi?:P No i za każdym odebranym znakiem przelatuje mi też część przerwania odpowiedzialna za wysyłanie a to już bez sensu :P Czy w ogóle nie powinienem...
Witam! Po przyjściu danych do UARTU, są one prawidłowo zapisywane w rejestrze DR, ustawiana jest wtedy również flaga RXNE znajdująca się w rejestrze SR. (według debugera) Niestety, kiedy próbuję programowo sprawdzić stan flagi RXNE, okazuje się ,że nie została ona ustawiona, wartość rejestru SR ma wartość sprzed przyjścia danych(przerwania) Spróbowałem...
Sprawdziłem i flaga RXERIF nie jest ustawiona. Zwróciłem uwagę natomiast na coś innego. Wszystko lepiej działa jeśli timerem odpalam obsługę pakietów (ENC28J60_ExtiH) niż jak wyzwalana jest z przerwania. Dodatkowo sprawdziłem iż po połączeniu poprzez FireFox'a w buforze pozostają nie obsłużone 2 pakiety. Dziwne to gdyż zmieniłem funkcję i na początku...
Zeruje falgi żądań przerwań w rejestrach peryferiów: void DMA1_Channel1_IRQHandler(void) { GPIOB ->ODR ^= GPIO_BSRR_BS13 ; // Zerwoanie flagi żądania przerwania wpisaniem 1 DMA1->ISR |= DMA_ISR_HTIF1; } void ADC1_2_IRQHandler(void) { if(ADC1->SR & ADC_SR_EOC) { GPIOB ->ODR ^= GPIO_BSRR_BS12 ; ADC1->SR...
Wpisałem coś takiego: [syntax=c]NVIC_EnableIRQ(DMA1_Channel1_I... Odblokowanie przerwania od kanału 1 DMA1 bo w konfiguracji DMA kanał 1 miałem: [syntax=c]DMA1_Channel1->CCR = (DMA_CCR1_PL_0 | DMA_CCR1_PL_1 | DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0 | DMA_CCR1_MINC | DMA_CCR1_TCIE | DMA_CCR1_EN);[/syntax] TCIE włączenie przerwania od zakończenia...
IMO implementacje SPI na przerwaniach w przypadku SPI mają zerowy sens (jedynie jeżeli mamy problem z ilością RAM i liczymy każdy bajt ale wtedy można - a raczej trzeba się pogodzić z dużymi dziurami między paczkami). DMA w przypadku SPI jest dość łatwe do implementacji bo ilość danych wysłanych jest zawsze równa liści danych odebranych. Nie występują...
Wpisując w licznik wartość JEDEN zostanie wysłany JEDEN element, po czym DMA się wyłączy. To co widzisz w debuggerze nie ma tu znaczenia, może bit faktycznie wciąż jest ustawiony - nieistotne, DMA nie działa po wysłaniu zadanej ilości danych. Nie wiem też absolutnie jakim cudem chcesz "ustawiać flagę nadawania" w rejestrze CR1, skoro ta flaga jest generowana...
Dzięki, teraz działa ładnie, może się komus przyda. [syntax=c] ////////////////////////////////////////... przyciskow void EXTI15_10_IRQHandler(void) { NVIC_DisableIRQ(EXTI15_10_IRQn); //wyłącz przerwanie exti if(((EXTI -> PR)&EXTI_PR_PR10)) //przerwanie od PA10 { po1++; } if(((EXTI -> PR)&EXTI_PR_PR11))...
Działa. Wystarczyło zmienić szukany znak z backslasha na '\n'. Ostatecznie modyfikacja wygląda nastepująco: if (character == '\n') { __fputc_('\n', stream); __fputc_('\r', stream); continue; } Dopracowałem rownież funkcje usart_put_char, zamiast wprowadzać delaya sprawdzam flage czy UART zakończył poprzednią transmisję....
Jeśli zajrzysz do definicji funkcji NVIC_SetPriority((), zobaczysz, że dla SysTick nie rusza ona wcale NVIC. Racja, wpisuje do innych rejestrów. Ale Manual pisze że SysTick też wchodzi o NVIC. Jeszcze kolejna sprawa. Skoro Aby mogło wystąpić przerwanie należy zarówno ustawić i to co generuje przerwanie np Timer jak i NVIC. Ale co np ze znacznikiem...
Witam. Chciałem zrobić ekstremalnie uproszczonego modbusa RTU Slave na STM32. Tz w przerwaniu od RX jeśli pojawi się adres mojego urządzenia (Slave) to odrazu wyślij ramkę w postaci: adres,funkcja,ilosc_danych,dane,CRC16. Czy z punktu widzenia modbusa stanowi jakiś problem to uproszczenie ? Dodano po 24 Działa :) Dodano po 33 Tylko pytanie dlaczego...
Cieszę się, że mogłem pomóc. Fakt - ciężko się w tym odnaleźć, tym bardziej, że czasem są dziwne zależności. Jak np. żeby włączyć PWM dla TIM1 trzeba ustawić bit w rejestrze od break'a i dead-time: Dodano po 57 Pomogło dzięki. Ogólnie biorąc to w tych ARM'ach strasznie dużo rejestrów trzeba poustawiać, żeby coś działało ;) Mam jeszcze pytanie dotyczące...
1. Dla SysTicka nie włączasz NVIC, bo to przerwanie jest w NVIC zawsze włączone (w ogóle nie da się go wyłączyć inaczej niż wyłączając globalne zezwolenie na jakiekolwiek przerwania). 2. Generowanie przerwania włączasz w SysTicku [; Reasumując: - SysTick->LOAD - wartość "przeładowania" - SysTick->CTRL - dla takiego działania jak chcesz ustawiasz tam...
Witam, Widzę, że wywiązała się całkiem spora dyskusja i nie wiem do czego najpierw się odnieść. 1. Ten przypadek to maksymalne taktowanie timera i ciągłe wywoływanie przerwania, jednak nadal nie usprawiedliwia to czasu przełączania portu z ns do us. Nie zrobię teraz pomiarów więc nie podam dokładnych wyników ale przy wywoływaniu przerwania co 10us czas...
Witam Dlaczego podczas obsługi przerwania TIM2 dwukrotnie jest ustawiana flaga "tim_up" ? Pierwszy raz natychmiast (błędnie) oraz drugi raz po ustawionym w preferencjach czasie (prawidłowo) [syntax=c]volatile uint8_t tim_up = 0; int main(void) { myinit (); TIM_Cmd(TIM2, ENABLE); while (1) { /* * You can do whatever you want in here */ if( tim_up ==...
Ciężko zaprezentować rozwiązanie. W tym przypadku moje patenty dotyczą protokołów, które opracowywałem sam, pod kątem użyteczności w danym urządzeniu. Protokołów tych nie udostępnię, więc i parsery pozostaną ściśle tajne ;] Musisz opracować protokół, a dopiero potem brać się za pisanie parsera. Jak chcesz wymyślić parser do czegoś, co nie wiesz jak...
Witam, chciałbym przesyłać dane przez USART za pomocą DMA (STM32F4). DMA jest aktywowane w przerwaniu od TIM2 w odstępach co 100 ms. Program wykonuje się, natomiast dane nie są przesyłane. Wiem, że na pewno przerwanie od TIM2 działa poprawnie. Jeśli ktoś wie gdzie może być błąd/braki w konfiguracji proszę o odpowiedź. Z góry dzięki. Poniżej kod: [syntax=c]...
Mógłby ktoś rzucić okien na mój kod funkcji delay. Siedzę nad tym od paru godzin i nie mogę znaleźć błędu. Timer jest 2 razy szybszy nić powinien być. Używam TIM6, skonfigurowanego do ustawiania flagi przerwania przy overflow, ale nie obsługuję tego w przerwaniu tylko w funkcji delay sprawdzam, kiedy flaga zostanie ustawiona. Do prescalera wstawiam...
Temat jest znany już dawna. Wg, również i moich, testów dostępne były diody z czasem resetu ok 9 us oraz 35 us. Prawdopodobnie masz te drugie. A może jeszcze jakiś nowy twór pojawił się na rynku. "Moje" diody resetują się przy czasie powyżej 200µs, więc to jeszcze coś nowszego. Dobrze byłoby dograć tę bibliotekę, by czas resetu był parametrem....
po skoku do Aplikacji z Bootloadera pojawia się dziwne zachowanie: zaczyna się wykonywać kod main() który jest przerwany i widzę w debugerze wykonywanie konstruktorów obiektów globalnych. Możesz pokazać jak to wygląda w debuggerze? Te konstruktory wykonują się jakby z main() czy jakby z przerwania? W Bootloaderze przed skokiem, robię __disable_irq(),...
Witajcie, Mam problem ze zmianą polaryzacji wyjścia timer w locie. Sprawa wygląda tak. Mam dwa timer jeden (TIM1 na CH1) generuje PWM o dużej częst. a drugi (TIM7) zlicza czas w dół i następnie w przerwaniu zmienia polaryzację wyjścia PWM TIM1. Niestety pojawia się wtedy flaga UIF w rejestrze SR, co powoduje przeładowanie TIM1 i wtedy na krótki czas...
Witajcie, Wysyłam sobie w moim małym projekcie, 4*16 bitów przez SPI, w użyciem DMA. Funkcja inicjująca wysyłanie wygląda tak [syntax=c] void display_set_raster_line(uint16_t * raster_line) { // wait for transfer complete if (SPI_FIRST_TRANSFER_DONE) { while( DMA1->ISR & DMA1_FLAG_TC3 == RESET) { } } // copy new raster to current raster line...
Witam, Po inicjalizacji timera i przed jego włączeniem przeładuj timer (zapisz bit UG do rejestru EGR),a następnie wyczyść flagę w Status Register (TIM4->SR &=~TIM_IT_Update). Dopiero po tych czynnościach włącz timer - przerwanie powinno przyjść dopiero po odmierzonym czasie.
Proponuje zapoznać się z dokumentacją ST jak poprawnie wykonać obsługę RS485 dla stm32 W proponowanym rozwiązaniu ST wykorzystuje flagę TC transmit complete. Czyli po prawidłowym wysłaniu bajtu wywoływane jest przerwanie, po ostatnim bajcie przełączasz RS485 w tryb odbioru, bez obliczania późnień itp. :D
Na pierwszy rzut oka w przerwaniu nie sprawdzasz flagi ani jej nie kasujesz... A także nie włączasz systemu NVIC i go nie konfigurujesz...
Witajcie, moją przygodę z STM32 zacząłem stosunkowo niedawno, praktycznie od samego początku staram się stworzyć "protokół" do bezawaryjnej komunikacji po USARcie, który wykorzystany będzie do transmisji danych z małego robota typu LineFollower. Nie mam większej wiedzy, ani doświadczenia z tej dziedziny. Stworzyłem trochę kodu na podstawie własnych...
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
Witam ponownie, udało się uruchomić transmisję ale jedynie nadawanie. Z odbiorem jest problem. Oto mój kod: Inicjacja SPI: [syntax=c]void SPI_Conf(void) { SPI1->CR1=0; SPI1->CR1 |= (SPI_CR1_BR_1|SPI_CR1_BR_0|SPI_CR1_MSTR)... SPI1->CR2 |= SPI_CR2_SSOE; SPI1->CR2 |= (SPI_CR2_TXDMAEN|SPI_CR2_RXDMAEN); }[/syntax] Inicjacja DMA: [syntax=c]void DMA_Conf(void)...
W procedurze obsługi przerwania, na samym jej początku należy wyzerować bit UIF (Update interrupt flag) w rejestrze statusowym. TIM4->SR &= ~(TIM_SR_UIF); I powinno działać…
Problem pojawia się na mikrokontrolerze STM32F100RB, aczkolwiek wydaje mi się, że nie ma on związku z samym mikrokontrolerem. Próbuje odczytywać dane z ultradźwiękowego anemometru, który jako jedyną magistralę cyfrową posiada RS485 (ma też wyjścia analogowe). Podłączam go do mojego sterownika przy pomocy takiego konwertera: . Jest on oparty na układzie...
Może dostajesz jakieś inne przerwanie, i wtedy ten Twój IF nie wchodzi do środka i nie kasuje flagi (oraz nie miga LEDem). Kasowanie flag daj bezpośrednio bez żadnego IFa.
Nie trzeba go przekonywać. Dla DMA jest wszystko jedno pod jakie adresy mają się zapisać dane. Ale nie jest mu wszystko jedno, w jakich okolicznościach ma to robić. W przypadku UART TX, DMA request jest generowany za kazdym razem, gdy flaga TXE==1 (jesli UART ma włączony DMA oczywiscie). Wtedy DMA transferuje wartość spod adresu podanego w CMAR do...
Witam, już dobrych kilka godzin zastanawiam się, dlaczego timer 1 nie działa tak jak chcę. A chcę, poprzez poniżej przedstawione funkcje włączać żarówkę po odliczeniu przez timer na czas też odliczany przez timer. Konfiguracja timera 1: void Tim1_config(void) { RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; TIM1->CR1 |= TIM_CR1_ARPE; TIM1->CR1...
Piszę do swojego RTOSa driver dla SPI używający DMA. W rozważaniach ograniczmy się do STM32F0, ale ogólnie rozchodzi mi się o wszystkie układy STM32 które mają SPI wyposażone w FIFO _ORAZ_ DMA które FIFO nie ma (czyli najgorsza możliwa kombinacja). Generalnie wszystko jest w miarę proste i logiczne, ale zastanawiam się nad obsługą błędów, a konkretnie...
Proponuję Ci zerknąć na ten kod - https://github.com/DISTORTEC/distortos/b... - robi dokładnie to co chcesz osiągnąć i w dokładnie ten sam sposób. Tutaj kod przerwania - https://github.com/DISTORTEC/distortos/b...
Flagi zeruj bezpośrednio po sprintf - wtedy dane w zmiennych nie są już potrzebne i można je zmienić. Dłuższe czekanie może powodować, że w momencie przyjścia przerwania flagi są ciągle ustawione - i gubisz dane. Dość łatwo to wykryć programowo, więc możesz sprawdzić czy taka sytuacja ma miejsce.
Wcześniej użyłem volatile bo chciałem wymusić odczyt tych tablic za każdym razem z pamięci FLASH. A nie z jakiegoś rejestru gdzie wartość mogła by zostać zapamiętana. W tym celu, żeby po przeprogramowaniu pamięci, program na pewno operował na nowych wartościach. Ale mam rozumieć że w tym wypadku volatile nie pełni roli wymuszenia każdorazowego dostępu,...
Zastanawiam się tylko po co sprawdzać to: [syntax=c]USART3 -> CR1 & USART_CR1_TCIE[/syntax] nie rozumiem powodu. Przecież to jest "This bit is set and cleared by software." Programista nie wie czy ustawił to przerwanie czy nie? Dodatkowo ten zapis: [syntax=c]if(( USART3 -> CR1 & USART_CR1_TCIE) && (USART3 -> SR & USART_SR_TC ))[/syntax] wygląda dość...
Ustawienie alarmów: HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); if(MAX_SAFE_ALARM_TIME_SEC<sec... sec = MAX_SAFE_ALARM_TIME_SEC; if(MIN_SAFE_ALARM_TIME_SEC>sec... sec = MAX_SAFE_ALARM_TIME_SEC; /**Enable the Alarm A */ uint8_t overflowSec = 0; uint8_t overflowMin = 0; sAlarm.AlarmTime.Seconds = (sTime.Seconds...
Tablicami NVIC się nie przejmuj. Korzystaj z funkcji dostarczonych przez CMSIS, w tym przypadku nie warto stosować rejestrów wprost. Konfiguracja Timera OK, choć kolejność nie należy do poprawnych. Przyjrzyj się jeszcze rejestrowi EGR. Przerwanie? Brak kasowania flagi skutkuje ciągłym jego wywoływaniem. Flagę kasuje się na początku przerwania. I taka...
Prawidłowe kasowanie flagi w przerwaniu: TIM3->SR = ~TIM_SR_UIF; Prawidłowe używanie rejestrów BSRR: GPIOC->BSRR = GPIO_BSRR_BR13; Piszesz że "NVIC_EnableIRQ(TIM3_IRQn);" zawiesza układ. Używasz debuggera czy wnioskujesz to po tym, że nie zapala się żadna dioda? Jeśli używasz debuggera, to raczej powinieneś widzieć na czym dokładnie się zawiesza. Jeśli...
wychodzi mi jakieś 8 8 cykli to zajmuje pierwsza linijka <; wejście do przerwania to następne kilkanaście + wyjście. Sugerujesz bitbanding dla kasowania flagi przerwania? No przecież właśnie o to chodzi - żebyś nie musiał odczytywać, modyfikować i zapisywać z powrotem. Czyli twiedzisz że 6*10kHz takich przerwań to dla tego procesora pikuś i nie...
sprawdź w dokumentacji czy aby po zresetowaniu flagi przerwania timera nie trzeba odczekać kilka instrukcji (2-3 NOP'y). Jeżeli tak jest, to w przeciwnym wypadku zaraz po wyjściu przerwanie otworzy się drugi raz i w tej sposób dioda mrugnie tak że tego nie zauważysz. Możesz to sprawdzić tak że diodę ustawisz na zapłoną (a nie stan przeciwny), to po...
Witam, Jestem poczatkujacy jesli chodzi o programowanie pod architekture Cortex. Posiadam zestaw ewaluacyjny STM32 Butterfly. Probuje skonfigurowac przerwanie, aby wykonało się po naciśnięciu przycisku. Debugujac program widac, ze po nacisnieciu przycisku flagi sa ustawiane, ale funkcja obslugujaca przerwanie nie jest wywolywana. tak wyglada moj kod...
1. Deinicjalizujesz RCC, PLL i pozostałe zegary 2. Resetujesz i wyłączasz Systick 3. Wyłączasz przerwania wcześniej zerując flagi 4. Ustawiasz wskaźnik stosu na początek pamięci bootloadera 4. Skaczesz do adresu pamięci bootloadera +4 Wszystko jest analogiczne do poniższego przykładu dla F4: https://stm32f4-discovery.net/2017/04/tu...
Witam, mam problem z zawieszaniem się freeRTOSa. Program grzęźnie w funkcji vListInsert void vTaskUSART3(void * pvParameters) { portCHAR i; vSemaphoreCreateBinary( xSemaphore_US3_O ); xSemaphoreTake( xSemaphore_US3_O, 0); xQueue3_TX = xQueueCreate( 32, sizeof( portCHAR ) );//32 xQueue3_RX = xQueueCreate(...
Moim zdaniem konfiguracja DMA jest trochę niepełna, a ponadto brakuje obsługi przerwania od DMA. Przynajmniej w jednym miejscu wpisz jawnie wartość do rejestru sterującego (CR = ...). Na razie wszędzie masz |= lub &=. Zakładając, że pierwszy transfer poleci i przerzucisz 19200 słów, to później DMA się zatrzyma i nic więcej nie prześle. I jak to ma coś...
Może wbiję kij w mrowisko: Po co właściwie Ci ten bitbanding? Wyjmę kij z mrowiska i odrzucę - świat nie składa się tylko z jednowątkowych programików, a w mikrokontrolerach zwykle trzeba zrobić więcej niż machanie GPIO i kasowanie flag przerwań.
Profilaktycznie możesz spróbować procedury zatrzymywania DMA z układów STM32 mających bardziej rozbudowane DMA (np. F4). Sprowadza się ona do tego, że po wyzerowaniu EN musisz go w pętli odczytywać do momentu aż odczytasz tam faktycznie zero. Może coś pomoże, może nie. Zadbałbym też o czyszczenie wszystkich flag DMA przed uruchomieniem transferu (albo...
(lub ewentualnie zignorować, tracąc minimalnie dokładność) utrata dokładności jest i tak mniejsza niż w przypadku podanym prze mnie. Jeżeli występuje prawdopodobieństwo wystąpienia wielokrotnych przepełnień bez przerwań i licznika przepełnień się nie obejdzie. Zresztą użycie flagi ma (może nie w tym przypadku jak jest to robione raz na godzinę) dodatkowe...
Czesc, mam taki problem, wydawalo sie na poczatku ze banalny. STM32L4, UART pracuje w trybie circular, przy starcie wywoluje HAL_UART_Receive_DMA(), wszystko ladnie dziala do momentu kiedy wystapi blad transmisji. Gdy wystapi blad to w standardowym handlerze zwiekszany jest licznik bledow i w innym watku porownywany jest stan licznika i ponownie wywoloywane...
Nie chcę inkrementacji. Wysyłam cały czas tą samą zmienną kilkukrotnie z jednej lokalizacji pamięci. W przerwaniu jest przeliczana na inną wartość w taki sposób: Ok. Niemniej jednak skopiowałem ten kod z #8 do CubeIDE 1.5.0, zrobiłem parę korekt pod moje PCB, dokonałem poprawnej implementacji flagi BUSY i wszytko działa jak powinno z inkrementacją...
(at)atom1477 zmienilem na rowne czyli na PA0 i dziala, ale jak dobrze rozumiem EXTICR powoduje mi ze moge to przerwanie spowodowac z np PORTU B (pin 0), czyli jak wpisze 1 na zerowym bicie, czyli (1<<0) to będzie odpowiadalo PB0. No i wgrywam program i klikam PB0 to nic, a jak klikne PA0 to zmienia stan LED-a, czyli jakby ten rejestr EXTICR wwgl...
Ja to sobie podzieliłem na równe wymierne części, to tylko taki przykład z tym 0xFFFF. Odbieraniem zajmuje się właśnie DCMI, po wywołaniu "DCMI->CR |= DCMI_CR_CAPTURE;" wszystkie dane po kolei są przejmowane na rejestr danych w DCMI. Bez wykasowania flagi CTCIF7 program zostaje na zawsze w przerwaniu. Jak u Ciebie wyzwalany jest odbiór danych ? DMA...
No tak: [syntax=c] /************************* * stm32 uart main.c *************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "stdint.h" #include "misc.h" #define CLK_FREQ 36000000 /* User defined function prototypes */ void GPIOA_Init(void);...
https://obrazki.elektroda.pl/4950580000_... Witajcie moi drodzy W tym temacie poznamy podstawy przerwań i timerów w PIC18F2550 . Na początek będzie krótki wstęp teoretyczny, a potem wszystko przerobimy dokładnie na praktycznych przykładach. Do lektury tematu przyda się ogólna wiedza na temat przerwań i programowania w C, choćby taka...
Detekcja flagi nie jest problemem. Kombinowalem z tym na różne sposoby. Pytanie dlaczego po czwartym bajcie wzbudza się przerwanie z częstotliwością ok 700kHz. Wygląda jakby przerwanie nie kasowało flagi ale żadna flaga nie jest ustawiona. Pracuje pod debugiem pod pełnym JTAG. Moze mam stara rewizję proca jedna z pierwszych z jakimś błędem, plyta Eval...
Kod: [syntax=c] /************************* * stm32 uart main.c *************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "stdint.h" #include "misc.h" #define CLK_FREQ 36000000 /* User defined function prototypes */ void GPIOA_Init(void);...
Tak, Freddie Chopin ma rację, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIO... oraz configMAX_SYSCALL_INTERRUPT_PRIORITY powinny być spójne, ponieważ odnoszą się do tego samego lecz różnią się przesunięciem bitowym w celu stosowania tych flag w funkcjach bibliotecznych lub bezpośrednio w rejestrach.
1. Jaka jest różnica między tymi dwoma zapisami, czy dobrze to rozumiem? TIM3->SR &=~TIM_SR_UIF; (tu zerujemy?) Powinno być: TIM3->SR =~TIM_SR_UIF; (tu rozumiem,że zmienia stan na przeciwny?) efekt powinien być w tym wypadku ten sam. Różnica opisana jest w RM, w którym opisana jest sekwencja zerowania bitów rejstru SR timerów. Zapisanie zera kasuje...
Skoro hardfault występuje przy kompilacji z -O0 to znaczy że jednak występuje, a ty tylko znalazłeś obejście problemu. Flagi przerwan w EXTI trzeba gasić ręcznie. Jesli tego nie zrobisz, będziesz w stanie permanentnego przerwania...
Choć dopiero zaczynam przygodę z STM32 to po mojemu nadpisujesz strukturę i dlatego zawsze działa Ci ostatnie zdefiniowane przerwanie. O ile przed napisanie jest funkcja inicjująca przerwanie nic takiego nie ma miejsca. Prędzej brak kasowania flag.
Wejdzie i wyjdzie po prostu. Nie wiem jak jest w STM, ale w niektórych prockach magistrala się może zawiesić jeśli nie odczytasz jakichś flag, ale sam IRQ tak napisany nic zwyczajnie nie zrobi. I zawsze wejdzie do tej funkcji, na tym polega przerwanie, a skoro nic w niej nie ma - to też zawsze wyjdzie bo nie ma na czym się zawiesić.
Jak już się upierasz przy "flagach", to może konsekwentnie również je "kliruj" i "setuj". ;) Ja wolę ustawiać znaczniki niż "setować flagi". Flagi to się raczej wywiesza, zwłaszcza o tej porze roku. Jak działa SR timera w STM32 - to dokładnie wiadomo - "w0c". żadna filozofia tego nie zmieni, a operacja &= skutkuje błędami, jeśli oprogramowanie ma reagować...
I2C jest rygorystyczne czasowo. Inne przerwania mogą powodować błędy. Zrobić I2C na przerwaniach o najwyższym priorytecie. Uchronić przed błędami powstałymi z HOR-PLUG. Np cykliczne pytanie i resetowanie I2C po konfiguracji sprawdzenie flag oraz stanu pinów.
Temat można potraktować jako zamknięty. Problem polegał na tym, ze flagi od przerwania odbioru USART co prawda były kasowane automatycznie, ale zanim zostały skasowane przychodziło już nowe przerwanie... Dodatkowo CLK na USART2 był uruchamiany dwa razy i jak się okazało ma to duży wpływ na pracę tego ukłądu. Dlaczego? nie wiem ...
Raczej tak, wykorzystałem fragment programu, który jest sprawdzony. Użyłem Timera2 i zrobiłem dokładnie to samo co Ty czyli pętla while czekająca na wyzerowanie flagi. Nigdy program nie wyszedł z tej pętli chociaż program wchodził do przerwania bo sprawdzałem. Naprawdę nie umiem tego wyjaśnić.
Wg. mnie jeśli ustawiasz SWSTART to nie potrzebujesz tego EXTSEL, a tak na marginesie to EXTEN odpowiada za zbocza. A teraz wiem, nie masz ustawionej flagi EOCIE w CR1 i nie generuje ci przerwania. PS. Nie musisz włączać i wyłaczać ADC wystarczy że po konwersji skasujesz flagi STRS i EOC, i przed następną konwersją robisz SWSTART.
Jeśli podczas zapisu do flash układ próbuje odczytać coś z flash, rdzeń zostanie zatrzymany do momentu zakończenia zapisu . Nie ma więc czegoś takiego, że zostanie zatrzymany (czy to przez następne instrukcje w funkcji dokonującej zapisu - np. sprawdzenie flagi czy zapis się już zakończył - czy przez przerwanie, czy przez cokolwiek innego), ale jak...
Na Elektrodzie było mnóstwo sporów w temacie używania bibliotek i rejestrów, więc nie chcę rozpętywać kolejnego. Moim zdaniem powód by używać HAL, to właśnie CubeMX - generator kodu, który pozwala w miarę szybko wystartować. Niestety, szybko się okazuje, że bez dokumentacji sprzętu nie można się obejść, bo trzeba zrozumieć budowę peryferiów, działanie...
Witam ponownie udało mi się uruchomić ADC błąd polegał na tym, że pomiaru dokonywałem w przerwaniu od Timera i za nim dochodziło do konfiguracji ADC wykonywane było to przerwanie, w którym miałem ustawianie bitu ADCstart, który nie pozwalał na późniejsze przejście kalibracji podczas konfiguracji ADC. Mam teraz inny problem otóż chciałbym dokonać pomiaru...
Jeśli chcesz uzyskać minimalny narzut czasu procesora na obsługę wyświetlacza - w ogóle nie czytaj znacznika BUSY, bo jego wyzerowanie nie oznacza gotowości. Obsługuj wyświetlacz w przerwaniu timera. Jakiś czas temu obsługa HD44780 na STM32 w przerwaniu timera była pokazana w EP. A pierwszy błąd w Twoim kodzie jest tu: LCD_EN_bb=0; LCD_EN_bb=1; - wymagany...
Samo to nie jest może powodem błędu, który obserwujesz, Pewnie jest. Przerwanie -> skasowanie flagi -> prinf po uarcie W trakcie tego kolejne przerwanie -> skasowanie flagi -> prinf po uarcie ..... stos się przeełnia i sterta kończy (o ile ta implementacja go używa) natychmiast. i do tego dodatkowo - printf - nie reentrant Cała filozofia. Sory, jeżeli...
To akurat przyszło mi do głowy, chodziło mi o dostęp przez tą funkcję nieszczęsną :) Jeszcze raz dzięki za zainteresowanie :) teraz wszystko śmiga :D Tak swoją drogą nie jest ustawiana flaga CAN_RxRdy w obsłudze przerwania odbioru. Dwubitowy rejestr CAN_RF0R_FMP0 ustawiany jest tylko na młodszym bicie, ale ten kod[syntax=cpp]while(CAN1->RF0R & CAN_RF0R_FMP0)...
Moglby kolega przedstawic przykladowe zalety stosowania systemu na mikromotrolerze? Co to praktycznie daje by zachecic niskopoziomowcow do stosowania takich rozwiazan. źle zadanie pytanie, niskopoziomowiec a zastosowanie RTOSa to lekko odmienne kwestie. Szkoda tylko ze ten przykład napisano w egzotycznym środowisku i nadal z SPLem. Czyszczenie flagi...
flaga przerwać stm32 flaga stm32 przerwać przerwać
zamiennik tda7560 zbiornik wyrównawczy ciśnieniowy linde silnik jazdy
panel solarny pompka panel solarny pompka
Radio Honda HR-V 2016 nie wyświetla klawiatury kodu Jak podłączyć stojan ukośnicy MacAllister 210?