W STM32 domyślnie podczas zatrzymania rdzenia timery pracują, więc podczas twojej pracy krokowej zgłaszane są setki kolejnych przerwań. Aby to zwalczyć należy w rejestrze DBGMCU->CR (w manualu DBGMCU_CR) zapalić stosowny bit dotyczący stosownego timera. Niestety nie zawsze jest to możliwe (bo aplikacja może wymagać aby timer naprawdę stale pracował...
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.
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...
Jak to zrobić: 1. włączasz przerwanie od timera w NVIC 2. Konfigurujesz timer, żeby generował jakieśtam przerwanie Odpowiedzi na pytania: 1. No bez timera raczej nie zrobisz przerwań co jakiś czas [; 2. Funkcja przerwania po prostu musi nazywać się DOKŁADNIE TAK SAMO jak jest wpisana w tablicy przerwań (zwykle CośtamCośtam_IRQHandler() ) 3. Hę? Przykłady...
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...
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
Rada praktyczna: ustaw preskaler tak, żeby podzielony zegar timera miał jakiś "okrągły" okres, np. 1, 10 lub 100 us, wtedy nie będziesz musiał pracowicie wyliczać wartości okresu timera, np. preskaler 7200 -> okres zegara 100 us; w celu uzyskania jednej sekundy ładujesz do ARR 10000-1. Twój problem, jak napisano wyżej, wynika z braku kasowania znacznika...
https://obrazki.elektroda.pl/3252078300_... Poniższy artykuł przedstawia – krok po kroku – wykonanie niewielkiego, kieszonkowego oscyloskopu cyfrowego. Nie jest on tak dobry jak zwykły warsztatowy oscyloskop, ale z drugiej strony można zabrać go niemalże wszędzie. Poza tym – nie wszystkie projekty DIY muszą mieć sens....
Po kilku godzinach program odpaliłem ..... podświetlanie się załącza dopiero po naciśnięciu kilka razy klawisza, monitor pokazuje start i numery naciśnietych klawiszy i to nie za każdym naciśnięciem. nie wiem jak "zatrzymać" dany ekran menu żeby zrealizować inna funkcje np; zmiana stanu wyjścia /* * sterownik który wykończy mnie i innych ..............
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...
Co do propozycji timera to masz na myśli, żeby uruchomić timer, który jak widzę jest na schemacie niżej(a dokładnie parę multipleksowanych): https://obrazki.elektroda.pl/6873035400_... On zaczyna liczyć z częstotliwością powiedzmy 100 cykli na sekundę, po doliczeniu generuje przerwanie i robi pomiar przetwornikiem ADC? Tylko właśnie...
Witam! Raczkuje z stm32 i próbuje ustawić przerwanie od przycisku, które da jakiś efekt na wyświetlaczu 16x2 (np zmieni napis kiedy przycisk będzie przyciśnięty). Ustawiłem przerwanie od timera reagujące na stan wysoki i niski portu PB1 (TIM3_CH4) i port PD2, do którego podpiąłem diodę led, która miała by gasnąć i zapalać się po naciśnięciu lub puszczeniu...
Nie można by. Zrób sobie przerwanie od timera albo dołóż filtry RC na wejściu albo wyłączaj przerwanie po jego złapaniu i włączaj timeout (na przerwaniu od timera), który go ponownie włączy za chwilę. 4\/3!!
(at)natrov Musisz zacząć od skasowania tego co masz i napisania tego programu od nowa :) Przede wszystkim podbdź się wszelkich opóźnień, od tego są timery. Ustal sobie co ile ma być przerwanie i w jego handlerze steruj silnikami, w sposb nieblokujący. Tzn. jeśli masz odczekać jakiś czas to użyj wielokrotności okresu przerwań timera i co odpowiednie...
Przyciski "floating" - czyli pryz zwolnionym przycisku mamy losowy stan wejścia z możliwymi oscylacjami. W dodatku używasz przerwań od przycisków, o których co tydzień tu piszę, że to nie jest dobry sposób na przyciski. Ignorowania drgań ani śladu w oprogramowaniu. To chyba nie ma prawa działać. Zacznij od przerwania timera - tam testuj stan przycisku...
Niech samplowaniem zajmie się lepiej przerwanie od timera i tak jak wspomniał Albert z odpowiednią częstotliwością. Próbki z jaką częstotliwością przygotowane ?
Witam, próbuje znaleźć dobry sposób na pomiar amplitudy impulsu PWM. Zakres zmian wypełnienia 5 % do 95 %. Czestotliwosc sygnalu sie nie zmienia i wynosi 1 KHz. Mój pomysł polega na tym, że po wychwyceniu zbocza narastajacego odpalam ( w przerwaniu od input capture) timer ktory co 10 us ( 5 % z 1 ms to 50 us) trigeruje pomiar ADC poprzez DMA (czyli...
gaskoin, ale piszemy o różnych rzeczach. Czym innym jest struktura procesora a czym innym struktura wiedzy czy nabywania wiedzy o nim. Instrukcja obsługi nie musi mieć struktury procesora. Przytoczony fragment: "The timer clock frequencies are automatically fixed by hardware. There are two cases: 1. if the APB prescaler is 1, the timer clock frequencies...
Podłączenie przez kondensator faktycznie pomaga, jednak jest to sygnał który zmienia się ~200 razy na sekundę, dlatego niestety odpada. Swoją drogą jakim cudem na czujniku szczelinowym są drgania "styków" ( tam nie ma styków ). Taki sam problem miałem z czujnikiem HC-sr04 tam też przerwanie na wejściu głupiało. może problemem być to że te sygnały są...
memcpy nie ma prawa blokować jakiegokolwiek timera. To jest zwykła funkcja biblioteczna, i na pewno nie sprawdza ktory akurat timer masz włączony i również nie ma kodu aby go wyłączyć. Memcpy jest najpewniej napisany w assemblerze i został odpowiednio zoptymalizowany. Kopiowanie duzej tablicy bajtów w pętli spowoduje kopiowanie się bajtu po bajcie,...
Czy moze po prostu olac w tym momencie HAL... utawic sobie ADC, TIMER, DMA po swojemu i obslugiwac przerwanie z DMA w CH_FAST_IRQ_HANDLER (dotyczy chibios)... No właśnie (; tylko w takim wypadku chyba lepiej by mi bylo zastosowac jakis sam kernel ktory zalatwi mi same przelaczanie watkow... Np FreeRTOS. Ne wiem, po co do takiego zadania angażować RTOS,...
Wykorzystując timer 16-bitowy oraz preskaler 65535 chciałbym wywołać przerwanie co 1 minute(59,6 sekundy) i w efekcie naprzemiennie zapalać i gasić diodę: [syntax=cpp] void Clock_init(void); void GPIO_init(void); void Tim1_init(void); int main(void) { Clock_init() ; GPIO_init(); Tim1_init(); while(1){;} } void Tim1_init(void) { TIM_TimeBaseInitTypeDef...
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...
Cześć, czy ktoś z Forumowiczów trudził się z usypianiem mikrokontrolera w zadaniu Idle? Mój problem wygląda następująco: podmieniłem przerwanie dla ticku systemowego z timera SysTick na przerwanie od alarmu RTC. W Idle Hook chcę wprowadzić uC w tryb uśpienia Stop. Na moje oko uC powinien się sam wybudzić po wystąpieniu przerwania od alarmu, a nie robi...
Witam, Próbując się posiłkować reference manualem (RM0008) oraz książką "Mikrokontrolery stm32 w praktyce" próbowałem odpalić okresowe wykonywanie przerwania na TIM2 i niestety nic z tego nie wyszło. Proszę o rade gdzie szukać błedu. Wygląda to tak: Konfiguracja NVIC // Wlacz przerwanie od Timera 2 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemp...
Witam, Zacząłem niedawno zabawę z STM32 i mam problem z przerwaniami oraz timerami. Chciałem uruchomić przerwanie zewnętrzne, a dalej przerwanie od timera co np 1sek. Jednak nie działa ani jedno ani drugie, czy ktoś mógłby nakierować mnie na dobrą drogę i powiedzieć co robię źle? Przeglądałem przykładowe aplikacje jednak dalej nie potrafię tego uruchomić....
Jako że niestety, wszystkie przyklady jakie znalazłem o ustawianiu priorytetów przerwań są z wykorzystaniem funkcji bibliotecznych, a to co znalazłem jest baaardzo niepewne i dziwne, więc musze zapytać. Czy takie coś: Dodano po 19 P.S. Jak widzę domyślnie rejestry priorytetów ustawione są na 0000, więc wystarczy np. wpisać 1 na czwarty bit (lub oczywiście...
Witam, staram sie wykorzystac karte SD do przechowywania danych uzywanych przez wyswietlacz (bitmapy etc). Korzystam z biblioteki FATfs i komunikacja SPI. Aby moc tego dokonac modul FATfs korzysta z sygnalu zegarowego, ktory co 10ms bedzie wywolywal funkcje [syntax=c]disk_timerproc()[/syntax] Do cyklicznego wywolania tej powyzszej funkcji staram sie...
Nie mogę rozwiązać problemu maksymalnej częstotliwości wyzwalania przerwania od timera (Update). Timer nie wyzwala przerwania z częstotliwością większą niż ok. 400kHz. Testuje zwykłą funkcjonalność wyzwalania przerwania w momencie zakończenia zliczania do góry lub na dół (update), bez PWM. Wszystkie próby prowadzę na jednej płycie (oryginalnej). Testowałem...
To kod, który u mnie na STMF107 działa - może znajdziesz jakieś róznice... W przerwaniu mam obsługę klawiatury 4x4 + kilka liczników, ale to tutaj nieistotne, więc nie zamieszczam. [syntax=c] //--------------------------------------... // Inicjalizacja TIM2 //--------------------------------------...
Mam problem z programem w którym timer ma zliczać impulsy (zbocza opadające). Konkretnie zegar timera ma działać w rytm impulsów podawanych na piny TIM4_CH1 i TIM4_CH2, z tym, że osobno liczę impulsy z każdego kanału i generuję osobne przerwanie dla każdego kanału. Liczenie impulsów z dwóch kanałów powinno działać jednocześnie. Impulsy pochodzą od 2...
To, że ty chcesz mieć 12 mHz nie znaczy że twoje środowisko tak to zrobi. na rozkręcenie pętli trzeba dość sporo kodu i przynajmniej w domyślnym projekcie jest to jakoś tam ustawione. Startup.S system_init() tam może się odbywać ustawienie zegarów na poszczególne peryferia. I skoro chcesz mieć taktowanie rdzenia na 12MHZ przy kwarcu 12MHz to na pewno...
Witam, mam problem z poprawną konfiguracją modułu Bluetooth. Chodzi o to, że na przetwornik ADC wyzwalany timer1 podaje sygnał z GPIOB i chcę próbkować go wg ustawień timera z częstotliwością co najmniej 500Hz. Dane pobierane są z rejestru ADC przez DMA do zadeklarowanego wcześniej buforADC (unsigned short int buforADC buforTx (unsigned char buforTx[4]={0};)...
Czy aby na pewno częstotliwość przerwań od timera powinna wynosić 1kHz? Skoro masz (w teorii) 24MHz podzielone przez 24000 (preskaler), to faktycznie zegar dochodzący do samego timera będzie równy 1kHz, ale wg mnie przerwanie timera będzie co dwa jego cykle, bo timer liczy tak: 0 ... 1 (przerwanie) ... 0 ... 1 (przerwanie) ... EDIT: sekundy... normalnie...
Czyli gdzie może być problem? :)
Optymalizacja wydajności silników elektrycznych: Wyjaśnienie technik sterowania PID Kiedy przyglądamy się dronom, deskom balansującym, inteligentnym samochodom i odwróconym wahadłom, ciągle pojawia się ten termin - PID. Ale czym u licha jest PID i do czego służy? Cóż, w tym artykule stworzyłem prosty sterownik silnika, aby zagłębić się w zasadę działania...
OK, dzieki użyłem gotowca Nie używaj gotowców w takiej banalnej sytuacji. Doczytaj co to jest ten Systick. W dużym skrócie to licznik 24 bitowy - to ważna informacja, może zliczyć maksymalnie do ok. 16 mln (2 do 24). Po doliczeniu do zaprogramowanej wartości zgłasza przerwanie. Do ustawiania wartości można użyć funkcji Systick_Config(), ale najlepiej...
A rozmiar stosu ustawiłeś? To taka słynna pułapka Freddiego na początkujących. Lepiej dowiedzieć się wcześniej niż później (; 4\/3!!
Dlatego właśnie każdy z nas pisze Ci tu o dwóch buforach na dwa komplety próbek, albo o jednym o podwójnej pojemności - czytaj!!! Timer inicjuje przetwarzanie, a potem kolejne przerwanie timera lub przerwanie od zakończenia transmisji DMA z ADC inicjuje transmisję świeżych pomiarów przez UART. W tym czasie ADC już robi następne pomiary do drugiego bufora....
Cześć Chciałem odpalić timer i podłączyć do niego przerwanie ale napotkałem na pewien problem, a mianowicie konfiguruję sam Timer a następnie NVIC i po włączeniu zezwolenia na przerwanie procek skacze od razu do obsługi przerwania i już z tamtąd nie wraca. Umieściłem w obsłudze przerwania zmianę stanu pinu i wstawiłem breakpointa w main-ie zaraz po...
Mnie tam brakuje ustawienia przerwania: [syntax=c]TIM1->DIER = 0x00000001;// enable update interrupt[/syntax] Ogólnie takie coś powinno działać: [syntax=c]TIM1->CR1 = 0x00000000;// default TIM1->PSC = 0x000000FF;// set max prescaler TIM1->ARR = 0x00000FFF;// set max reload count TIM1->CCMR1= 0x00000068;// set PWM mode 1 TIM1->CCR1= 0x000000FF;// set...
1. Jeśli kierunek ma wartość 0 to to przerwanie nigdy nie jest wykonane. 2. Używanie biblioteki SPL dla potencjalnie szybkiego sygnału mija się z celem. 3. Jeszcze bardziej z celem mija się używanie Exti dla enkodera skoro STM32 ma timery z wejściami enkoderowymi.
Nie ma żadnego dodatkowego przerwania... Przecież to się opiera na zwyczajnym mechanizmie zdarzeń - żaden z obiektów synchronizacyjnych nie zmienia stanu "sam z siebie" i bez powodu, tylko to Ty go przestawiasz (zwalniając mutexa, wpisując coś do kolejki, ...). Tak więc po prostu wszystkie operacje na takich obiektach na koniec zawierają - w uproszczeniu...
jest jakaś prosta metoda na timeout ? Nie wiem jaki masz STM, ale niektóre mają sprzętowy timeout. Wystarczy w rejestrze RTOR podać po ilu nieodebranych znakach ma zostać wygenerowane przerwanie. Ewentualnie musisz się posiłkować jakimś timerem - np. w trybie OPM. Szczerze mówiąc chyba lepiej Ci będzie napisać tę cześć kodu bezpośrednio na rejestrach...
Odpowiedź na Twoje pytanie jest trywialnie prosta. Rejestry które są buforowane (ARR, PSC i chyba jeszcze jakieś) aktualizują swój realny stan w momencie update'u, który występuje automatycznie w momencie przekręcenia licznika, czyli (w uproszczeniu) doliczenia do ARR. Ty w swoim wyjątkowo dziwnym kodzie fizycznie uniemożliwiasz wystąpienie update'u,...
Do pasma EKG układ w zupełności wystarczy. W kwestii punktu 4, chodziło mi o taką konfigurację licznika: - licznik zlicza w jednym kierunku, np. w górę. - Czas pełnego okresu (PSC i ARR) to trochę więcej niż czas transmisji + impuls LDAC (=210ns). - Do jednego z rejestrów porównujących ładujesz wartość, która odpowiada impulsowi LDAC, a wyjście konfigurujesz...
jeśli chodzi o inne przerwania od układów peryferyjnych to poza ustawieniem rejestrów tego układu muszę włączyć to przerwanie i czy tu wystarczy funkcja z core_cm3 np. NVIC_EnableIRQ( RTC_IRQn ); tak I dlaczego nie musiałem włączyć globalnych przerwań żeby SysTick działał?;] Przerwanie SysTick jest w grupie exceptions, ich się nie da wyłączyć w NVIC....
Albert: dość mocno mijasz się z prawdą. Niektóre uC z rdzeniami Cortex mają sprzętowy mechanizm gwarantujący czas odpowiedzi na przerwanie, który umożliwia redukcję drżenia (jitter) przerwania o najwyższym priotrytecie do zera również wtedy, kiedy mamy w systemie inne przerwania. Jeśli użyjesz tego mechanizmu, to sam decydujesz jawnie o czasie od przerwaia...
TIM1 może generować żądanie DMA lub przerwanie co określoną liczbę okresów, niekoniecznie w każdym okresie. DMA może zmieniać parametry przebiegu. Na moje oko użycie drugiego timera niekoniecznie jest tu dobrym pomysłem
Przerwanie od zbocza jest kompletnie niepotrzebne do niczego - wystarczy TYLKO przerwanie od timera, w którym również można zrobić wykrywanie zbocza i filtrowanie - wystarczy kilka zmiennych pomocniczych (poprzedni stan, jakieś liczniki). Jest to skrajnie proste i działa idealnie. Angażowanie dwóch przerwań do czegoś co można zrobić w jednym jest kompletnym...
Nawet jeżeli nie generuje jednego tylko więcej, to po jakimś czasie licznik powinien zliczyć do 5, w moim przypadku nic się nie dzieje, przerwanie się nie wywołuje.
Dzięki za sprawdzenie. Masz na myśli przerwanie od DMA? Tak, mogę toglować w przerwaniu od zakończenia transmisji DMA, co mam potwierdzone na analizatorze logicznym. Ja również testowałem na 14 pinowym F070, to bliźniacze rodziny, chyba różnią się tylko obecnością USB w tym moim, ale może jeszcze są jakieś drobne różnice, nie powinny mieć żadnego wpływu...
Witam, walczę z ustaieniami timera 2 dla procesora stm32f107. Wg. moich obliczeń timer powinien przepełniać się co 1s, jednak w rzeczywistości przerywanie wykonuje sie co 10s. Zamieszczam ponieżej moje obliczenia: Układ taktowany jest z PLL 72 MHz-ami Preskaler ustawiony na 7200. [syntax=c]TIM2->PSC = 7199;[/syntax] 72 MHz / 7200 = 10 kHz 1/10kHz =...
Po co ci ta sekcja krytyczna w EXTI9_5_IRQHandler ? Czy jeszcze jakies przerwanie korzysta ze zmiennych ktore chcesz chronic ? Jesli jest faktycznie potrzebna )w co watpie) to obliczaj pierwiastek poza nia, skopiuj wynik do zmiennej lokalnej i dopiero w sekcji krytycznej przekopiuj zmienna lokalna do globalnej. Nieliniowe funkcje biblioteczne potrafia...
A wejście wyzwalające timer również potrzebuje tylu cykli ??
O rany, to ta przyjemna praca z STM32 ? To ja jednak wolę LPC17xx, lub 8 bitowe PIC. Tam to jest RTC! Bo toto co opisujecie to RTC tylko z nazwy, a de facto zwykły timer. Albert
Jak się bawisz Keilem, to prześledź sobie działanie programu w symulatorze jak nie masz debuggera. Zobacz też czy masz zdefiniowane przerwanie od systick i co ono robi, jak nie grzebałeś nic w pliku konfiguracyjnym, to z automatu on jest włączany na wartości domyślne.
Jeśli chcesz mieć periodyczne przerwanie, to ustaw stosowny okres timera i użyj przerwania końca okresu. Czy zablokowałeś wywołanie SystemInit lub wyedytowałeś ustawenia? Jeśli nie, to zapewne masz zegar 72 MHz, co by wiele wyjaśniało.
Dziękuje za pomoc rzeczywiście nie włączyłem taktowania modułu AFIO, swoją drogą wykonuje przykłady z książki pana Paprockiego i tam nic o tym nie było wspomniane;( Idziemy dalej z nauką-teraz czas na Timery.
Czy dobrze rozumiem że ustawiając Update DMA i Update interrupt to po każdym przekręceniu się licznika zostanie wywołane przerwanie i DMA? W przypadku Trigger określam co bedzie powodowało start Timer'a?
Po ponad tygodniowej przerwie STM32 znowu zagościł na moim biurku. Aktualnie walczę z Timerem, na szybko skonfigurowałem go tak aby odliczał do góry, teraz chciałbym aby było z niego wyzwalane przerwanie. Z tego co wyczytałem w przeróżnych manualach udsotępnianych przez STM trzeba to zrobić w rejestrze ISERx, pytanie tylko co podstawić za x i pod którym...
Z tego co piszesz wynikało by, że w zasadzie tego kodu się po prostu nie da używać w sposób przewidziany przez autorów (; Rozumiem, że aby to ominąć to funkcję `USBH_Process(&hUSBHost);` musiałbym wywoływać np. z przerwania od timera, które miałoby taki sam priorytet jak przerwanie od USB?
Poza tym nie trzeba wcale mieć timerów ani zadnego supervisora, jeśli masz gwarancję, że dane przetworzysz szybciej, niz przychodzą. A parser i obróbka może się mielić najzwyklej w pętli głównej. Ja tutaj patrzę od razu pod kątem podpięcia takiego odbioru pod strumienie (czyli FILE, scanf() itd.), które z racji swojej asynchroniczności generalnie potrzebują...
Dokładnie tak jak pisze kolega R-MIK. Jak sprawdzałem czas od wykrycia zera do podania sygnału na triak dla uC stm32, to było to około 0,7ms. Więc maksymalny czas załączenia triaka w jednej połówce sinusa to 9,3 ms, więc wystarczająco na dość dokładne sterowanie. Ale dalej nie wiemy co kolega chce z tym robić, więc nie wiemy co będzie lepsze :) Sinus...
To technicznie też nie to - tutaj jest po prostu zezwolenie dla NVIC na przerwanie typu CC od timera, ale jeszcze trzeba właczyć odpowiednie przerwania w timerze. Zapewne jest to przerwanie od porównania, czyli właśnie po tym TIM_Pulse. Jak już mówiłem - nie używam tej spartaczonej biblioteki, więc nie wiem co dokładnie JESZCZE robią te funkcje... 4\/3!!
Przerwanie powinno być w porządku, ale co do inicjacji samego Timera to nie jestem pewny. Po prostu nie mam zaufania do funkcji API dla Timerów. Czy udało Ci się uruchomić cokolwiek związanego z licznikami na tych funkcjach?
Witam Zaczynam się bawić z moim stm32 discovery i mam problem z konfiguracją przerwania. [syntax=c] #include "stm32f0xx.h" #define zapal GPIOC->BSRR|=(1<<9);//zapal diode #define zgas GPIOC->BSRR|=(1<<25);//zgas diode int main(void) { RCC->AHBENR |=(1<<19);//wlacz port C RCC->AHBENR |=(1<<17);//wlacz port A GPIOC->MODER...
Co konkretnie nie działa? HAL ma tę wredną cechę że bardzo ciężko jest dojść o co chodzi. Zresztą Twój opis jest też stasznie zagmatwany. Jeżeli chcesz automatycznie aktualizować CCR4 w TIM4 danymi w buforze to lepiej jest ustawić burst mode timera. Wtedy timer sam dba o to aby wtedy kiedy wystąpi event (np przepełni się licznik) przesłać dane do rejestru...
Jak byś przeczytał 1E10 postów na elektroda.pl na temat osbługi klawisza to byś wiedział że nie robi sie tego w takim przerwaniu. A dlaczego - poszukaj na elektrodzie. Temat przewija się średnio 2 razy w tygodniu. Właściwe miejsce to pętla while gdzie masz pisanie na UART w main (co będzie niewątpliwie dla Ciebie łatwiejsze) lub przerwanie timera -...
Jeśli przerwanie obsługujące I2C trwa długo, to może po prostu timery dostają jakiegoś overflow (or sth) i wiesza się tak naprawdę gdzie indziej? Masz JTAGa? 4\/3!!
Witam, z góry przepraszam za mój nikły poziom obeznania w świecie STM32. Myślę, że problem będzie błahy dla wielkich myślicieli elektrody :) Otóż skonfigurowałem sobie TIM7 do pracy tak: [syntax=c]TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Period = 4; TIM_InitStructure.TIM_Prescaler = 999; TIM_TimeBaseInit(TIM7, &TIM_InitStructure);...
Zawsze można po przerwaniu DMA odpalić timer i poczekać na jego przerwanie i tam przestawić stan linii, to rozwiązanie ma taką przewagę nad delayem, że nie blokuje programu.
Kod składniowo jest dobry. Chodziło mi że nie rozumiem idei jego działania. Np. po co sprawdzać czy TIM4->CNT <= 9? To by oznaczało że za każdym razem TIM4->CNT zmienia się o 1 (i każda taka zmiana to potem programowe sprawdzenie). A to bez sensu: w takim przypadku Timer pracuje jak zwykła zmienna, czyli po co Timer skoro można po prostu dać...
Przejrzyj setkę wątków na forum poświęconych temu, dlaczego do przycisków nie uyżwa się przerwań portów, a potem zrób to w przerwaniu timera, np. tak, jak w tym artykule: http://ep.com.pl/files/10324.pdf Samo programowanie prtzerwania też masz ciut bez sensu - najpierw uruchamiasz przerwanie, potem programujesz linię portu, która ma je zgłaszać. Zanim...
Ustawienia kanałów CC nie mają bezpośredniego wpływu na pracę timera. Jeśli timer ma odliczać do jakiejś wartości, używa się do tego rejestru ARR (PSC dla dzielnika). Zasadniczy tryb pracy timera określa CMS oraz DIR z rejestru CR1, od przepełnienia timera można ustawić przerwanie UI. Jeśli kanał CC jest ustawiony jako compare (praca jako wyjście),...
Czy istnieje u ciebie przerwanie które wymusza dostęp na FSMC, tj. wyświetlacz? Jeśli nie, to nie ma opcji żeby praca FSMC miała wpływ na wykonywanie przerwań...Jeśli tak, to masz błąd w założeniach, bo dostęp do wyświetlacza nie powinien być w ISRrze.... Przerwania się skolejkują wtedy, gdy masz włączonych kilka przerwań i wszystkie wystąpią na raz...
Filozoficznie ująłbym to tak: jeśli cała funkcjonalność programu nie da się zawrzeć w przerwaniach, to znaczy, że powinniśmy użyć RTOSa. Z samego faktu obecności "pętli głównej" wynikają wyłącznie problemy. Od dawna piszę wszystkie nieduże projekty w taki sposób, że procesor po zainicjowaniu peryferiali idzie spać i tylko obsługuje przerwania. Na 8-bitowych...
Dzięki za odpowiedź rzeczywiście jest coś na rzeczy z tym oznaczeniem pinów. Niestety nie moge sobie z tym poradzić. Do pinu PB2 mam podpięty przycisk pociągnięty zewnętrznie do masy. Starałem się tak skonfigurować to przerwanie by reagowało na obydwa zbocza. Na razie nie potrzebuje ani timera ani priorytetu przerwań więc wykluczyłem te fragmenty. Niestety...
A dokładniej aby nie została przerwana w momencie da niej krytycznym - między przepisywaniem zmiennej data do bufora i inkrementacją zmiennej ut1_end. W czym przeszkadza, ze przerwanie od np timera, który nie ma nic wspólnego z UART, wykona się pomiędzy krytycznymi operacjami? Jeśli natomiast chodzi o przerwanie, które może wywołać odbiór czy tam nadawanie...
Jak wyrzucisz wszystkie linie z flagSW0irq i przerwanie to kod będzie działał jak chciałeś. A jak koniecznie z przerwaniem to zrób jak Ci Freddie radzi. Przy opadającym zboczu gasisz diodę i ustawiasz flagę blokującą zmiany od timera, a przy puszczeniu zerujesz tę flagę.
Cześć. Nie potrafię sobie poradzić. Prosty program z przerwaniem od przepełnienia TIM2, Nie wiem dlaczego, ale przerwanie odpala mi się zaraz po inicjalizacji timera. Nie pomaga czyszczenie flag w żadnym momencie tzn. ani przed ani po uruchomieniu licznika. Kod jest taki. [syntax=c] int main(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = 65000-1;...
Jeśli chodzi o przerwanie od tim2, to napisałem w poście powyżej nie do końca prawdę. Kod głównego programu jest wykonywany, a gdy zatrzymam procesor, program się zatrzymuje na tym rozkazie ktory mial wykonać. Następnie debugując <Step into (F5)>, procesor zaczyna wykonywać przerwanie TIM2_IRQHandler. I klikając F5 nigdy już nie wyjdę z tego...
Wydaje mi się, że najłatwiej będzie rozwiązać to w obsłudze przerwania jednego z timerów. I przychodzą mi do głowy dwie możliwości: 1. Zmienianie parametrów pracy timera po każdym "trybie" przebiegu jaki ma być wygenerowany na wyjściu. Tj. przeładowywanie liczby do jakiej licznik powinien odliczyć zanim wygeneruje przerwanie. 2. Ustawienie licznika...
Witam wszystkich. Uzywam Eclipse + OpenOCD (0.9.0) + GCC. Do tej pory używałem STM32F103 (Cortex-M3), a teraz przesiadłem się na STM32F373 (Cortex-M4). Wziąłem ze starego programu skrypt linkera, startup, vectors.c i posklejałem do kupy odpowiednio je modyfikując. Program generalnie odpala się, mogę sterować GPIO. Następnie spróbowałem uruchomić SysTicka....
3. Napisałem obsługę I2C na przerwaniach samodzielnie Nie napisałeś obsługi I2C na przerwaniach tylko masz polling I2C w przerwaniu timera. To jest klasyczny przykład na to jak czegoś nie należy robić. Obsługa I2C w przerwaniach polega na obsłudze przerwań przychodzących z tego waśnie peryferium. i zastanów się jak połaczyć przerwania I2C z przerwaniem...
Tzn. mam już sporą część projektu zrobioną w HALu i na razie chcę skonfigurować właśnie z pomocą tej biblioteki. (at)Marek_Skalski jeśli dobrze interpretuję Twoje wskazówki, to rozumiem, że nie da się na jednym timerze odpalić dwóch przerwań o różnych częstotliwościach. Muszę wykorzystać 2 timery (chociaż cały czas wydaje mi się to mało prawdopodobne)....
Przerwanie od input capture wskazuje, że stan licznika został zapamiętany w odpowiednim rejestrze... Jeśli dodatkowo można IC sprzęgnąć z DMA to problem akwizycji danych jest rozwiązany - DMA może wtedy wywoływać przerwanie po zebraniu dwóch (lub więcej) wartości - początku i końca impulsu. W niektórych co sprytniejszych ARMach (np STM32) można tak...
Ok, z niechęcią pokażę jeszcze trochę kodu. Od razu wyjaśniam - ten kod to tylko taka tymczasowa partyzantka celem sprawdzenia i wykrycia takich sytuacji jak ta powyższa. Docelowo to będzie zupełnie inaczej zorganizowane. Dane są zbierane do RAMu przy pomocy DMA do podstawy 5-5ms/kratkę. Powyżej już są wyświetlane na bieżąco. Niemniej w obu przypadkach...
Witam! Mam kilka prawdopodobnie błahych spraw, ale nie rozumiem dlaczego tak, a nie inaczej. Ponieżej program wykorzystujący timer do migotania diod. [syntax=c]#include "stm32f10x.h" void TIM1_UP_TIM16_IRQHandler(void) { TIM1->SR&=~TIM_SR_UIF; // zerowanie flagi przerwania if(GPIOC->ODR!=0x300) { GPIOC->ODR=0x300; } else { GPIOC->ODR=0x000; } } int...
Ale w czym problem? Wpuszczasz sygnał z DHT na wejście timera i mierzysz czasy trwania impulsów - to b. proste. Timer zgłasza przerwanie capture przy zmianie poziomu na linii danych. To jest rozwiązanie problemu, a nie pisanie kodu, który programowo odlicza czas i wyklucza możliwość robienia czegokolwiek innego podczas transmisji.
no już Ci to napisałem. jezeli chcesz robić prawdziwe delaye to zrób sobie przerwanie timera (czy systicka) i inkrementuj jakąś zmienną w znanym sobie okresie czasu. Jak chcesz napisać sobie taką blokująca funkcję delay - to raczej w asemblerze, czy też inline asemblerze, aby nie byc zależnym od kompilatora jezeli chodzi o długość iteracji i optymalizacje,.
To RM w łapę i czytać o timerach i ADC. Jak czegoś nie zrozumiesz pytać. Ciekawe jak generujesz to PWM jak nie wiesz jak to działa. ... Wyczuwam ... Czuję ... Jakiegoś gotowca. Piotr - na Ciebie zawsze można liczyć... :) Na drugie powinieneś mieć REFERENCE :) OK, doczytam sobie na temat przerwań od bloku porównującego COMPARE - bo chyba to sugerujesz?...
Może rozwiążę Twój problem nieco inaczej. Obsłużenie dowolnej bardziej skomplikowanej rzeczy w przerwaniu polega zwykle na sprawdzeniu flag statusowych (np. rejestru TIMx->SR) _ORAZ_ tego jakie przerwania są włączone (np. rejestru TIMx->DIER). Inaczej jest to po prostu niemożliwe. Dopiero mając te dwie informacje można dojść do tego jakie źródło faktycznie...
Pytasz, w jaki sposówb zrealizować "to" w przerwaniu", tylko nie piszesz nic o tym, czym jest "to" - a to jest klucz do całego problemu. Bez podstawowych informacji o funkcjonalności urządzenia nie da się dokładnie NIC doradzić. Wbrew tem, co napisał kol. mjurczuk, cały kod Twojego programu zapewne powinen mieścić się w przerwaniach. Na pewno nie ma...
(at)JarekC Czy nie za bardzo skupiłeś się na I2S? Weź pod uwagę, że w układach STM32, I2S to tylko tryb pracy modułów SPI. Od kilku lat w wielu układach jest SAI (Serial Audio Interface), który obsługuje więcej formatów, wystawia lub przyjmuje sygnał zegara z zewnątrz, ma dedykowaną PLL i większe FIFO, które w połączeniu z DMA zapewnia bezproblemową...
Witam, odwróciłem 115200 ale to wychodzi na jedne bit a nie bajt czyli raz 10 czyli około 86us, to nie jest ważne... Teraz uruchamiam timer co 1ms i sprawdzam czy "były dane" chciałem użyć timer w trybie Slave mode: Reset mode, czyli ja podam mu zewnętrzny sygnał to zbocze narastające lub opadające od transmisji go wyzeruje, a jak nie ma transmisji...
Czyli z tego wynika że, timer zainicjalizowany w sposób: TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999); Będzie liczył od 0 do 999, jak doliczy do końca (999) to zostanie wygenerowane przerwanie update czyli overflow ? Czyli przerwanie będzie generowane co T = 1/(F_CPU/Prescaler/(Period+1)), przy zołożeniu że licznik liczy w górę od 0 do 999?
podobnie nazywa się funkcja tego przerwania - void TIM1_UP_TIM10_IRQHandler(void) Dodano po 1 jak masz uruchomione przerwanie timera - TIM_DIER_UIE, włączony w NVIC i funkcję przerwania z prawidłową nazwą - musi działać. Dodano po 1 To nie jest - TIM1_IRQHandler() - dla TIM1 nie ma takiego przerwania. Są - TIM1_BRK_TIM9_IRQHandler, TIM1_UP_TIM10_IRQHandler,...
1. Dlatego, że w przerwaniu od przycisku musisz zablokować to przerwanie i uruchomić timer, a w przerwaniu timera odblokować z powrotem przerwanie - to zajmuje jakieś z 8 linii kodu i wymaga dwóch przerwań. Obsługa przycisku w przerwaniu timera zajmuje 2 linie kodu i wymaga jednego przerwania dla dowolnej liczby przycisków. 2. Robi się to, kiedy jest...
Jak mogę obsłużyć przerwanie tak, aby sygnał wykonywał się zadaną ilość impulsów. Np 10 impulsów i sygnał kończy gnerowanie Zadeklarować zmienną która będzie się zwiększać co przerwanie + dodać warunek który po przekroczeniu przez tą zmienną adekwatnej wartości wyłączy przerwanie bądź zatrzyma timer. Swoją drogą to nie wiem co studiujesz, ale skoro...
przerwanie timera atmega8 stm32 przerwanie przerwanie stm32
passat antena separator obliczenia elektromagnes naprawa xperia
mikrofalówka dioda pilot emtec instrukcja
AEG Lavamat 51060TL - Specyfikacja i Problemy UNITRA MDS 432: Wybór diody Zenera D103