Ten temat może pomóc w rozwiązaniu tej zakręconej kwestii http://www.elektroda.pl/rtvforum/topic14... pozdr.
Poczytaj w dokumentacji, sprawa jest tam poruszona. SysTick i PendSV mają być na najniższym, a inne przerwania - które używają funkcji RTOSa - nie mogą mieć wyższego priorytetu (niższego numerka) niż configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIO... lub configMAX_SYSCALL_INTERRUPT_PRIORITY. Obstawiam, że jedna z tych wartości nie jest używana i w ogóle jest...
Zerowanie flagi na końcu przerwania - niedopuszczalne
A konkretnie czego nie rozumiesz i nie potrafisz zmodyfikować dla PA2? Zanik zasilania możesz wykrywać w samym mikrokontrolerze. Obsługa przerwania EXTI powinna kasować zgłoszenie - inaczej będziesz się kręcił w przerwaniu.
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
12 cykli - tyle zajmuje przejście do obsługi przerwania 6 cykli - tyle zajmuje przejście z przerwania do przerwania o wyższym priorytecie 6 cykli - tyle zajmuje przejście do przerwania o niższy priorytecie bezpośrednio po zakończeniu przerwania o wyższym priorytecie 12 cykli - tyle zajmuje wyjście z przerwania. Ta zasada tyczy się wszystkich przerwań
SysTick to przerwanie systemowe (rdzenia). RTC to przerwanie mikrokontrolera. Te pierwsze są zawsze włączone. Te drugie trzeba włączyć w kontrolerze NVIC. Jest do tego funkcja NVIC_EnableIRQ() czy jakoś tak, a do niej definicje z numerami przerwań. 4\/3!!
Choć dopiero zaczynam przygodę z STM32 to po mojemu nadpisujesz strukturę i dlatego zawsze działa Ci ostatnie zdefiniowane przerwanie.
Więc proponuję Ci włączyć dane przerwanie dopiero po zarejestrowaniu semafora. Tak naprawde to powinieneś tak postępować z każdym mutexem,kolejką czy semaforem, niezależnie czy operują one w przerwaniu czy w tasku. Czyli najpierw tworzymy semafor, a potem uruchamiamy task, czy też włączamy dane przerwanie.
1. Zbędny atrybut volatile w deklaracji AdcVal. 2. Czy AWD jest jedynym źródłem przerwania ADC? 3. Kasować bit zgłoszenia przerwania należy na początku procedury obsługi przerwania. nie wiem, aj to jest W STM32, ale w wielu innych Cortexach Zgłoszenie przerwania nie zdąży się w takiej sytuacji skasować i powtórnie wejdziesz w obsługę przerwania.
Co do Twojego problemu deklaracji typu układu - typ ten zdefiniowany jest w Makefile (MD, HD, CL, ...) Jeśli używasz przerwań, to ustaw jakąś wielkość stosu dla przerwań w skrypcie linkera (domyślnie jest 0, bo nie ma przerwań w przykładach). 4\/3!!
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...
Oczywiście że wracasz tam gdzie zostało wywołane przerwanie. Potrzebny Ci warunek wyjścia z pętli while(1) funkcji efekt1 inaczej nigdy nie wrócisz do main'a.
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.
Witam Aplikacja: Próbuję zrobić aplikację która odczytuje plik wav'e z karty sd (przez SPI2) i podaje go na DAC'a (SPI1). Potrafie osobno skorzystać zarówno z DAC'a jak i FatFs. I tak: Ustawiłem przerwanie które jest generowane 44100 razy na sekundę (I tutaj może być problem, za często). Podczas przetwarzania obsługi przerwania pobieram dane z podwójnego...
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.
1. Dla SysTicka nie włączasz NVIC, bo to przerwanie jest w NVIC zawsze włączone (w ogóle nie da się go wyłączyć inaczej niż wyłączając globalne zezwolenie na jakiekolwiek przerwania). 2. Generowanie przerwania włączasz w SysTicku [; Reasumując: - SysTick->LOAD - wartość "przeładowania" - SysTick->CTRL - dla takiego działania jak chcesz ustawiasz tam...
Będzie tak jak piszesz. Przerwanie po doliczeniu do 999 po czym zerowanie licznika i liczy od nowa
Też nie bardzo wiem jaka jest nazwa (wektor) funkcji tego przerwania, więc mam tak: Przecież wystarczy zajrzeć do tablicy wektorów i wszystko stanie się jasne... Można też zajrzeć do manuala, aby dowiedzieć się, że system CSS jest zmapowany na przerwanie NMI. Nie wiem czy czekanie na odpowiedź na forum jest naprawdę szybsze... 4\/3!!
Jeżeli skok jest z przerwania to HardFault jest spowodowany tym, że zmieniasz wskaźnik stosu w obsłudze przerwania.
Najwięcej szukaj w manualu. Ja też nie wiedziałem o tych funkcjach i z manualem sam do tego doszedłem jak się wyłącza przerwania (doszedłem to dość sporo powiedziane - tam to poprostu jest napisane).
No bo wciąż ustawiasz rejestr IMR "odwrotnie" - zajrzyj do manuala co oznacza 0, a co oznacza 1. I w ramach testów zrezygnuj z ustawiania jakichkolwiek priorytetów przerwań czy czegokolwiek z nimi związanego. 4\/3!!
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...
(at)Marek_Gorecki Odnoścnie ARM info o czasie reakcji na przerwania znajdziesz tutaj: http://infocenter.arm.com/help/index.jsp... Funkcje: EXTI_GetITStatus EXTI_ClearITPendingBit są specyficzne dla STM32 ponieważ wiele źródeł jest podłączonych do jednego wektora przerwania. Czas reakcji na przerwanie będzie sumą cykli...
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...
Nie ma związku konkretnie z EXTI, ma związek ze wszystkimi przerwaniami, a dokładnie ze zdarzeniami, które mogą powodować przerwania. Umożliwia wypuszczenie na zewnątrz sygnału zdarzenia.
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...
wychodzi mi jakieś 8 8 cykli to zajmuje pierwsza linijka <; wejście do przerwania to następne kilkanaście + wyjście. Sugerujesz bitbanding dla kasowania flagi przerwania? No przecież właśnie o to chodzi - żebyś nie musiał odczytywać, modyfikować i zapisywać z powrotem. Czyli twiedzisz że 6*10kHz takich przerwań to dla tego procesora pikuś i nie...
W ciągu ostatnich dwóch lat w EP pojawił się cykl artykułów poświęconych programowaniu STM32 bez SPL z wieloma przykładami. A i ważna uwaga co do tekstu: w aktualnych, nowych wersjach plików nagłówkowych dla F4 już nie ma BSRRL i BSRRH, a jest BSRR (co powoduje, że programy napisane pół roku temu już się nie kompilują z nowymi plikami nagłówkowymi)....
W przerwaniu od DMA oczekujesz na ustawienie flagi oznaczającej zakończenie transmisji (TC). Jeśli chcesz super elegancko, ale niekoniecznie lepiej, to w momencie rozpoczęcia transmisji DMA włącz przerwanie od tej flagi w module UART - nadajnik będziesz wyłączał dopiero w tym przerwaniu. 4\/3!!
Przeczytaj manual - interesuje Cię przerwanie od przepełnienia (update), a nie porównania (compare). Pozatym przerwania trzeba też włączyć w NVIC. 4\/3!!
O ile pamiętam dziwaczny bufor SPI w STM32 ma pojemność 32 bitów, więc nawet bez wysłania jednego bitu masz po zapisie 16 bitów do DR od razu przerwanie - bo możesz od razu zapisać następne 16 bitów.
Czy ktoś tu robił obsługę I2C na przerwaniach ?
AFIO->EXTICR Druga linijka nadpisuje to co zrobiłeś w pierwszej. Dalej nie patrzyłem.
Ale gdzie jest to napisane jeśli pamiętasz? Czytałem Datasheet STM32F103RB, Reference Manual i jeszcze parę innych i nie znalazłem nic co by wyjaśniało te przerwania.
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...
Twój kod jest zły, bo czwórki bitów dla poszczególnych przerwań są w tych tablicach IP[] upakowane po 8. Funkcje z CMSISa do przerwań (do NVIC) są generalnie funkcjami inline, więc efekt finalny będziesz miał taki sam - czy użyjesz swoich dostępów do rejestrów, czy tych funkcji. Ja bym proponował zostać przy tych funkcjach. Jak koniecznie chcesz poczytać,...
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...
ADC1_2_IRQHand _ er Chyba koło fortuny się ta gra nazywała (; 4\/3!!
z tego co rozumiem żeby dokonać jakiejkolwiek zmiany w rejestrze AIRCR należy tam również wpisywać 0x5FA po to by zapis nie został odrzucony. Chyba że źle kombinuje:P Dobrze kombinujesz, wcięło mi ten zapis :P SCB->AIRCR = AIRCR_VECTKEY_MASK | (3<<8); gdzie: #define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) Chociaż...
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)...
Witam Czy obsługa przerwań STM32F1 od UARTa nie koliduje z jednoczesnym zapisem do pamięci flash mikrokontrolera (czy podczas zapisu do pamięci flash nie są blokowane przerwania) ?
Ad 1 - Właśnie tak - nie da się. Ad 2 - Zapewne tak. Jak wiesz, ja nie RTOSowy, ale ogólnie kiedy mam coś wysłać do hosta w oprogramowaniu device - zgłaszam przerwanie o tym samym priorytecie, co przerwanie USB i wysyłam (wołam jakieś tam Send) w tym przerwaniu właśnie. Podobnie w przerwaniach wołam procedurę Receive, która, jak wiadomo, nic nie odbiera,...
Flagi zeruj bezpośrednio po sprintf - wtedy dane w zmiennych nie są już potrzebne i można je zmienić. Dłuższe czekanie może powodować, że w momencie przyjścia przerwania flagi są ciągle ustawione - i gubisz dane. Dość łatwo to wykryć programowo, więc możesz sprawdzić czy taka sytuacja ma miejsce.
Od pewnego czasu walczę z chińską płytką (blue-pill) z STM32F103 na pokładzie Przeczytaj ten wątek i kup sobie inną płytkę. https://www.elektroda.pl/rtvforum/topic3... Jeśli koniecznie chcesz się męczyć z chińskimi podróbkami, to na mojej stronie ( http://www.freddiechopin.info/ > Download > ARM > Przykłady > stm32_blink_led) znajdziesz szablon...
kardynalny błąd -> oczekiwanie na co, na TC==1 ? Oczekiwanie na cokolwiek w przerwaniu jest kardynalnym błędem. Przeciez w notce katalogowej zalecają poczekać po zakonczeniu transmisji na TC. Czy aby napewno piszą to w kontexcie przerwań, czy może poczekania przez wyłączeniem danego modułu peryferyjnego? Poza tym nie odpowiedziałeś na moje pytanie,...
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ł...
Bit RXNEIE włącza przerwanie od dwóch flag: RXNE i ORE (overrun) - patrz tabelka USART interrupt requests . Odczyt z DR kasuje RXNE. ORE jest kasowane przez (cytat z opisu bitu ORE): "an read to the USART_SR register followed by a read to the USART_DR register".
No to masz 4-bajtowy znacznik początku ramki, w dodatku niejednoznaczny, tylko po co? Przy automacie masz zmienną - stan automatu, którą elegancko robi się jaku enum, a dalej switch zapewniający obsługę kolejnego bajtu i przejścia pomiędzy stanami. Do obsługi tego początku, jaki masz, potrzebujesz czterech stanów automatu (piąty stan to odbiór danych)...
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Na 99% nie. Można kombinować z auto-reload i transmisją jednego bajtu, o ile uda się przekonać DMA, że docelowy UART jest pamięcią, a nie peryferialem i o ile będziesz miał pewność, że nigdy dane nie będą równocześnie nadchodziły w takim tempie, żeby zapchać nadajnik. Czyli: nawet gdyby się udało, to jest to rozwiązanie wysoce niepewne i zawodne. Co...
Trzeba wyłączyć przerwanie/przerwania, to chyba oczywiste... 4\/3!!
Proponuję Ci zerknąć na ten kod - https://github.com/DISTORTEC/distortos/b... - robi dokładnie to co chcesz osiągnąć i w dokładnie ten sam sposób. Tutaj kod przerwania - https://github.com/DISTORTEC/distortos/b...
Musisz wyzerować flagę, a czy zrobisz to normalnie czy przy użyciu tej bzdurnej biblioteki to już nie ma znaczenia. 4\/3!!
Powtórzę po raz trzeci. Jeśli CCR <= ARR, znacznik ustawia się przy zrównaniu wartości licznika z CCR. W przeciwnym przypadku znacznik CC ustaia się razem z UIF. Co jeszcze nie jest jasne? Z czym właściwie jest problem? W procedurze obsługi przerwania reaguje się na zdarzenia, na które chce się zareagować. Nie chcesz reagować na CC - to nie reaguj....
A skoro obsługujesz nadawanie z bufora. Zapewne warto sprawdzić czy przerwanie od TXE jest włączone.
(at)_lazor_ Reset Handler Raczej ciężko nazwać to przerwaniem. Stany wyjątkowe, jakim jest NMI i RESET, to przerwania o ujemnym priorytecie. Przerwań tych nie można wyłączyć. w ARM RESET jest przerwaniem.
Bufor cykliczny, inaczej też nazywany kołowym, to najlepsze rozwiązanie do tego co chcesz zrobić. Tym bardziej, że jak zaznaczyłeś danych będzie sporo. Każdy odebrany znak wpisujesz do bufora i przesuwasz wskaźnik zapisu o 1. Możesz to robić przez obsługę przerwania od portu szeregowego, albo możesz do tego wykorzystać DMA. Dlaczego bufor? Ponieważ...
Ściągnij z mojej strony przykład dla STM32 (którykolwiek), to zobaczysz jak to jest zrobione i jak powinno być zrobione... http://www.freddiechopin.info/pl/downloa... 4\/3!!
1.Tworzysz Mutexa żeby tylko jeden task miał dostęp do interfejsu SPI I2C ... 2. Tworzysz semafor na dany interfejs. 3. Tworzysz driver do obsługi interfejsu, najlepiej z obsługa przerwań od tego interfejsu. 1. Blokujesz dostęp do interfejsu mutexem 2. Zlecasz driverowi co gdzie ma wysłać lub skąd odebrać. Driver w tym czasie blokuje semafor aż do wykonania...
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...
Wg mnie się da - http://infocenter.arm.com/help/index.jsp...
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...
Podłączenie przez kondensator faktycznie pomaga, jednak jest to sygnał który zmienia się ~200 razy na sekundę, dlatego niestety odpada. 200Hz? Przecież to prąd stały... Kondensator 100n z rezystorem 10k mają stałą czasową odpowiadającą częstotliwości 1kHz, z rezystorem 100R już jest 100kHz, więc gdzie tutaj jakiś problem? Tak jak już rb401 napisał...
powtarzam SYSCFG włączone poprawnie?
1. funkcja bez atrybutu interrupt nie odkłada na stos wartości rejestrów które modyfikuje potem w "ciele funkcji" - czy to znaczy, że wartości tych rejestrów są tracone czy też procesor sam z siebie (sprzętowo) je zapamiętuje na stosie przy wejściu w obsługę przerwania? Informacje jak zwykle w dokumentacji rdzenia. Po co są zerowane trzy ostatnie bity...
Zajrzyj do skryptu linkera, zobacz jaki jest rozmiar stosu. 4\/3!!
Nie ma to jak stworzyć sobie problem a potem dziwaczne metody rozwiązania. Trochę programów na Cortexy napisałem, i nigdy nie miałem potrzeby zapamiętywania stanu przerwań przy ich chwilowym blokowaniu, i samo blokowanie bardzo rzadko jest potrzebne. Nie znaczy to oczywiście, że taka potrzeba w ogóle nie występuje, ale poza bebechami RTOS występuje...
Złą flagę czyścisz w przerwaniu (13 ≠ 1) ;)
Jeżeli znajdziesz wiecej niż 372 razy to stawiam skrzynkę... czego tam chcesz:) Skrzynkę złotych sztabek? <: 4\/3!!
Spróbuj mojego kodu do konfiguracji rcc na 72 MHz (u mnie działa na stm32f107 bez żadnych problemów), w przypadku wykorzystania kwarca 25 MHz [syntax=c] void rcc_conf(void) { RCC->CR |= RCC_CR_HSEON; while ((RCC->CR & RCC_CR_HSERDY) == 0); FLASH->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR |= FLASH_ACR_LATENCY_2; RCC->CFGR2 = RCC_CFGR2_PREDIV1_DIV5 | RCC_CFGR2_PREDIV2_DIV5...
Przecież możesz dodać dzielnik napięcia na wejściu... 4\/3!!
Żeby uaktualnić stan preskalera należy wywołać sygnał "Update generation". TIMx->EGR = (1<<0);
odczyt rejestru - modyfikacja - zapis do rejestru . Nie powinno cię dziwić, że jeśli między tymi operacjami wystąpi przerwanie, w którym modyfikowane są ODR bitbandingiem i nie tylko to cała operacja z przerwania zostanie anulowana.
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...
STM32F10x Standard Peripherals Library - niestety ST wygenerowalo dokumentacje w formie pliku pomocy i nic z tym się nie zrobi - popprzednia wersja biblioteki (2.0) miała to w wersji pdf. Ale to właśnie w tym pliku dokładnie opisane są wszystkie funkcje bilbioteki związane z pracą peryferiów plik stm32f10x_it.c zawiera definicje wszysktich funkcji odnoścnie...
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Stos, pamięć, kto to wie? Raczej HAL-a nikt nie będzie debugował. Takie podmianki część plików stąd część nie wiadomo skąd - raczej nigdy nie działają. Zrób sobie projekt z Cube i zaimportuj. Nie sądze abyś miał problemy. Albo napisz sobie to samo na rejestrach i zobacz. Praca na 10 minut.
brak dwóch przerwań typowych dla M4.
Spróbuj tak: [syntax=c]//GPIO_EXTILineConfig(GPIO_Por... GPIO_PinSource13|GPIO_PinSource15); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC... GPIO_PinSource13); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC... GPIO_PinSource15);[/syntax]
Stos dla przerwań ustawiłeś? 4\/3!!
mozesz zrobic tak: masz menu -> wybierasz jakas opcje z menu-> w kazdej z opcji wykonujesz zwyklego while(1) z warunkiem po wykonaniu petli na jakas flage, ktora ustawiasz w przerwaniu. Teraz w przerwaniu ustawasz zwykly powrot do menu (czyli w przerwaniu np. od nacisniecia przycisku czy od czegokolwiek co Ci bedzie pasowac ustawiasz tylko jakas flage...
Znacznik EOC jest kasowany programowo lub przez odczyt rejestru ADC_DR, co jest opisane w p. 11.12.1 Reference Manual. Wygląda na to, że odczytanie danej z ADC przez DMA kasuje znacznik, nim Twój program zdąży zauważyć jego zmianę.
Keil jako kompilator i IDE. Wszystko do tej pory działało, program rozwijam od co najmniej miesiąca i dopiero teraz jest problem. Malloc dla 20 elementów działa bez zarzutów. Jednak teraz mam potrzebę przesyłać paczki większe 0,5k - 2k i gdy alokuje taką ilość bajtów, wywoływane jest przerwanie HardFault.
To że generowane jest przerwanie i kod się zawiesza nie jest winą OpenOCD tylko kodu... sub.w sp, sp, #24576 ; 0x6000 sub sp, #32 w tym miejscu funkcja alokuje sobie na stosie 24576 + 32 bajtów - nie sądzę aby twój stos to przeżył... 4\/3!!
Witam W trybie FS możesz mieć mały problem z freeRTOS i USB jeśli chodzi o wysłanie danych z Stm32 do PC. W nim nie masz DMA i żeby wysłać dane musisz albo sprawdzać sam czy pierwsze 64 bajty zostały wysłane i potem wysłać następne (np co 1ms) lub zostawić jak masz zrobione w bibliotece od Stm, czyli oni włączają przerwanie Tx FIFO Empty Interrupt,...
Funkcja, którą wywołujesz zajmuje troche duzo czasu jak na przerwanie. Radziłbym ją wyrzucic do main a w przerwaniu ustawiać jakąś flagę, że było przerwanie czy coś w tym stylu.
Myślę, że punkt pierwszy jest bardziej adekwatny. A konkretnie proponuję przy takich założeniach powrót do źródeł czyli zamiast przerwania, machanie pinem. i inteligentne wplecenie tego w całość reszty programu.
Przecież wyraźnie widać, że STM odbiera 8 bitów, a w Realterm jest ustawione 7 bitów. Stąd różnica i obcięty najstarszy bit. Poza tym, dane się zgadzają. Format danych musi być ten sam. STM to pewnie 8N1, Realterm 7E1.
O podwójnym buforze zapomnij w takim przypadku. Przerwanie od końca transmisji i rekonfiguracja. DMA2D?
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).
Pokaż cały kod związany z DMA i przerwaniami. Włączyłeś to przerwanie?
Cześć, Nie dawno zacząłem przygodę z STM32. I mam duży problem nad którym siedzę już parę dni. Chciałem stworzyć prostą komunikację z komputerem gdzie przez terminal odpowiednimi komendami będzie można gasić i zapalać diody i w drugą stronę przesyłać które diody są zapalone. nie wiem gdzie jest tu błąd więc Ustawienie GIPO void GPIO_Conf(void) { GPIO_InitTypeDef...
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...
Zdefiniuj "nie działa". Nic nie odbiera? Bo w sumie to nie powinien. Żeby odebrać coś za pomocą przerwania należy te przerwania włączyć [syntax=c] NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemp... = 0; NVIC_InitStructure.NVIC_IRQChannelSubPri... = 0; NVIC_InitStructure.NVIC_IRQChannelCmd...
Jeśli chcesz używać przerwań, to musisz zadeklarować rozmiar stosu dla przerwań... W przykładzie nie ma przerwań, więc rozmiar tego stosu wynosi 0. 4\/3!!
Przyczyny najpewniej należy szukać w bibliotece do STM32 (FWlib) . Nigdzie indziej. Twoj kod wydaje się być poprawny, aczkolwiek nadal nie istnieje tu taka dusza co by wiedziała, co dokładnie robi Czyżby nigdzie? ...
Jak wygląda sprawa z przerwaniami? Tam zamiast przerwań są używane callbacki. To nie tak jest. Callbacki są całkiem do czego innego. W programie HALowym, to użytkownik pisze obsługę przerwań sprzętowych (tak jak w klasycznym podejściu "rejestrowym") a specyfiką HAL jest tylko to że dostarcza pewnych gotowców na obsługę przerwań. Przykładowo weźmy uart....
Oczywiście w przerwaniu UART, oczywiście bez zaciemniania wywołaniami HAL, żeby kod był krótki, czytelny i niezawodny. ;) Akurat w HAL to jest bardzo proste, bo kompletna obsługa przerwania od UART jest już w nim napisana a potrzeba tylko napisać swój callback od kompletności odbioru i wykonać parę organizacyjnych spraw. Jakby co, to koledze damdam...
przerwać stm32 stm32 usart1 przerwać stm32 bootloader przerwać
hyosung moduł przełożenie przekładni planetarnej pierścienie tłoka
Pilot do wieży Philips nie działa po wymianie baterii Silnik benzynowy przerywa powyżej 2500 obr/min