Nie wiem czy to chciałeś osiągnąć, ale pin masz ustawiony na floating. Definicja w komentarzu była dobra, wartość liczbowa - zła. Przykłady znajdziesz w wyszukiwarce forum, w ostatnich tygodniach tematów o EXTI było kilka. 4\/3!!
ale teraz się zastanawiam (stąd ten post ) czy goście z CodeSourcery nie zrobili tego memcpy na DMA, bo czas kopiowania jest bardzo krótki. Nie zrobili, nie wszystkie uC maja DMA, poza tym kompilator nie ingeruje w żadne peryferia.
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...
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.
Stos dla przerwań ustawiłeś? 4\/3!!
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.
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...
Trzeba pewnie włączyć jeszcze globalne zezwolenie na przerwania, tylko nie mogę się tego doszukać w RM. Domyślnie przerwania są globalnie "odblokowane". W przeciwieństwie do poszczególnych przerwań, więc jest taka funkcja NVIC_EnableIRQ() czy jakoś tak. P.S.1. Nie musisz deklarować przerwania na górze, przed main(), bo i po co? P.S.2. W obsłudze przerwania...
Jeśli chcesz uzyskać minimalny narzut czasu procesora na obsługę wyświetlacza - w ogóle nie czytaj znacznika BUSY, bo jego wyzerowanie nie oznacza gotowości. Obsługuj wyświetlacz w przerwaniu timera. Jakiś czas temu obsługa HD44780 na STM32 w przerwaniu timera była pokazana w EP. A pierwszy błąd w Twoim kodzie jest tu: LCD_EN_bb=0; LCD_EN_bb=1; - wymagany...
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).
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...
Czyli gdzie może być problem? :)
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.
Witam, Bazuje na projekcie ze strony Freddie Chopin dla stma F4 z dodanymi bibliotekami STM32F4xx_StdPeriph_Driver. Zdefiniowałem sobie konfigurację timer'a w następujący sposób: [syntax=c]void Timers_Config(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TI... ENABLE); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM1_CC_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptio...
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...
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...
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.
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...
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...
Ile razy kolego mam ci pisać o przykładach zawartych w bibliotece? Z każdą "pierdołą" będziesz pisał nowy temat? Jak nie masz nic konstruktywnego do powiedzenia to poprostu nie pisz i ignoruj moje posty. Dzięki kilku życzliwym i wyrozumiałym user'ą z tego forum zrobiłem spory postęp
W procedurze obsługi przerwania, na samym jej początku należy wyzerować bit UIF (Update interrupt flag) w rejestrze statusowym. TIM4->SR &= ~(TIM_SR_UIF); I powinno działać…
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...
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...
W CCR2 też są. W moim przypadku ten kanał podpięty jest pod wejście TI2. Fakt, że inną sprawą jest to, że nie musiałem go włączać i mogę odczytywać z CNT. Już wiem jak to działa, nawet logiczne. Żeby wyzerować CCR2 trzeba wyłączyć CC2E w CCER oraz CC2S w CCMR, czyli odciąć jakby takt dla tego rejestru. Choć w zwykłym trybie liczenia z taktem wewnętrznym...
Zajrzyj do Elektroniki Praktycznej z lutego br. Parę rzeczy masz źle w kodzie. Do przyzwoitej obsługi potrzebujesz trzech kanałów jednego timera STM32, z czego jeden w trybie capture obu zboczy. żadnych innych przerwań ani opóźnień programowych nie trzeba. Timera nie trzeba zatrzymywać ani restartować - chodzi w ruchu ciągłym i sam inicjuje pomiary....
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...
W jakimś przerwaniu timera migasz diodą. w trakciemigania sprawdza jakąs flagę czy ma migać a jak nie to wylacza diodę. W pętli jak klawisz sie nacisnie (zakładamy tylko jeden stan - wyłaczenie - a właczenie migania następuje poprzez inny magiczny przycisk = reset) ustawiasz flagę na niemiganie. Jezeni wyłaczenie ma nastapić natychmiast (a nie przy...
Da się, zobacz arttykuł w EP z grudnia lub stycznia. Na STM32 można zrealizować sprzętowe sterowanie multipleksowanego wyświetlacza LED bez przerwania timera.
Ja na przykład robiłem pomiary z częstotliwością 24kHz wyzwalane przez timer. Dane zapisywane do tablicy. Przerwania DMA w połowie i na końcu wypełniania tablicy. W przerwaniach tych przesyłanie odpowiedniej połówki tablicy na kartę pamięci. Coś się tak uparł? m.ki i BlueDraco dobrze piszą, a ty dalej swoje. Z nadzieją jakby jeszcze Freddie miał uratować...
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!!
Zupełnie inny układ, zupełnie inne timery obsługiwane przez zupełnie inne rejestry :) I tak, przerwania też trochę inne (nvic).
Czy autor wątku poradził sobie z przerwaniami?? Pytam bo zamierzam napisać bootloader do programowania kulku uC po RS485 i planuje wykorzystywać w booltoaderze przerwania od UARTa oraz Timera.
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!!
Przy sprytnym projekcie to i STM32 może sterować wyświetaczem multipleksowanym sprzętowo, bez przerwania timera - wystarczy wszystkie linie do wyświetlacza mieć na jednym porcie.
Z czym może to być związane ? Z tym, że jedna funkcję masz skompilowaną w swoim projekcie a drugiej nie masz. Jaka jest różnica między: SysTick_CLKSourceConfig i SysTick_Config ? Pierwsza konfiguruje tylko źródło zegara dla systick. Druga dodatkowo włącza timer, przerwania oraz zapisuje wartość którą będzie przaładowywany timer.
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...
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...
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.
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.
Chyba przesiądę się na STM32 próbuj próbuj, ale zderzenie z dokumentacją po AVRach jest nieprzyjemne :)
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...
Nie pokazałeś konfiguracji RCC ani konfiguracji przerwania timera. Nie napisałeś z jakiego środowiska korzystasz ani na czym polega twój problem (nie działa/działa źle-jak?).
mozesz tez przy wiekszym nieco udziale rdzenia (ale wtedy bedzie już w pełni automatyczne i jedyne co musisz liczyć to co ile transmisja do ADC ma być wyzwalana). Czas ten musi być większy niż czas transmisji + 210ns. Zauważ że w przypadku 100k I2C ta częstotliwosc nie może być wieksza niż ~590Hz a w przypadku 400k 2370Hz. Jezeli potrzebujesz większej...
Będę nudny: zacznij od przerwania zgłaszanego co 10 ms. Nie nastawiaj timera na czasy kilkunastu sekund - obsłuż wszystkie zdarzenia w przerwaniu timera w postaci prostego automatu, zmieniającego stan przy upłynięciu jakiegoś czasu, naciśnięciu guzika i innych zdarzeniach.
No to po kolei. Załóżmy, że masz ustawiony znacznik przerwania X. Próbujesz wykonać swoją błędną operację: SR &= ~X; którą procesor wykonuje tak: temp = SR; temp &= ~X; SR = temp; Po wykonaniu temp = SR; w SR jest ustawiany bit Y, bo timer właśnie wygenerował inne przerwanie. Twój błędny kod skasuje bit Y, bo zapisze 0 na pozycję bitu Y. Kod poprawny...
zdania doprowadzają do jedynej IMO słusznej konkluzji w tym wypadku: Arduino. Arduino to ślepa uliczka. W mojej ocenie, Arduino traktuje uC jak Z-8 (CPU + GPIO) czy 8051 gdzie ze sprzętu to głównie proste timery i UART. ZERO wykorzystania sprzętu! Bo co wspierają biblioteki Arduino? UART z malutkim buforem w RAM, I2C to samo. SPI bez bufora, bez przerwań....
Jakiego typu jest absolutnie absurdalny i perwersyjnie wypaczony pomysł, aby mając OSa robić takie delay'e w wątkach ??? Również o podobną perwersję zakrawa wykonywanie przerwania timera co mikrosekundę tylko po to, zeby zmniejszać tam jakąś zmienną. Wez timer, skonfiguruj go jako one-shot, skonfiguruj mu takt na 1us, do ARR wpisz chciany czas w us,...
Problem rozwiązało właśnie użycie przerwań zewnętrznych. Można w funkcji obsługi przerwania EXTI sprawdzać od którego wejścia pochodzi przerwanie i zliczać impulsy z tego wejścia. Dzięki za pomoc.
Czołem, pytanie czy jest taka możliwość aby wykorzystać wewnętrzny timer USART'a przy połączeniu DMA do wyjścia z przerwania po określonym czasie?
Przykłady jak ustawić timer i przerwania zewnętrzne również na forum były umieszczone.
A tak się nie zeruje znaczników przerwań timera: TIM2 -> SR &= ~TIM_SR_UIF; Powinno być: TIM2->SR = ~TIM_SR_UIF;
Strasznie skomplikowałeś tak prostą rzecz. Nie trzeba wyliczać napięć skutecznych i z nich napięć szczytowych. Stosunek tych napięć jest stały, więc można to przeskalować i od razu wszystko obliczać na napięciach szczytowych. Z kolei zamiast ustalania okresu przerwań Timera można wykorzystać przerwania do Timera PWMa. PWM i tak nie jest w stanie wiernie...
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...
Witam! Potrzebuję wygenerować przebieg prostokątny-jest. Żądanie DMA co okres powyższego-też jest. Potrzebuję wygenerować żądanie DMA co drugi okres powyższego przebiegu bez użycia przerwania(zawracanie d..rdzeniowi) lub DMA(użyte do czegoś innego) za pomocą tego samego timera-proszę o sugestie.
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...
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...
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...
Witam, początkowo zacząłem programować mikrokontroler stm32f103RBT6 wykorzystując bibliotekę standardową, ale zachęcony przeczytanymi postami na elektrodzie zacząłem programowanie wykorzystując tylko definicje rejestrów zawarte w pliku stm32fx.h. Chciałem włączyć jakiekolwiek przerwania (np. od timera 4) niestety wogóle nie wiem jak do tego się zabrać....
Kilka wskazówek: 1. Jeśli sprawdzasz dwa piny, to sprawdzaj tylko te dwa, a nie cały port: if (GPIOC->ODR & 0x300) 2. Zamiast całego warunku if ... else , możesz po prostu odwracać stan portu: GPIOC->ODR ^= 0x300; 3. W pierwszej wersji było włączanie przerwania instukcją z CMSISa - tak było całkiem OK, więc nie ma co zmieniać. 4. Profilaktycznie daj...
Tak samo jak bez RTOS - sprawdzasz stan w przerwaniu timera albo w zadaniu odpalanym z timera. Faktycznie, wrzucili tam kondensator...
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?
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...
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...
Ok. Niemniej jednak skopiowałem ten kod z #8 do CubeIDE 1.5.0, zrobiłem parę korekt pod moje PCB, dokonałem poprawnej implementacji flagi BUSY i wszytko działa jak powinno z inkrementacją jak i bez. Kod uruchamiałem na STM32F070F6P6 z szablonu generowanego w CubeMX i okrojonego z HALa - przerwania działają poprawnie, zarówno jeśli używam sprzętowego...
Dedykowany timer do każdego z silników (o ile masz dużo timerów). Programujesz timer na czas kroku, w przerwaniu wykonujesz krok. Zmiana prędkości - zmieniasz czas timera. Tak jest najprościej, a dodatkowo każdy silnik jest niezależnie rozpędzany i hamowany.
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...
Mam problem z kolejkowaniem przerwań i wywłaszczaniem w STM32 Cortex M3. Otóż mam 2 timery, TIM6 oraz TIM12 o tym samym priorytecie (jeśli się wykonują, nie mogą się wywłaszczać, dlatego ten sam priorytet). Czasem używam globalnego wyłączenia przerwań i w tym czasie zgłaszają się oba, z tym że pierwsze ( po włączeniu IRQ) wywołuje o niższym numerze,...
ja pytam o sposób dostępu do tego rejestru, gdzie znajdę to napisane? Czy mam sam przez podobieństwo próbować czy coś takiego zadziała: DMA->ISR=0x......; ? Czy taka jest zasada? Taka jest zasada. Gdzie te nazwy są zdefiniowane? Większość jest w pliku stm32f10x.h . Jeśli używasz Eclipse, to po prostu trzymając CTRL kliknij w daną nazwę, a otworzone...
Tak to jest jak się z tej ogłupiającej biblioteki korzysta. Zajrzałem do core_cm3.h , tam funkcja SysTick_Config(ticks) przyjmuje postać: static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk)...
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
HAL_UART_Receive_IT nie dość że trzeba wywoływać cyklicznie, to jeszcze potrzebuje argumentu właśnie ilości danych Tym się nie przejmuj. Używaj tylko długości danych=1 a tą funkcję wołasz tylko jeden raz z programu na rozruch. Ale HAL_UART_Receive_IT umieszczasz też w obsłudze przerwania od RX tak by to się kręciło w kółko. A w tym przerwaniu analizujesz...
Próbuje uruchomić przerwania: vector.c wygląda tak [syntax=c]static void __Default_Handler(void) __attribute__ ((interrupt)); static void __Default_Handler(void) { while (1); } /* +=======================================... | assign all unhandled interrupts to the default handler +=======================================...
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
Ok, dzięki. Lucasgg - o jakie biblioteki chodzi? biblioteka math to libm.a, w okienku wyświetla sie m. Pozostałe biblioteki musza być ok, skoro uruchomilem na nich wyświetlacz graficzny, przerwania, ADC, timery... Byc może problem dotyczy tylko serii F100.
Najprościej - odliczasz impulsy w przerwaniu timera. I tak przy każdym kroku masz zmieniać okres timera, więc każdy krok musisz programwo obsłużyć.
Witam, Mam jeszcze jedno pytanko, czy pomimo tego, że Timer 2 jest podłączony do magistrali APB1 taktowanej zegarem 36MHz (max) to i tak na jego prescaler wchodzi sygnał 72Mhz? (CK_INT) pozdrawiam Krzysiek
Nie widzę obsługi przerwania USART, które jest aktywne. Zgaduję, że procesor grzęźnie w pętli domyślnej pustej obsługi przerwania. Zamiast bezsensowynch wygibasów z wypełnianiem struktury danych i wołaniem NVIC_Init() ten sam efekt osiągniesz prostym wywołaniem NVIC_EnableIRQ(USART2_IRQn);
Nie da się wywoływać przerwań co 1 us, bo jest to czas porównywalny z czasem wejścia i wyjścia z obsługi przerwania. Przyzwoitą obsługę DS1820 można zrobić na jednym timerze z trzema rejestrami compare - masz wtedy maksymalnie trzy przerwania na bit. Poszukaj w sieci przykładu obsługi OneWire dla LPC1114.
A wejście wyzwalające timer również potrzebuje tylu cykli ??
[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...
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.
Jeśli się nie mylę, to rzekomy problem o którym tu dyskutujemy (gubione przerwania timera) Freddie, zawężasz dyskusję do jednego aspektu. Ja to widzę tak: Albo bit banding jest tak samo dobry jak inne metody (ARM twierdzi, że lepszy), a wtedy konstruktorzy od ST robią coś, co jest zupełnie nieprzydatne, a wyniki pomiarów kolegów, którzy zadali sobie...
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.
Mówiłeś mówiłeś :) Ale to nic nie zmienia niestety, pod ta linijką(zaszłość) mam prawidłową // Wlacz taktowanie TIM2 RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2 , ENABLE); Timery chodzą, przerwania się wywołują, a sygnału na pa1 brak.... Pozdrawiam Krzysiek
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...
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ą...
Kilka dni temu wkleiłem kod inicjowania timera w STM32, zresztą podobnych przykładów znajdziesz całe mnóstwo. Bez SPL byłoby to 5 linijek kodu. Preskaler powinien mieć wartość o 1 mniejszą.
Popularne stm32f103 lub wg. potrzeb może być coś mocniejszego z rodziny f2,f3,f4...
Problem rozwiązałem - okazało się, że przy przenoszeniu kodu zniknęła inicjalizacja NVIC_InitStructure... Puki co interesowało mnie samo wyliczanie czasu pomiędzy kolejnymi przerwaniami, i to działa mi ładnie - dostosowałem sobie przykład z 32 bitowego timera ze strony stm i wszystko ładnie działa.
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?
Jakim przerwaniem? Np. nastawiasz timer na początku mierzonego kodu i odczytujesz jego wartość na końcu - masz gotowy czas wykonania.
A co to za funkcja? :-) I w którym miejscu kodu powinienem ją wywoływać? W żadnych przykładach nie widziałem aby ktoś jej używał no chyba, że gdzieś jest zaszyta. Może się pozmieniało odkąd ostatnio używałem FatFs, ale kiedyś ta biblioteka potrzebowała (przede wszystkim do odliczania timeoutów), aby zdefiniować jakąś własną obsługę przerwania od timera...
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);...
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...
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.
klawisze robi się na przerwaniach timera tu w masz przykład z kilk, długi klik o podwójny klik dla Twojego procka https://github.com/diymat/ARM-blog-libra...
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...
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...
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...
stm32 przerwania przerwania stm32 stm32 timer
przenośne radio podłączyć webasto analog schemat przedwzmacniacz tl074
Linde T20 AP wolno jedzie - możliwe przyczyny i diagnostyka Przedłużenie kabla czujnika zewnętrznego TECH-2