Na początku podziękuję za dobry tutorial. A teraz mam prośbę. Próbowałem odpalić przykład z biblioteki STM32_USB-FS-Device_Lib_V3.3.0 (Virtual_COM_Port). Po pewnych bojach udaje mi się wszystko skompilować, natomiast po uruchomieniu program staje w nieskończonej pętli w funkcji static void __Default_Handler(void) z pliku vector.c. Czyli w tym pliku...
jak sobie poradziłeś z tym problemem, może pamiętasz jeszcze, bo mam podobny problem, tylko mi wiesza się już na pierwszym sprawdzaniu zdarzenia I2C_GenerateSTART(WM88_I2C,ENABLE); //Test on EV5 and clear it while(!I2C_CheckEvent(WM88_I2C, I2C_EVENT_MASTER_MODE_SELECT)); czy da sie to zrobić w taki prosty sposób na tej płytce, bo wyczytałem gdzieś że...
Normalnie ARM startuje z adresu 0x0 i tam powinien być cały wektor przerwań do 0x20. Ty jednak skaczesz do aplikacji z ofsetem więc twój wektor przerwać powinien być odpowiednio przesunięty, a ARM o tym poinformowany. Jeżeli nie poradzisz to poszperam powinienem mieć przykład. [url=http://www.at91.com/forum/viewtopic...
Kolejne pytanie. Wiadomo, że czasem przy obsłudze układów peryferyjnych trzeba na coś czekać. Np na flagę: [syntax=c] while(!(I2C1->SR1 & I2C_SR1_ADDR)); [/syntax] Jeżeli coś będzie nie tak z urządzeniem to może się zdarzyć, że ten while się po prostu nie skończy. Kod powinien być tak przygotowany aby po określonym timeoucie przerwać działanie funkcji....
Witam Od niedawna bawię się uC STM32 i krok po kroku próbuję nauczyć się ich obsługi. Słowem wstępu: Mam płytkę ZL31ARM, pewne doświadczenie z programowaniem w C/C++ i zupełny brak doświadczenia z mikrokontrolerami. Mam już za sobą mruganie diodami i proste pętle opóźniające; obecnie chcę nauczyć się obsługi przerwać przy wykorzystaniu EXTI i IO. Korzystam...
Najbezpieczniej jest mieć stos "na początku RAMu kropka". Nie "za zmiennymi", tylko na fizycznym początku pamięci, PRZED tymi zmiennymi. W CrossWorks jest właśnie inaczej - adres wierzchołka stosu jest za obszarem zmiennych. Większość procesorów w których SP jest dekrementowany przy odkładaniu danych stos ustawia się na końcu pamięci. Jest takie przysłowie...
Cześć. Dalej nie udaje mi się uruchomić tego modułu (RFM22B). Po tym jak staram się wysłać dane odczytuję rejestr przerwać i okazuje się, że mam błąd FIFO overflow/underflow. Nie wiem też jak sterować GPIO_0 i GPIO_1 dla tx i rx states. Czy ktoś kto już przeszedł przez podobne sprawy mógłby coś mi podpowiedzieć. Rejestry ustawiałem zgodnie z excelem...
Co to są za bzdury, gdzie ty widziałeś 16bitową atmege?! ------------- Rodzina propellerów nie zadziwia niestety niczym - scalaki są drogie, ciężko dostępne, i wolne . Naczytałem się kiedyś materiałów na ich temat. 1. Spin to badziewie. Sami się przyznali do tego, że soft w spinie marnuje sporo mocy obliczeniowej rdzeni. Siłę procka widać dopiero wtedy,...
Choć dopiero zaczynam przygodę z STM32 to po mojemu nadpisujesz strukturę i dlatego zawsze działa Ci ostatnie zdefiniowane przerwanie.
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.
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...
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.
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!!
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ł...
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ń
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...
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).
Zerowanie flagi na końcu przerwania - niedopuszczalne
Nie bardzo wiedziałbym jak tego użyć. Chyba że jakiś przykład miałby ktos, kto to już robił. A może tak: [syntax=c] #include <time.h> ... struct tm * loctim ; // struktura zawiera pola typu tm_year czy tm_min time_t tt ; // odczytywanie licznika tt = RTC->CNTH; tt = tt << 16; tt = tt | RTC->CNTL; loctim = localtime(&tt) ; ......
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...
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...
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ż...
powtarzam SYSCFG włączone poprawnie?
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.
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
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!!
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!!
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ę.
Mam jeszcze pytanie odnośnie samego działania SWD i programowania... Jeśli BOOT0 = 0 to startuje ten kod który jest we Flash. Jak to się dzieje, że mimo działającego programu OpenOCD potrafi przerwać jego pracę i zacząć wgrywać program ? Jeśli dobrze doczytałem to jest to tylko możliwe jeśli są włączone sygnały SWDIO i SWCLK ? i drugie pytanie: Jeśli...
O podwójnym buforze zapomnij w takim przypadku. Przerwanie od końca transmisji i rekonfiguracja. DMA2D?
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.
Będzie tak jak piszesz. Przerwanie po doliczeniu do 999 po czym zerowanie licznika i liczy od nowa
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,...
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? ...
Przeczytaj manual - interesuje Cię przerwanie od przepełnienia (update), a nie porównania (compare). Pozatym przerwania trzeba też włączyć w NVIC. 4\/3!!
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.
A pisałem, żeby nie ruszać _NIC_ poniżej SysTick włącznie... Jeśli weźmiesz tablicę dla STM32F4 bez ŻADNYCH zmian, to Twoje przerwanie zadziała, bo ten obszar tablicy jest identyczny dla tych dwóch rodzin. 4\/3!!
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...
(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...
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!!
A skoro obsługujesz nadawanie z bufora. Zapewne warto sprawdzić czy przerwanie od TXE jest włączone.
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....
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,...
while(DMA1 -> LISR && DMA_LIS... Przyjrzyj się temu dobrze... Już nawet pomijam to, że jest odwrotnie logicznie. UART4 -> CR1 |= (1<<5); // RXNE I po co komu to przerwanie?
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...
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...
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...
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...
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.
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".
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)....
(at)A.T. Debugowanie nie zadziała Ci z Soft Devicem (to co masz na początku flasha). Stos działa mniej więcej tak w przypadku niespełnienia zależności czasowych (które pojawiają się podczas debugowania przykładowo). Więc jeżeli chcesz debugować to: a) bez Soft Device b) możesz ręcznie wyłączyć przerwanie od SD W obu przypadkach nie będziesz miał oczywiście...
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.
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...
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...
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...
^ Fakt, niedopatrzenie... dziękuję za uwagę :) przerwanie jednak nadal nie wykonuje tego, co zaplanowałem. Jakieś inne pomysły ?
Profilaktycznie możesz spróbować procedury zatrzymywania DMA z układów STM32 mających bardziej rozbudowane DMA (np. F4). Sprowadza się ona do tego, że po wyzerowaniu EN musisz go w pętli odczytywać do momentu aż odczytasz tam faktycznie zero. Może coś pomoże, może nie. Zadbałbym też o czyszczenie wszystkich flag DMA przed uruchomieniem transferu (albo...
Wiem , że stary temat, ale czemu koledzy nie używają mechanizmu wyszukiwania znaku w transmisji, która jest sprzętowa....opis w DS dotyczy Modbus, ale działa w normalnym trybie USART. Wpisuje się w miejsce rejestru ADD znacznik np. końca linii - 0x0D, a potem uruchamiamy przerwanie od Character Match. Druga możliwość to przerwanie po np.100 bitach na...
Ja ostatnio rozwiązałem to tak do transmisji danych z 3 osiowego akcelerometru: [syntax=c] sprintf((char *)buforTx,"X%03iY%03iZ%03iE%1c%1c",Buffe... USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //Przerwanie-transmisja [/syntax] Potem w programiku napisanym w C# wyłuskuję z ciągu interesujące mnie dane: http://www.youtube.com/watch?v=d-q6DuQH-...
Korzystam z ds'a układu MCP4728, rev. E. 0. Maksymalna częstotliwość zegara dla I2C przy zasilaniu ~3V (nie 5V), to 400kHz. 1. Załadowanie danych do 4 rejestrów to 83 bity, strona 38. 2. Czas przesłania danych do 2 układów, czyli 8 kanałów, to (1/400 * 83)*2 = 415us. To daje maksymalną częstotliwość odświeżania rejestrów 2,41kHz. 3. W Twojej propozycji...
Proszę o pomoc szczególnie freddiego chopina ponieważ jest autorem plików linkera, startup-a i wektora przerwać(vectors.c), które w innych projektach jak dotąd działałają mi niezawodnie. Zajrzyj do skryptu linkera, przeczytaj ze zrozumieniem jego początkowy fragment, ustaw tak jak trzeba i będzie działać. Kluczową sprawą jest przyswojenie sobie tego...
Witam Też zdarzało mi się zawiesić program podczas obsługi I2C w końcu są tam pętle while a zakłócenie może przerwać komunikacje. Watchdog jest tu wyjściem ale myślę że lepszym rozwiązaniem jest wstawienie w pętle warunku czasowego przy czym trzeba pamiętać że przy spełnieniu warunku należy zresetować I2C.
Hard fault praktycznie zawsze pojawia się gdy załączymy przerwanie, dla którego nie zdefiniujemy handlera. Sprawdź kod pod tym względem, szczególnie przerwanie watchdoga.
Aha - jeśli przerwanie jest w pliku vectors.c to luz - myślałem, że przerwanie masz gdzieś zupełnie indziej. 4\/3!!
Zastanawiam się tylko po co sprawdzać to: [syntax=c]USART3 -> CR1 & USART_CR1_TCIE[/syntax] nie rozumiem powodu. Przecież to jest "This bit is set and cleared by software." Programista nie wie czy ustawił to przerwanie czy nie? Dodatkowo ten zapis: [syntax=c]if(( USART3 -> CR1 & USART_CR1_TCIE) && (USART3 -> SR & USART_SR_TC ))[/syntax] wygląda dość...
Niekasowanie maski przerwania, to tez zachowanie nowicjusza,wychowanego na AVR, gdzie prawie wszystkie flagi sa kasowane automatycznie. Zajrzałem do bibliotek co powinienem zrobić od razu i rozwiązałem problem. Wszystkie opisy w sieci tyczą się serii Fx i ich bibliotek więc mylnie zakładałem, że będą podobne. Obsługa przerwania EXTI powinna kasować...
Sorry, ale nie chce mi się zastanawiać co to jest 0x7081D, 0x180009FF, 1<<7 | 00<<5 czy którakolwiek inna wartość... Myślę, że nikomu się raczej nie będzie chciało, więc z tak napisanym programem możesz się nie doczekać pomocy. Wiem tylko jedno - z tym bonusowym zerem przed innymi wartościami (00<<5) kiedyś się przejedziesz. 4\/3!!
A poza wszystkim - zapewne wisisz ciągle w obsłudze przerwania ADC, którego przyczyn nie kasujesz. Na początek wyrzuć to przerwanie całkiem i nie włączaj go. W praktyce w ogóle przerwanie od ADC ma bardzo ograniczone zastosowanie, zwłaszcza w STM32.
A jak znaleźć tą wartość powyżej/poniżej której ma zachodzić przerwanie i komutacja? Dla komparatora sprawa jest w miarę prosta - podajesz sygnał zsumowany i sygnał z danego odczepu (ten sygna zmienia się w zależności od krok komutacji) na komparator i tyle. W przypadku ADC podobnie - przełączasz ADC w tryb róznicowy - wykrywasz przejście z - na +...
Fredie, Prawie, że poszło. Stary projekt się skompilował, wgrałem działa. Niemniej projekt był oparty na jakichś starych twoich przykładach jeszcze z roku 2009. Chciałem zaktualizować projekt za pomocą twoich najnowszych przykładów, wobec czego wywaliłem podkatalog Setup z plikami hdr_special_registers.h, startup.S, stm32f103ve_rom.ld, vectors.c oraz...
Tim2 i tak powinien mieć większy "priorytet", mimo ustawionego takiego samego priorytetu. Przerwanie od TIM2 ma niższy numer niż od TIM6, więc w przypadku takich samych priorytetów grupowych i podpriorytetów, przerwanie które ma niższy numer zostanie obsłużone pierwsze.
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.
Po co? Nie możesz w przerwaniu czekać na cokolwiek. Masz zrobić wyłącznie krytyczne czasowo operacje i opuścić przerwanie natychmiast. To zdarzenie, na które czekasz, ma wyzwolić przerwanie. Od czekania masz zegar systemowy, który zwykle implementuje się do dostarczenia taktu 1ms.
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...
Skoro zerujesz ręcznie piny to czego się spodziewasz jeśli nie wyzwolenia przerwania od zbocza opadającego? Moduł EXTI działa niezależnie od tego czy ma włączone przerwania czy nie - jeśli są wyłączone to po prostu nic się nie wywoła, ale flagi zostaną sprawdzone. Jeśli włączysz przerwanie, a flaga była ustawiona, to przerwanie zostanie aktywowane najszybciej...
Witam, Jestem poczatkujacy jesli chodzi o programowanie pod architekture Cortex. Posiadam zestaw ewaluacyjny STM32 Butterfly. Probuje skonfigurowac przerwanie, aby wykonało się po naciśnięciu przycisku. Debugujac program widac, ze po nacisnieciu przycisku flagi sa ustawiane, ale funkcja obslugujaca przerwanie nie jest wywolywana. tak wyglada moj kod...
Przerwanie leci wtedy gdy: 1. jest zezwolenie na CAN TX (TMEIE) 2. jest któreś z RQCP0, RQCP1 lub RQCP2 RQCPx natomiast jest =1 wtedy gdy mailbox jest EMPTY. Wynika z tego że przerwanie jest generowane gdy skrzynka jest pusta. (niezależnie od tego czy wysyłanie zakończyło się błędem czy nie... gdzie w przypadku auto powtarzania nigdy się chyba z błędem...
No ale dokumentacja dla Windowsa raczej średnio pasuje do dokumentacji dla FreeRTOSa i FreeMODBUSa [; Idea jest taka, że owszem - jeśli jedyne co może przerwać MODBUSa to mignięcie diodą, to problemu nie ma, ale jeśli ma być przerwane przez inny wątek, który będzie nieprzerwanie działał przez 5s to już średnio to zadziała, nawet jeśli tenże wątek nie...
Ok, problem został po części rozwiązany. Resetowanie mastera w trakcie komunikacji nie powoduje zatrzymania transmisji. Zostało to rozwiązane permanentnym włączeniem przerwania od RX na slave. Wcześniej w pętli while wołana była funkcja która włączała przerwanie, czekała na dane i wyłączała przerwanie. Problem za to pojawił się po drugiej stronie. Teraz...
impulsy są generowane przez przerwanie SysTick
(at)szczywronek ja sie na L'kach nie znam ;] jak dla mnie, low power to tylko NXP (przynajmniej na razie), ale jak chce poszaleć to biore STM32Fx ;] Ale nadal sądzę, że nikt nie miał powodu tworzyć nowej logiki EXTI pod L'ki, wiec to co mowie powinno sie sprawdzić ;] w szczególności że ST (tak samo jak wiekszość vendorów) lubi copy'ego-paste'a jeśli...
A więc działa. Gratulacje :) Docelowo chcę zrobić co innego: Muszę próbkować 4 kanały ADC1 w przemiataniu i wysyłać wartości po USART do komputera. Tylko, że kanał 4 DMA zajmuje się USART1 TX a kanał 1 ADC więc jeszcze nie mam pomysłu jak to połączyć. Kolizja DMA nie występuje, bo są różne kanały. Po prostu jeden poczeka na drugi. Jak najbardziej sensowne...
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...
Jeśli wykorzystam przerwania od DMA to nie będzie problemu z niedokończoną konwersją w ADC? Chciałem przerwanie od ADC, bo wtedy jestem pewien że ADC zakończyło przetwarzanie próbki.
Hmm, to jak wykonać te przerwanie migania? :)
Jak zrobiłem "tak jak powinno się robić" to działa poprawnie ( wykorzystując przerwanie timera), jednak jak chciałem ręcznie znaleźć zbocza to tak samo jak tutaj - przerwanie od wykrywania zbocza głupiało, a przecież zasada działa jest taka sama ( timer i pin czekają na określone zbocze). To z jakiego powodu jedno działa a drugie nie ? : ) Z góry dzięki...
Czyli gdzie może być problem? :)
Witam! Mam kłopot z uartem w stm32. Wysyła ok, wchodzi w przerwanie od rx uarta i odczytuje jego DR zapisując do tablicy i zwiększając wskaźnik do tablicy żeby był gotowy na następne przerwanie ale ono właśnie nie wystepuje pomimo, że następny bajt przychodzi uartem. Systick co 100ms inicjuje wysłanie zapytania do zewnętrznego urządzenia i urządzenie...
Skacze w maliny, bo przerwanie od TIM2 nazywa się inaczej. 4\/3!!
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!!
Przy break na STM32 zgłoszone zostanie przerwanie (framing error) i tyle.
To niestety nie to :/ Ja potrzebuje, aby przerwanie bylo od DMA na Transfer Complited po zebraniu 64 probek. W tym przykladze, DMA jest skonfigurowane bez przerwan. Wlasnie chodzi o to, ze przerwanie z DMA wywala blad i procek leci w nieskonczona petle.
To ja podniose temat: chodzi o uszczegółowienie logiki działania procesora przy zapisie do wewnetrznego flash. Jesli wykonuje zapis do flash to kontroler wstrzymuje dzialanie programu na czas zapisu/kasowania - to oczywiste. I jesli przychodzi przerwanie a obsluga jest w RAM (tak jak i wektor przerwan) to przerwanie wykonuje sie - to tez oczywiste....
Trzeba jeszcze włączyć przerwania w NVIC przecież... 4\/3!!
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...
WItam, Zrobiłem projekt w Cube do odbierania danych przez UART za pośrednictwem DMA. Wszystko działa. Używam procesora STM32 F0. Teraz mam przerwanie , które uruchamia mi sie, gdy odebrane zostaną wszystkie zadeklarowane znaki. Ale widziałem przykład na tym samym procesorze w bibliotece SPL w którym zrobiono przerwanie które sie uruchamia w momencie...
Trzeba wyłączyć przerwanie/przerwania, to chyba oczywiste... 4\/3!!
OK, ale jakie mam wyciągnąć z tego wnioski żeby rozwiązać problem z odbiorem danych w przerwaniu? Bez debugera przerwanie też nie zapełnia bufora.
stm32 przerwać przerwać stm32 stm32 usart1 przerwać
ariva obrazu testy akumulatorów electrolux blokady transportowe
perpetuum mobile projekt tranzystora
Kontrolka świec żarowych i rezerwy paliwa w VW T5 podczas jazdy Kody zabezpieczające do radia HD MP5 - jak uzyskać?