A nie masz tam przypadkiem przed main() funkcji SystemInit() ze SPLa, która "coś" robi z zegarem? P.S. Ta deklaracja przerwania przed main() naprawdę jest zbędna... Czemu to niby miałoby służyć? P.S.2 - PSC też powinno być 499. 4\/3!!
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...
Jeśli mierzysz to timerem to nie ma takiej możliwości. Za to na ADC można coś takiego ustawić i nazywa się to "analog watchdog". 4\/3!!
A gdzie masz ustawienie bitów SW na PLL w RCC?
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...
Po pierwsze, nie w żadnej pętli, tylko w przerwaniu timera, zgłaszanym z częstotliwością np. 2400 Hz Po drugie, w każdym przerwaniu timera należy: 1. W rejestrze GPIOD->CRL/CRH ustawić wszystkie używanie linie portu jako wejścia lub Analog. 2. Do rejestru ODR zapisać jedynkę na linii wyboru kolumny, zera na pozostałych. 3. Do rejestru CRL/CRH zapisać...
czy też muszę użyć trzech liczników? Procesor mam na płytce typu STM32F100RB. Nasuwa mi się pytanie czy w ogóle potrzebujesz to zrobić na timerach. A nie po prostu użyć przerwań od zboczy na pinach (EXTI). Typowo czas martwy G-M podawany jest rzędu 100µs, czyli nawet jak na wolny F100 jest to mnóstwo czasu i nie ma ryzyka zgubienia impulsów. Co...
Podczas kolejnego dnia walki orżnąłem kod praktycznie ze wszystkiego. Doprowadziłem do sytuacji odwrotnej - by działał 2 kanał PWM dla TIM1 należy zainicjalizować TIM3! W dodatku, zmiana wartości delay() w main również powoduje zaprzestanie działania PWM (podobnie jak wyłączenie TIM3). Kompletnie nie wiem, co robię źle. Wymieniłem już nawet uC na egzemplarz...
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.
Popularne stm32f103 lub wg. potrzeb może być coś mocniejszego z rodziny f2,f3,f4...
Zewnętrzne przerwania nadają się - przykładowo - do obsługi pinów sygnalizacyjnych z innych układów scalonych, a nie do zabaw z przyciskami. To po prostu nigdy nie zadziała... Zrób sobie przysługę i odczytuj po prostu wszystkie piny w okresowym przerwaniu od timera (co 20-50ms, albo i rzadziej) i będzie wtedy działało perfekcyjnie.
Kolego andrzej_nied, Proponuję zastosować timer do generowania przerwań co około 2.5ms. W przerwaniu testujemy wejścia portów nie zawracając sobie głowy jakimiś 'drganiami styków'. Sprawdzone, pewne, proste. Czas 2.5ms dobrany jest tak aby zwykły enkoder 20-32imp./obrót obracany energicznie ręką nie zgubił impulsu (gdy czas pomiędzy przerwaniami za...
Skoro nie masz problemu z timerem, to po co w ogóle o nim pisać i po co testować program który ma też przerwania od timera? Niemniej jednak na początek brawa za to, że NIE używasz słynnego i popularnego badziewia (; Wg mnie (skoro chodzi o pin zerowy), powinieneś konfigurować rejestr AFIO->EXTICR[0], a nie 1. Problemem jest manual niezgrany z plikiem...
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,...
Freddie, zawężasz dyskusję do jednego aspektu. Wy trochę też, bo może w przypadku flag przerwań timera faktycznie BB niczego nie wnosi, za to w innych przypadkach już tak. a wtedy konstruktorzy od ST robią coś, co jest zupełnie nieprzydatne W STM32 równie dobrze może być tak, że rejestry timera są takie a nie inne gdyż ST akurat miało taki układ peryferyjny...
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ł...
Trzeba dodatkowo włączyć taktowanie bloku przerwań. Wstaw np. zaraz przed while(1) RCC_APB2PeriphClockCmd(RCC_APB2Perip... ENABLE); Jak dojdziesz do timera to też dodatkowo trzeba włączyć taktowanie RCC_APB2PeriphClockCmd(RCC_APB2Perip...
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...
[syntax=c] RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //* [/syntax] ..... [syntax=c] NVIC->ICPR[0]=TIM2_IRQn; // * NVIC->ISER[0]=TIM2_IRQn; [/syntax] od tego jest CMSIS i jest całkowicie źle. [syntax=c]TIM2->SR &= ~TIM_SR_UIF; [/syntax] Nigdy na końcu przerwań. Unikałbym operacji read-modify przy zerowaniu flag. A to, że program niby nie...
Przede wszystkim brakuje listingu błędów, więc nie ma o czym mówić. Poza tym CooCox, o ile mi wiadomo, jest to zimny trup. Nikt tego nie używa, więc szansa na odpowiedź jest minimalna. Jak rozwiązać problem? Przeczytać bardzo uważnie wywalone błędy i na tej podstawie podjąć działania naprawcze. W ogólności - nieco tylko bardziej skomplikowane projekty...
A nie widzę nigdzie innego użycia przerwań niż tylko przy wciśnięciu klawisza klawiaturki. Przerwania zewnętrzne mają wyjątkowo ograniczone zastosowania. Nadają się np. do tego, żeby obsługiwać sygnały od innych układów scalonych, świadczące o tym że dany układ ma coś ciekawego do powiedzenia. Do przycisków nadają się wyjątkowo słabo, bo żeby to działało,...
Prawdopodobnie o żaden konkretny tylko o samo porównanie. Prościej więc po prostu programowo sprawdzać ten warunek (w końcu wartości pewnie też będą generowane programowo). A co do Timera to faktycznie on tylko porównuje na równość (==). Więc na nim tego nie zrobisz.
Tu na pewno jest błąd: if(released & btn == btn) to to samo co: (poprawiłem) if(released & 1) Jeśli nie masz nieblokującej obsługi LCD w przerwaniu timera, to skoro już bardzo chcesz pisać coś na LCD w przerwaniu - obniż priorytet tego przerwania.
Przetwornika nie ustawiasz, bo to nie jego rola. Możesz to zrobić na zylion sposobów. 1. Ustaw sobie alarm w zegarze RTC - i jak dostaniesz przerwanie to inicjuj konwersję. 2. Ustaw sobie wakeup timer w RTC i jak wyżej. 3. Sprawdzaj jakiś licznik zmieniany np. SysTick - jak jego wartość będzie większa niż poprzednia plus 600000 to inicjuj konwersję....
Dzięki Piotrus, tym razem z przyciskiem nakierowałeś mnie swoją uwagą żeby poszperać pod tymi hasłami i widzę, że nie powinno się używać przycisków w przerwaniach tylko obsłużyć je w przerwaniach od timera, więc spróbuję to po powrocie z pracy. Akurat w tym przypadku nie ma to znaczenia dla głównego problemu - detekcja naciśnięcia przycisku działałaby...
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
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.
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...
Mój problem polega na tym że komunikacja z 2 czujnikami na i2c przebiega poprawnie dopóki nie odpalę przerwań od input capture z timerów. Komunikacja zawiesza się w losowo wybranych momentach, raz po 20 sekundach raz po 10 minutach. Gdy wyłączę przerwania to chodzi bez blednie. Mój procesor to stm32F103rb. Próbowałem już 3 sposobów na odczyt z i2c -...
Na początek zastosuj poprawne kasowanie flagi przerwania. Zamiast: TIM3->SR &=~TIM_SR_UIF; Powinno być: TIM3->SR =~TIM_SR_UIF;
No i mamy przykład jak nie wolno kasować znaczników przerwań: TIM7->SR &= ~TIM_SR_UIF; // clear UIF flag Poprawnie robi się to tak: TIM7->SR = ~TIM_SR_UIF; Jeśli używasz przerwania końca okreu (update), to w przypadku TIM1 będzie to: TIM1_UP_TIM16_IRQn
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....
Nie będę głębiej wnikał, bo dopiero zabieram się za ARMy, ale to: http://www.stm32.eu/index.php?option=com... może coś ułatwi, gotowy projekt, który sprawia wrażenie prostszego. Działa! :D Dzięki bardzo!
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.
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...
Próbuje mierzyć częstotliwość sygnału wykorzystując przerwanie i Timer2 Napisałem taki oto kod przy pomocy CubeMX: 249992 Hz i niby ok. Jednak znalazłem kurs STM32 na FORBOT ( 249986 Hz. I teraz nie wiem czy prawidłowo należy skonfigurować timer do tego zadania tak jak zrobiłem czy tak jak w kursie?
SysTimer jest wykorzystywany w FreeRTOS jako zegar systemowy. Ale jeżeli potrzebujesz timera(dla zliczania czasu będącego wielokrotnością zegara systemowego) dla jakiejs innej biblioteki możesz wykorzystać vApplicationTickHook(), gdy tylko masz symbol configUSE_TICK_HOOK zdefiniowany na 1 (plik FreeRTOSConfig.h). Funkcja ta jest wywoływana w przerwaniu...
Dzięki, ale pytam o sprzętowe wystawienie sygnału na pin. Czyli Timer zamiast wystawienia przerwania zmienia tylko stan pinu. Czy jest taka możliwość, czy jednak muszę tą zmianę obsłużyć w kodzie (przerwaniu)?
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...
Idź przez instrukcje asma zamiast instrukcjami C i zobacz co sie dzieje pod &TIM4->SR gdy wykonuje sie sekwencja rozkazow BIC i STR. Takie dwa powinny tam być. Sprawdź również, czy proces zatrzymania rdzenia zamraża timer. Jeśli nie, to timer chodzi caly czas nawet przy zatrzymanym rdzeniu, i nie zauważysz najpewniej momentu kiedy ten bit jest zerem.
Witam, Jakiś czas temu używałem dosyć często przerwania co 1ms od SysTick i wysztko było w porządku. Aktualnie już pare godzin szukam problemu dlaczego nie otrzymuję przerwania od tego timera. Skonfigurowany przez CUBE czyli HAL_SYSTICK_Config(f zegara/1000) = w moim przypadku 24000. Funkcja inicjalizyje i startuje timer, niestety nie wykonuje się funkcja:...
Witam wszystkich, Wykorzystując 2 timery TIMER3 kanał 3 i TIMER2 kanał 2 generuję przebiegi PWM. Timery pracują w trybie FAST PWM1 zliczają do góry i wykorzystują przerwania. Niestety nie ma poszczególnych flag dla poszczególnych zdarzeń timerów. Każdy z Timerów ma po jedym globalnym przerwaniu. Koniecznie muszę wystartować oba przebiegi w tym samym...
Było (jakieś milion razy) (; W manualu znajdujesz rozdział RCC, Clocks, a w nim coś takiego na samym końcu (pod obrazkiem Clock Tree): The timer clock frequencies are automatically fixed by hardware. There are two cases: 1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers...
3 us to 63 cykle - niby to wcale nie mało dla rdzenia Cortex. Wygeneruj impuls startu konwersji na timerze, w przerwaniu timera na koniec impulsu odpal transmisję, po zakończeniu transmisji z ADC wyzwól ponownie timer. Nie jestem pewny czy zwalnianie uC do 21 MHz to dobry pomysł. Sama transmisja też zajmie trochę czasu, potem obróbka odebranych danych...
Nie znam uC-os jednak wiem jak działają RTOSy, i mogę stwierdzić, że masz coś nie tak z prio wątków. Jeśli chcesz po prostu 2 niezależne wątki które się wykonują quasi-równolegle to twój os musi potrafić wywłaszczać (round-robin time slicing) a oba wątki muszą mieć ten sam prio (i jeśli os wymaga, to trzeba mu skonfigurować ile ma trwać timeslice dla...
Zgadza się. Na większości płytek jest 4k7 do +5, który dość skutecznie zastępuje 1k5 do +3.3. z grubsza chodzi o to, żeby przy podłączeniu na linii D+ pojawiło się napięcie nieco ponad 3V przy ściągnięciu w dół prądem ok 200uA. Stos USB z CubeMX nie wykrywa odłączenia, a funkcja Deinit() jest wołana tuż przed Init(). Są sposoby na wykrycie odłączenia,...
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
Sprawdziłem to co zaproponowałeś i wyniki są następujące. Wykomentowałem linijkę, w której flaga jest resetowana (flag=0) w procedurze przerwania od timera. Czyli jawnie w kodzie nie ma żadnego miejsca gdzie flaga byłaby zerowana. Efekt - bez zmian. Na wyjściu z przerwania od EXTI widzę 1. Na wejściu przerwania timera - 0. Co więcej, przy kolejnym wejściu...
Sprawdzalem, co jest w rejestrach SystTicka: Pod adresem 0E000E010 jest wartosc 07 00 00 00 (po skonfigurowaniu) i 07 00 01 00 (po odliczeniu czasu) - czyli OK Może ktoś ma pomysł o co chodzi? Czy czegoś brakuje? Nie jest OK! Zamiast 07 powinno być 03 ! SysTick control and status register (STK_CTRL) Bits 31:17 Reserved, must be kept cleared. Bit 16...
gaskoin- dwa PC817 są równie dobre, zwłaszcza jak się je ma w szufladzie. Inna sprawa- przebieg na wyjściu detektora zera jest taki sobie- żeby nie powiedzieć paskudny. No i podany jest na zwykłe przerwanie zewnętrzne a nie na żaden komparator. Pewnie ARM ma na wejściach jakąś histerezę- ale może trzeba ją w jakiś okropny sposób włączyć? Może sprawdzić...
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);...
Mojej walki ciąg dalszy. Czy: 1. takie przerwania jak NMI, Hard Fault włącza sie jakoś czy zawsze są włączone. 2. jeśli NMI ma wyższy priorytet to jeśli jest wykonywane HardFault to jedno przerywa drugie? 3. Czy do przerwań systemowych konfigurowanych (jak Memory management fault, Bus Fault, Usage fault, SVCall, PendSV, SysTick) również ma zastosowanie...
I tu był pies pogrzebany. Sądziłem iż skoro obsługuje callbacky to nie muszę głównego przerwania. Mam teraz kolejny problem. To oznacza że jak na projekt używający HAL masz źle to wszystko zrobione. HAL jest tak dziwnie zrobiony, że jeżeli nie wygenerujesz kodu startowego w Cube to zginiesz. Gdybyś tak zrobił to wtedy w pliku "..._it.c" miałbyć ten...
Nic nie wspomniałem, że używam dwóch przerwań jednocześnie. Po prostu chciałem zrozumieć działanie przerwań zewnętrznych, nie od timera, nie od czegokolwiek innego tylko i wyłącznie przerwanie zewnętrzne. Napisałem, że wiem jak używać testowania przycisku przez przerwanie od timera, notabene SysTicka. Chciałem tylko zrozumieć konfigurowanie oraz używanie...
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...
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...
Ciężko zrozumieć o co chodzi w tym kodzie. Ale jedno jest pewne: echo z czujnika to zmiana stanu logicznego. A więc powinieneś czekać na jedną zmianę stanu, czyli również na jedną konkretną polaryzację. A zrobiłeś przerwania EXTI zarówno od zbocza opadającego jak i narastającego. Więc na pewno tutaj też leży część problemu.
Jeśli opierałeś się na moim przykładzie, to proponuję zajrzeć do dokładnie 35 linijki skryptu linkera i dobrze zrozumieć to co jest napisane w jej okolicy.
Kiedy timer jest zatrzymany (CEN=0), rejestry ARR i PSC ładują się natychmiast, bez UG Bzdury. Rejestr preskalera ładuje się DOPIERO przy UEV.
Cześć, nie analizowałem kodu, ale kiedyś wykorzystałem to: http://www.keil.com/download/docs/370.as... . Porównaj może się przyda. Są wykorzystywane te rzeczy co potrzebujesz chociaż nie pamiętam czy ac jest wyzwalane timerem. Pozdrawiam
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...
Błędów całe mnóstwo. 1. Nie robi się przerwań od przycisków. Zrób przerwanie timera np. 100 Hz, w nim sprawdzaj stany przycisków. 2. __attribute__ ((interrupt)) jest zbędne. 3. Znacznik przerwania kasuje się na początku, nie na końcu obsługi przerwania. 4. Do zmiany stanu linii portów służą rejestry BSRR- jeden zapis zmienia stany dowolnie wybranych...
Jakie ostrzeżenie generuje kompilator? Poinformowałeś go w pliku stm32f4xx_it.h o tym jak wygląda funkcja void TIM2_IRQHandler(void); ? Chyba nie i dlatego lądujesz w Default_Handler, który jest na końcu pliku startup. Dodaj deklarację funkcji, dołącz plik nagłówkowy do main.c i pewnie będzie działać.
Wyzwalasz timerem sprzętowo, odbierasz wyniki do bufora przez DMA, po odebraniu bloku o długości, którą sam wymyślisz - przetwarzasz wyniki. Dane możesz pewnie przetwarzać w przerwaniu DMA. Jeśli masz inne, ważniejsze przerwania - obniż priorytet przerwania DMA.
Witam, prosiłbym bym o pomoc, żeby ktoś wytłumaczył, albo podał przykład jak skonfigurować przerwania zewnętrzne w tym mikrokontrolerze bo walczę z tym i nic mi nie wychodzi i zaczynam podejrzewać, że to procek jest zepsuty, albo tej sztuki jeszcze nie opanowałem :D na początku pisałem własne kody, ale po nieudanych próbach w końcu wkleiłem gotowca,...
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...
W tym projekcie w którym Ci to nie działa pewnie nie masz prawidłowych wektorów przerwań, bo w pliku startup_stm32f030xc.s nic ciekawego nie ma (tylko same zera).
1. Przycisków nie obsługuje się na przerwaniach portów. 2. Nie potrzebujesz do tego trzech przerwań - wystarczy przerwania timera i UART. 3. Nie zmieniaj priorytetów przerwań - jeden poziom zdecydowanie wystarczy. Nie potrzebujesz zagnieżdżania, a próbując je zrobić brniesz w ślepą uliczkę, bo 5. Ogólną zasadą jest, że w procedurze obsługi przerwania...
Na początek polecam [url=http://www.st.com/content/ccc/resou... - Sekcja 4.6. Naprawdę warto przeczytać, aby wiedzieć jak to działa, ponieważ ma znaczenie nie tylko dla NAND-Flash, ale też innych obszarów,...
Zmieniony program sterownika. dodałem przerwanie timera a w nim: obsługę klawiszy w przerwaniu co 50ms uaktualnienie zegara oraz synchronizacje z wewnętrznym RTC co godzinę pustą funkcję timerIntervalHalfSec w której proponuję odczytywać stan wejść analogowych, nie na raz tylko po jednym. dodatkowo masz przerobioną funkcję switch reagującą na nacisnięcie...
Stos dla przerwań ustawiłeś? 4\/3!!
albo powielić na jakimś szybkim Cortexie do 1kHz Następny. Jak się powiela na szybkim Cortexie, czego nie można zrobić innym procesorem? Albert To tylko sugestia. Jeśli w tej samej cenie mogę mieć dostępne 48MHz (przykładowo STM32F0) zamiast 16MHz (Atmega8) i nie muszę szczypać się, ile taktów zajmie mi zmiana GPIO, to czemu nie? O 32-bitowym timerach...
P.S: W timerze delay jest mi potrzebny bo wysyłam dane po rs485 i muszę odczekać czas ze względu na konwerter. Wiesz dobrze, że wcale nie musisz do tego używać delay'a... 4\/3!!
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...
TIM2->ARR=1; TIM2->PSC=0; To oczywiście spowoduje bład DMA o którym pisze poniżej przy drugiej transmisji i przerwanie transakcji DMA Ja używam Nucleo, tam nie mam kwarcu, Masz - sygnał idzie z ST-Linka i w cube iustawiasz jako bypass. Jaki jest procent wykorzystania czasu szyn przy tak częstych żądaniach DMA? Czy na cokolwiek jeszcze zostaje czas,...
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...
Aby nie zakładać specjalnie nowego tematu to spytam się jeszcze tutaj. Czy powyższa metoda może zostać wykorzystana do odmierzania czasu rzędu 1 mikrosekundy. W teorii tak, ale nie jest to chyba najlepszy pomysł... Wejście i wyjście z przerwania to - z tego co pamiętam - 18 cykli. Do tego sama obsługa przerwania to też kilka instrukcji, powiedzmy więc...
No racja, dzięki. jeszcze tak dla pewności: to w ten sposób mam przerwanie co 0,2s: SysTick_Config(CLK_FREQ/14400000); Nie. Taka konfiguracja spowoduje to, że przerwania będą bardzo szybko występować (co kilka cykli zegara). Jak chcesz mieć przerwanie co 200ms to skonfiguruj timer tak: I automatycznie za każdym przerwaniem powinna wykonywać się powyższa...
Teraz ogólnie ciekawe rzeczy wychodzą w ramach TINY. Ostatnio czytałem jakąś AppNote, gdzie w TINY był timer pracujący na 64MHz ;) Toggle GPIO to przeszczep z XMEGI ;) Dodano po 10 Swoją drogą to problem rozwiązywalny w Makefile w jakieś 10 sekund, no ale przecież powszechnie wiadomo, że magiczne wszystkomające IDE są lepsze niż jakieś tam prymitywne...
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 -...
Nie po to wymyślono przerwanie od portu, żeby wykrywać stan przycisków. Jeśli uprzesz się na takie rozwiązanie, potrzebujesz dwóch przerwań - od portu i od timera. W przerwaniu portu blokujesz dalsze przerwania i uruchamiasz timer, a w przerwaniu timera ponownie odblokowujesz przerwanie portu. Na samym przerwaniu timera bez przerwania od portu jest...
Napisałem program liczący wariancję z obu tablic, dodatkowo skonfigurowałem Timer2 do pracy w trubie PWM o częstotliwości 1Hz z wypełnieniem 10%. Podałem ten sygnał na mój przetwornik A/C. Przetwornik próbkuje sygnał i liczy wariancję z obu tablic. Po wykryciu że wariancja jest bardzo duża zmienia stan diody LED PC9. Druga dioda jest połączona do wyjścia...
Tu też nie trzeba nic robić w przerwaniach - wystarczy zaprogramować timer. Jeśli trzeby wygenerować określoną liczbę impulsów - trzeba odliczyć je w przerwaniu timera i po kolejnym przerwaniu wyłączyć timer albo ustawić wypełnienie na 0.
Z trybu STOP Mode procesor może być wybudzony przez przerwania zewnętrzne lub zdarzenia RTC: https://obrazki.elektroda.pl/3121908700_... Który konkretnie procesor posiadasz ? Najprościej w twoim wypadku było by wykorzystać opcje "Periodic wakeup" z RTC, jednak jest ona dostępna tylko w rodzinie STM32F030xC (z STM32F030). Kolejna opcja...
Coś mi tu nadal nie działa. [syntax=c] //konfiguracja timera14 NVIC_EnableIRQ(TIM14_IRQn); RCC->APB2ENR|=(1<<8);//wlacz zegar tim14 TIM14->ARR=122; TIM14->CR1|=(1<<7);//preload enable TIM14->PSC=0xffff; TIM14->DIER|=(1<<0);//przerwani... od update TIM14->CR1|=(1<<0);//odpal timer [/syntax] W przerwaniu zeruje...
A jak nadejdzie krótsza a potem nic? Dalsze komplikowanie, jakies timeouty - po co? DMA jest wygodne i użyteczne do pewnych celów a do innych nie. Nie przesadzaj. Robi się to właśnie timeoutami i działa całkiem nieźle. DMA odbiera ciągiem (w trybie circular z przerwaniem od połowy i całego transferu), masz też przerwanie okresowe (albo timer programowy)...
Przecież 1 timer może wykonywać kilka (naście) zadań. Np. odmierzać kilka czasów, obsługiwać wyświetlacze LED, przyciski, odtwarzać muzykę. I to tylko 1 timer odpowiednio oprogramowany.
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...
Na samym końcu funkcji której używasz- TIM_TimeBaseInit() - jest wymuszany "update", co powoduje ustawienie flagi przerwania które włączasz. BTW - używasz bibliotek które zostały oficjalnie porzucone przez producenta. Takie był dobre, że stwierdzili, że trzeba to wywalić do kosza bo nic się z tym nie da zrobić [; Miliony ludzi, którzy twierdzili, że...
Zamieszczam podsumowanie problemu, gdyby ktoś w przyszłości szukał ... Niestety mieliście racje, wyzwalanie timera nawet dla ARMa, a w zasadzie obsługa timera zajmuje bardzo dużoooooo czasu. Zamieszczę podsumowanie dla SYSCLK równego 180MHz: Dla poniższej obsługi przerwania, tylko na rejestrach uzyskana częstotliwość przełączania osiągnęła 6,349mhz...
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...
To w takim razie zapoznaj się bliżej z SPI i znajdź jak używając jego rejestrów dowiedzieć się czy transmisja się zakończyła. Rób rzeczy jak należy, a nie wymyślaj jakiś głupich obejść. Zapoznam się z tą opcją. Choć zastanawia mnie jak poradzić sobie z jedną z możliwości która zakłada że po załadowaniu 32B pin CE włączamy na 10us bo tego wymaga moduł...
Próbuje zrobić obsługę przycisku w przerwaniu z funkcją eliminacji drgań. Problem polega na tym,że po odmierzeniu zadanego czasu przerwanie wywołuje się samo po raz drugi mimo że nie naciskam przycisku. Próbuję to zrobić tak, że gdy zmienna naciskany jest przycisk na PB3 to blokuje przerwania od tego wejścia, uruchamiam timer i gdy zmienna "delay" doliczy...
T3 nie współpracuje z enkoderem. Analogiczna konfiguracja na T1 jak najbardziej działa poprawnie: [syntax=c]//GPIO //GPIOA RCC->AHBENR |= RCC_AHBENR_GPIOAEN;//zegar dla GPIO GPIOA->MODER |= (0<<0) | (3<<2) | (1<<4) | (1<<6) | (1<<8) | (2<<10) | (2<<12) | (2<<14) | (2<<16) | (2<<18); GPIOA->OSPEEDR...
Twoje problemy rozwiązałby jakiś TMS320 z serii C2000. Ale to tylko moje dywagacje. Jeśli chodzi o STM32F4 to musisz przemyśleć czy rzeczywiście 4 MHz jest niezbędne dla ADC. Kiedyś bawiłem się timerami w Keil'u więc kod wstępny na pewno Ci się przyda (kanały timera3 działają na GPIO->C6-C9): odznacz NVIC_EnableIRQ !!! ): [syntax=c]void TIM3_IRQHandler(void)...
Na tego typu problemy jest jeden prosty sposób, wielokrotnie dyskutowany na forum: automat w przerwaniu UART. Jeśli ma być wykrywana "przerwa w transmisji" najpierw trzeba zdefiniować, co to jest ta "przerwa". Jeśli "przerwa" - to brak nowych danych przez czas np. potrzebny na transmisję jednego bajtu - UART potrafi takie coś wykryć w sprzęcie. Jeśli...
Chyba napisałem że jak nie dasz sobie rady z "ręczną" diagnostyką. Zresztą jeżeli masz kłopot z radzeniem sobie z HF, to będziesz miał duży problem, szczególnie używając RTOS-a.
Robię program składający się głównie z przerwań. Program steruje 6 silnikami krokowymi. Uruchomiłem więc 6 timerów dla kazdego silnika w trybie PWM, wypełnienie zawsze 50%, sterowanie częstotliwością. Żeby każdy silnik mógł wykonać zadaną ilość kroków (a zalezności miedzy silnikami są skomplikowane i nieprzewidywalne), każdy timer po wykonaniu impulsu...
Korzystałem z googla i czytałem dokumentacje. Chcę, żeby ktoś mi wytłumaczył co to dokładnie jest np Prescaler i jak mam go rozumieć w kontekście mojego projektu (tak, dokumentacja nie wyjaśniła mi tego dokładnie). Nie wiem jaką dokumentację czytałeś, le niewątpliwie nie tę, którą trzeba. Aby zrozumieć jak działa to wszystko trzeba przeczytać Reference...
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?...
stm32 przerwa przerwa przerwa stm32 stm32 timer
sprzedać tuner pioneer mercedes diesel obroty silnika eberspacher silnik
regenerowane tusze regenerowane tusze
Defro K1Pv2: Tryb podtrzymania po włączeniu KEMET R76 B1 470nF 1000V ESR – wartości dla różnych częstotliwości