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".
choć myślałem, że kiedy nie ruszam niczego co ma związek z CC to on nie porównuje.. To źle myślisz. Włączenie CC to tak naprawdę włączenie tego co dalej. Czyli sterowania kierunkiem liczenia reakcje wyjścia OC itp itd. Porównanie działa nawet gdy CC jest wyłączone.
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
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!!
Zerowanie flagi na końcu przerwania - niedopuszczalne
- 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ć...
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...
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...
No właśnie. Czy w ogóle coś takiego istnieje? Teoretycznie wg reference manual jak najbardziej. Można ustawić zezwolenie na przerwanie (RTC_CR_WUTIE) i skasować flagę (RTC_ISR_WUTWF). Przerwanie teoretycznie powinno być podpięte pod "RTC_IRQn", ale de facto nie jest realizowane. Można za pomocą tego zdarzenia wybudzić procesor, ale nigdy nie udało mi...
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?
Zrobiłem kiedyś program pracujący na 8 timerach na przerwaniach, praktycznie cały program w przerwaniach generowanych przez timery nawet do 50kHz. Na szczęście kody w przerwaniach nie były długie (dekrementacja zmiennej x, sprawdzanie czy ==0 i jeżeli tak, ustawianie odpowiedniego bitu w zmiennej y) i procesor się wyrabiał. Ale na początku były problemy...
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.
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...
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...
Racja, w F1 jest jedynie flaga IDLE ktora moze się przydać. Jej procedura czyszczenia jest jedynie trochę dziwna.
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...
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...
Podejrzewam że dlatego ze pierwszy raz kiedy biblioteka HAL wywołuję UG dla przeładowania rejestru prescallera, a drugi raz kiedy timer doliczy do odpowiedniej wartości. Ale pisze to nie patrząc na HAL-a. Tak ze po prostu przed właczeniem przerwania wyczyść flagę.
Zrób to bez delay() a będzie dobrze ;-) Ja, wpisuję dane wtedy gdy host odbierze poprzednie. Sygnalizuje to przerwaniem lub flagą. Albert
A nie ma od tej flagi jakiegoś przerwania ?
Witam, Pracuje nad kodem programu do komunikacji przez UART (mikrokontroler <-> komputer) i zastanawiam się nad sposobem implementacji w przerwaniach. Na razie zrobiłem to w taki sposób: - Nadawanie danych wykonuje w taki sposób, że w programie głównym zmieniam w wskaźniku adres początku tablicy którą aktualnie przesyłam przez UART, w przerwaniu...
Nie do końca kumam problem - jeśli chodzi Ci o to, że flaga jest jedna, to w czym problem żeby czyścić ją po zrobieniu iluś-tam zadań dopiero? Jeśli zaś o to, że gdy umieścisz wszystko w przerwaniu to wtedy niewiele tam zmieścisz (jedno zadanie) to już jest kwestia architektury programu. Generalnie trzeba tu pogodzić sprzeczności - przerwania powinny...
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....
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.
Jak już się upierasz przy "flagach", flagi używa się w języku informatycznym od lat - np flagi procesora. Pola znacznikowe przynajmniej mi się bardziej kojarzy ze znacznikami w Adzie albo Pascalu.
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…
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...
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...
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, 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 ) {...
Nie, nie możesz (przynajmniej nie powinieneś). Nie blokuj przerwania od odbioru w ten sposób. Użyj flagi i wykonaj ten kod w mainie. Pokaż inicjalizację USART2. Zrobiłem z flaga i wysyłanie w mainie. W ten sposób że w przerwnaiu odbioru od usart2 ustawiam: flagaS=1; Natomiast w mainie: if(flagaS==1) { //test usart2 flagaS=0; send_frame_USART2(); }...
W sumie to mam pytanie czy dobrze rozumiem jak to ma działać. Tak skonfigurowany DMA wykonuje transfer raz, w momencie ustawienia bitu ENABLE. Kod z moimi komentarzami (wypisane z DSa). [syntax=c] void DMA_Conf(void) { RCC->AHBENR = RCC_AHBENR_DMA1EN; /* Procedura konfiguracji kanałów DMA 1. Ustawić adres rejestru peryferiów w rejestrze DMA_CPARx Dane...
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 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...
Czy proponujesz zatem taki zapis: ... Jeśli w tym rejestrze wcześniej jest coś co chcesz zachować to może zostać, ja proponuje użyć operacji przypisania "=" zamiast sumy bitowej "|=" - używając sumy zakładasz że wcześniej jest tam "znana wartość", co niekoniecznie jest prawdą i czasem można się nieźle przejechać na takim założeniu... Widocznie przekroczenie...
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...
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,...
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...
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.
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...
Witam, chciał bym prosić o rade szanownych kolegów mianowicie nie mogę uruchomić nadawania modułem nrf24l01 z pełną szybkością z użyciem przerwań od pinu "IRQ" już wyjaśniam, w trybie polingu nadawanie pakietu 32 Bajtów trwa 156us i wszystko ładnie śmiga odbieranie udało mi się uruchomić z wykorzystaniem przerwań oraz DMA, lecz gdy próbuje wysyłać za...
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...
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...
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ą...
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...
oczywiście wspomogło, ta biblioteka jest małokorzystna (albo raczej korzystający z niej :D) a jeszcze pytanko małe , ustawiam sobie tą flagę: volatile bool flag_ADC ; w przerwaniu od ADC, i później w pętli głównej coś takiego: [syntax=cpp] if (flag_ADC == 1) {//GPIOC->ODR ^= GPIO_Pin_9; // ADC1ConvertedValue = ADC1->DR; sprintf(buf, "wart ADC: %u",...
Na pewno dobrze skonfigurowałem UARTy, dane odbieram Tak więc jest to kwestia DMA. Piotrus_999 czy masz na myśli flagę przerwania w DMA?
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.
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...
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...
Złą flagę czyścisz w przerwaniu (13 ≠ 1) ;)
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))...
Witam, Mam problem z uzyskaniem dokładnego czasu z timera. To mój kod: [syntax=c] #include "stm32f407xx.h" int main(void){ // flash //FLASH -> ACR |= FLASH_ACR_DCRST | FLASH_ACR_ICRST; FLASH -> ACR = FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_5WS; //while((FLASH -> ACR & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_5WS);...
Natomiast, co trochę zbija mnie z tropu, po wyjściu z przerwania flaga ta jest z powrotem zresetowana, tj. poza przerwaniem zmienna ponownie ma wartość 0. Jaka może być tego przyczyna? Po wyjściu z przerwania EXTI zapewne od razu wykonywane jest przerwanie od timera (on w końcu cały czas chodzi w tle), w którym czyścisz tą flagę. Przerwania mogą być...
Oczywiście to od DCMI ma wyższy priorytet niż to od DMA. Próbowałem też na równoważnych ale nic to nie zmienia. Najbardziej dziwi mnie fakt że występują przerwania mimo wcześniejszego kasowania flag. Tak jakby DMA działało mimo że już żadne żądania transferu się nie pojawiają (DCMI podczas trwania impulsu synchronizacji nie powinno niczego wysyłać)....
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ę....
[syntax=c]//============================... // TIM3 Interrupt Handler //======================================... void TIM3_IRQHandler(void){ if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set { TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag } }[/syntax] AND zbyteczny az prosi...
Mozę powtórzę, bo nie lubię patrzyć jak ktoś traci czas - wszystkie porady sugerujące że problemem jest 8-/16-/32-bitowy dostęp do rejestru DR lub jakieś nieistniejące w tym układzie FIFO są po prostu błędne. Jeśli bez optymalizacji ruszyło, to powód jest dokładnie taki jak w słynnym przypadku timerów - to co kasuje flagę (zapis do DR) jest zbyt blisko...
Trochę pogrzebałem i znalazłem przyczynę. Kluczowa była flaga IDLE okazało się że po resecie UART nie jest w stanie IDLE nawet jak nic nie szło i wtedy trochę pogrzebałem i odkryłem że mam błąd. Problem polegał na tym że robiłem OR-a żeby skonfigurować port w odpowiedni tryb a zapomniałem że rejestr GPIOx-CRx nie ma 0 po resecie tylko 0x44444444 ale...
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...
Wyglądałoby to tak, że potrzeba trochę czasu, od ustawienia flagi RXNE do przepisania bajtu z rejestru szeregowego do DR. Jak od razu czytasz, to dane są błędne (poprzedni bajt?). Ale czy tak jest w istocie , to nie dam głowy - ja akurat zrobiłem obsługę SPI na przerwaniach i tam nie musiałem sprawdzać tych flag. W sumie to byłoby bez sensu, bo po co...
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)...
Jeśli chodzi o zasoby to STM32F4 ma raczej wystarczające (196kB RAMu i 1MB Flashu). Czy w RTOSach są takie przerwania, które mógłby realizować jakieś zadanie praktycznie bezzwłocznie? Ja wolałbym uniknąć używania RTOSa i zostać przy flagach oraz przerwaniach, ale chciałbym się też dowiedzieć jak się powinno podejść do tego problemu by rozwiązać go profesjonalnie.
Wyłączenie przerwania przed załadowaniem ostatniej danej gwarantuje, że niezależnie od okoliczności nie nastąpi zgłoszenie przerwania TXE. Jeżeli najpierw załadujesz, a potem wyłączysz, to po załadowaniu wskutek działania FIFO lub z powodu innego przerwania nadajnik może zgłosić przerwanie TXE przed jego wyłączeniem i wtedy jeszcze raz wejdziesz w obsługę...
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...
Witam, Mam urządzenie z którym chciałbym się skomunikować. Za pomocą Realterm wysyłam do urządzenia 3 znaki: /#1 i urządzenie odpowiada całą paczką danych. Przepięcie linii USB/RS232TTL do mikrokontrolera sprawiła mi jak zwykle kłopot. A mianowicie wysyłam do urządzenia te 3 znaki z STM32 natomiast urządzenie nie odpowiada.... Może mi ktoś powie jak...
Samo się zapamiętuje - przerwanie zgłoszone jest "zgłoszone" dopóki go nie obsłużysz (albo ręcznie nie "skasujesz"), wcale nie musi być wciąż "fizycznie" w jakimś stanie. Ok, jakas flaga sie pojawia, ale jesli obsluguje takie z wyzszym priorytetem, to nizsze czeka. To nizsze niech bedzie czujnikiem zalania. Wody przybywa, czujnik ciagle to sygnalizuje,...
Po 5 latach chyba kolega sobie poradził:) Temat do zamknięcia. PS.Do sterowania nadajnikiem MAX3485 w STM32 kluczem jest poszukanie w RMie informacji o fladze TC a następnie programowe sterowanie odpowiedniego GPIO w przerwaniu od UARTu.
Pomóżcie, bo nie mogę doczytać, jak się kasuje flagę przerwania od output compare match w ISR? (...) W dokumentacji stm32 zapomnieli napisać czy 0 czy 1 Npalisali :) kasuje się na pewno poprzez zapisanie bitu zerem. Przy opisie rejestru masz zawsze odpowiedni "komentarz" przy każdym bicie. W tym przypadku rc_w0. read/clear (rc_w0) Software can read...
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...
Witam. Dla ćwiczebności napisałem sobie funkcję zwracającą ilość cykli zegara w celu pomiaru długości wykonywania funkcji itp. Aby to osiągnąć odczytuję "PENDSTSET" oraz stan licznika SysTick. Jednak pomiędzy tymi dwoma odczytami upływa trochę czasu i wartość licznika jestem w stanie skorygować znając czas jaki upłynął miedzy tymi dwoma instrukcjami...
Witam, Mam STM32F103 i MCP3202. Próbuje nawiązać komunikacje bezskutecznie. Kofiguracja: [syntax=c]volatile char SPI_InUse=0; volatile char Nof_Bytes_To_TxRx=0; volatile char RxBuf[2]; volatile char TxBuf[2]; volatile char TxIdx=0; volatile char RxIdx=0; int main(void) { Clock_init() ; GPIO_init(); NVIC_init(); SPI_init(); SysTick_init(); while(1){}...
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...
Temat był już poruszany ale zmuszony jestem go odświeżyć ze względu na USART w trybie SmartCard. Kod inicjalizacji DMA Celem jest wysłanie 5 bajtów i złapanie w przerwaniu USART Transfer Complete momentu wysłania ostatniego piątego bajtu - już po wysłaniu go z wewnętrznego Shift Reg Uzyskuję to: http://obrazki.elektroda.pl/3790337700_1...
W zasadzie we wszystkich przykładach wykorzystania przerwania z UARTA nie było nigdzie czyszczenia flagi, więc założyłem, że jej nie potrzeba... gdzieś czytałem, że flaga jest automatycznie czyszczona, ale jestem laikiem więc mogę się mylić. Wdzięczny byłbym za wszelkie wskazówki jak do tego podejść. Zamiast zgadywać, zakładać i czekać na odpowiedzi...
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(),...
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.
Problem jest taki, że natychmiast po tym jak z tego przerwania wyjdzie, to wejdzie do niego ponownie, po czym oczywiście znów wyjdzie, jednak zaraz po tym kolejny raz do niego wejdzie, a następnie oczywiście... Problem taki nie dotyczy tylko kilku przerwań, które nie mają przyporządkowanych żadnych flag które się kasuje albo wprost, albo jakąś sekwencją operacji...
Wydaje mi się, że zwykła kolejka FIFO spełni swoje zadanie. Kiedyś napisałem coś takiego: fqueue.h [syntax=c] #include <stdint.h> #include <stdbool.h> /**(at)briefWykonuje inkrementacje modulo. * (at)param__val liczba do inkrementacji * (at)param__mod modulo inkrementacji*/ #define INCREMENT_CYCLIC(__val, __mod)do { \ __val =(__val) <...
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)...
Albo napisać to to tak, żeby w przerwaniu ustawiać tylko flagę "nowe dane do wpisu pod", przychodzące w przerwaniu dane buforować a update robić w pętli głównej...
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...
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);...
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]...
Portuję system Contiki na STM32F303 i natknąłem się na problem z brakiem linkowania handlerów przerwań. Ponieważ interesuje mnie obsługa modułu radiowego SPIRIT1, portowanie sprowadziło się do skopiowania katalogu platform/stm32nucleo-spirit1 oraz katalogu cpu/arm/stm32l152 do platform/stm32elnix oraz cpu/arm/stm32f303 i zmodyfikowania znajdującego...
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.
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...
Poprawiłem formatowanie kodu. Dodano po 1 Niby jaki odstęp pomiędzy bajtami ma dawać taka pętla? Potrzebujesz odstępu czasowego - użyj przerwania timera. Odstęp czasowy narazie realizuję blokującym whilem, później być może przerobię to na przerwania timera. Przed wysyłką 8 bajtów z prędkością 115200 wysyłam jeden bajt z prędkością 9600 Zrobiłem trochę...
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ść...
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ń.
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...
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...
Witam, przepraszam że nie odpisywałem ,ale musiałem zająć się chwilowo innym projektem. Ale wracając już do tego. Otóz właśnie nie do końca , trochu kolega źle zrozumiał mój poprzedni post ale to tylko dla tego że moja zdolność wypowiedzi w języku polskim jest tragiczna. Otóż już postaram się wytłumaczyć o co mi chodziło. Jeśli robię coś takiego( czyli...
No właśnie o priorytetach wiem, 15 top najniższy dlatego wszystkie przerwania mają Dodano po 2 Niestety zwiększenie do 4kB stosów (Stack Configuration i Heap Configuration) w niczym nie pomogło, program wchodzi do przerwania i zawiesza się przy sprawdzaniu flagi. Jak nie sprawdzam flagi to wszystko działa. Wychodzi na to, że musiałbym na te 4 klawisze...
Ok, dzięki. Chodziło mi o to, czy bit USART_SR_RXNE jest flagą przerwania, czy też jest gdzieś inna flaga dla przerwania. Bit ten jest opisany jako "Read data register not empty" i nie miałem pewności czy nie ma jeszcze innej, osobnej flagi specjalnie dla przerwania. Ale wynika z tego że nie. Czyli w przerwaniu wystarczy odczytać rejestr DR.
Dane nadaję w postaci paczki, kod ASCII litery P, potem 3 bajty prędkości, po czym bajt z kodem litery K. W programie testowałem również czy nadając daną wartość odczytuję ją poprawnie, dla każdego bajtu tak było. Wydaje mi się, że to nie tu tkwi problem, jednak mimo to załączam kod obsługi przerwania od UART1: [syntax=cpp] void USART1_IRQHandler(void)...
Nie zauważyłem żadnych istotnych różnic w konfiguracji Twojego timera. Jak widzę, kasowanie flag też masz na końcu procedury obsługi. Właśnie przetestowałem u mnie:[syntax=c]TIM2->SR &= ~TIM_SR_UIF; // kasuj flagę przerwania while (TIM2->SR & TIM_SR_UIF);[/syntax]że kasowanie flagi na końcu procedury, a po nim jeszcze sprawdzenie, czy flaga się skasowała...
Dziękuję za szybką odpowiedź :). Czyli Freddie Chopin napisał że się mylę a to dokładnie tyle samo znaczą te linie w przypadku dokładnie tego procka na który ja piszę. Przez to że nie dałem mu do tego powodu rozumiem, że nie powinien zgłaszać przerwania ponieważ zmieżone wartości napięć nigdy nie przekroczyły ustawionych wartości progowych na 5 V i...
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...
flaga przerwania stm32 flaga xmega flaga przerwania
zatkany wydech blaupunkt pobór prądu umowa polsat
Wysypywanie się kawy z zaparzacza - przyczyny i rozwiązania Odcinanie pedału gazu w Skoda Octavia 2001 1.6 benzyna