Podczas zapisu do Flash w uC, które mają jeden bank Flash, próba odczytu powoduje zatrzymanie procesora i poczekania do końca zapisu. Nie jest to problemem przy obsłudze przerwań UART, bo czas zapisu jest krótszy, niż czas transmisji znaku przez UART.
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)....
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....
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...
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...
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...
https://obrazki.elektroda.pl/2553827400_... Cześć, pod tą niecodzienną nazwą tematu prezentuję projekt małego, automatycznego odtwarzacza muzyki do umilania posiedzeń na toalecie. Oczywiście to jedno zastosowanie, w innych sytuacjach pewnie też może się przydać ;) Głównym założeniem była niewielka złożoność, banalny interfejs, bezobsługowość...
https://obrazki.elektroda.pl/9151185000_... Autor poniższego zestawienia jest inżynierem i konsultantem wsparcia dla systemów wbudowanych. W swojej karierze poznał on szereg różnych architektur mikrokontrolerów, różniących się wydajnością, wyborem peryferii, poborem zasilania etc. Wybór odpowiedniego układu stanowi zawsze o sukcesie...
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.
https://obrazki.elektroda.pl/4504656600_... https://obrazki.elektroda.pl/4128476100_... https://obrazki.elektroda.pl/1757195800_... https://obrazki.elektroda.pl/9734649000_... https://obrazki.elektroda.pl/4717614300_... https://obrazki.elektroda.pl/4176235900_...
https://obrazki.elektroda.pl/9151185000_... Druga część artykułu o najtańszych nowych mikrokontrolerach z roku 2017. Ekosystem developerski Środowisko developerskie mikrokontrolera ma ogromny wpływ na jakość pracy z nim i w konsekwencji - na produktywność. Na to składają się różne czynniki – jakość IDE, dostępne biblioteki, płytki...
Zapoznaj się z [url=http://mikrokontrolery.blogspot.com... dedykowanym dla STM32.
U mnie w kodzie nie ma ...... /* * sterownik dla Margas * wersja dla NUCLEO STM32F446RE * działa dzieki życzliwości i zaangarzowaniu członków forum ELEKTRODA * wspomagających moją skromną wiedzą programistyczną * za co jestem im bardzo a to bardzo wdzęczny * data xx-xx-2024 */ #include "STM32TimerInterrupt.h" #include "STM32_ISR_Timer.h"...
Mam następujące zadanie; stworzyć projekt na laboratoria z mikroprocesorów. Męczę się z tym już od początku semestru i szczerze nie mam pojęcia gdzie robię błędy. Liczę na moc internetu i oczywiście odpłatnie na pomoc. Pełna specyfikacja projektu: 1. Komunikacja z komputerem za pomocą interfejsu USART z buforem kołowym. 2. Zaprojektowanie i implementacja...
Rozumiem że Microchip został użyty jako przykład, w dodatku poradnik przetłumaczony. Nie mam nic przeciwko, bardzo dobra robota, nie dziwi mnie brak komentarzy bo co tu komentować? Świetnie opisane, nic tylko używać... Ale popatrzyłem na to i zapytałem siebie czy mnie jara, coś by trzeba skomentować i jedyne co uwiera podczas lektury to Microchip i...
Witam serdecznie, Przerobiłem chyba najbardziej popularny przykład ze strony Freddie'go aby obsługiwać STM32F100RB na płytce STM32VL Discovery wraz z odpalaniem z RAMu i właściwie podstawowa funkcja - czyli nieśmiertelne mruganie diodą - działa wyśmienicie. Jeśli ktoś chce szybko uruchomić swój pierwszy program na STM32 VL Discovery przy użyciu Eclipse...
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...
Witam posiadam STM32 F042K6, posiadam również czujniki które zmieniają swój stan z wysokiego na niski podczas wykrycia przeszkody. Potrzebuje zamienić ify na przerwania tzn. [syntax=c] while(1){ przodprawo = HAL_GPIO_ReadPin(GPIOA, przod_prawo_Pin); przodlewo = HAL_GPIO_ReadPin(GPIOA, przod_lewo_Pin); prawo = HAL_GPIO_ReadPin(GPIOB, prawo_Pin); lewo...
Wykorzystując timer 16-bitowy oraz preskaler 65535 chciałbym wywołać przerwanie co 1 minute(59,6 sekundy) i w efekcie naprzemiennie zapalać i gasić diodę: [syntax=cpp] void Clock_init(void); void GPIO_init(void); void Tim1_init(void); int main(void) { Clock_init() ; GPIO_init(); Tim1_init(); while(1){;} } void Tim1_init(void) { TIM_TimeBaseInitTypeDef...
Witam, 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ć....
Witam, Naciąłem się na problem z przerwaniami z którymi nie mogę sobie jak na razie poradzić. Jeśli w bootloader'ze nie wykorzystam przerwać, to po skoku do aplikacji wszystko działa ok, jeśli natomiast zostanie tam wykorzystane, to aplikacja już ich nie wykonuje. Wydaje mi się że ma to związek z wskaźnikiem przerwania, ale nie mogę znaleźć rejestru...
Witajcie. Jest taki problem, że przerwanie może się wciąć w dowolnym miejscu. Nawet w środku warunku if. [syntax=c] if(wskaznik != 0 && *wskaznik > COŚ){ wskaznik++; } [/syntax] przerwanie może nam się wciąć i zmienić wartość gdziekolwiek. Jak powstrzymać wywołanie przerwania ale tak by zaznaczało się przyjście przerwania i po ponownym włączeniu obsługi...
Witam, Szukałem na forum i nie znalazłem... Mam taki oto problem, przerwania są skonfigurowane w następujący sposób: [syntax=c] NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGr... NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemp...
Uczę się programowania uC w C. Bazuję na STM32F411. Programy opieram na bibliotekach HAL. Ostatnio sporo czasu poświęciłem na szukanie błędów w swoim kodzie. Okazało się że struktura mojego programu była nieprawidłowa. Dopiero po jakimś czasie przypomniało mi się że przerwania powinny być jak najkrótsze. I teraz mam pytanie: Co można dawać w przerwaniach,a...
Witam ponownie tym razem próbuję uruchomić przerwanie od TIM7 w mikro STM32 F303VC6 na płytce Discovery F3. Napisałem konfiguracje NVIC i TIM7 po czym uruchomiłem całość i owszem to co jest w funkcji obsługi przerwania jest wykonywane ale mam wrażenie, że pełną częstotliwością a nie co 1 sekundę tj ustawiłem. Prosiłbym o jakieś wskazówki bo pierwszy...
Zaczynam zabawę z stm32. Chciałbym obsłużyć USART przez przerwania. Większość przykładów opiera się na stdperiph lib, chciałbym uniknąć stosowania tej biblioteki. Używam tylko nagłówka stm32f10x. Wydaje się że włączyłem przerwanie przez NVIC_EnableIRQ(USART1_IRQn) bit w rejestrze USART1->CR1 również został ustawiony i w zasadzie na tym utknąłem. Prosiłbym...
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?
Witam, Używam FSMC do obsługi wyświetlacza, a timera do generowania przebiegu który steruje serwomechanizmami. Zauważyłem taką przypadłość, że jak coś zmieniam na ekranie to serwa lekko drgają, co zapewne jest spowodowane jakimś opóźnieniem w wysterowaniu wyjścia przez zegar i/lub uruchomieniu przerwania które ładuje następna wartość do rejestru (jeden...
Witam, mam problem z programowa eliminacja drgań styków w przerwaniu. Wiem, że temat mógł się przewinąć wiele razy ale nie znalazłem odpowiadającego mi rozwiazania. Wykorzystuje przerwanie EXTI, w ktore zostaje wywoływane w momencie wykrycia opadajacego zbocza. W przerwaniu mam zamiar uruchomić timer1, w którym wykorzystuje Input Capture by zatrzasnąć...
Witam! Nie mogę dojść do tego co się dzieje. W zamierzeniu program powinien czekać na ustalone znaki z USARTa i odpowiedzieć kilkunastoma znakami tekstu. Objaw jest taki, że po otrzymaniu 1 znaku odpowiada trzema prawidłowymi znakami a potem siedzi w przerwaniu z którego nie może się wykaraskać (tzn. nie robi nic innego). Zdarzyło mi się też zaliczyć...
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 -...
mam ustawione przerwanie zewnętrzne ustawione na wyzwalanie zboczem opadającym i narastającym w funkcji obsługi przewania zapisuję sobie do bufora: void EXTI0_IRQHandler(void) { //Check if EXTI_Line0 is asserted if(EXTI_GetITStatus(EXTI_Line0... != RESET) { Buffer[iWriteIdx] = 'I'; GoToNextElement(&iWriteIdx);...
Witam. Mam taki dziwny problem - odpalam sobie przerwanie co 10ms, w nim chciałem zrobić coś w stylu bufora dla danych wejściowych, ponieważ mam przerwanie z innego timera, które trwa dość długo (odczyt temp, ustawienie na podstawie tej wartości stanu wyjść, wypisanie temp. na lcd). Na to przerwanie dałem wyższy priorytet, i po prostu sprawdzam stan...
Arduino to kobyła, na rejestrach traciłbyś mniej-więcej połowę czasu na pracę w ten sposób. A pozostaje jeszcze nakładka od arduino, inne źródła przerwań i obsługa wejścia ;) Ewidentnie masochizm, zwłaszcza jeśli chodzi o zwykłe machanie pinem. Nie prościej zrobić wstawkę w c/asm ? 6 linijek kodu i zapominasz o tej sprawie.
Pisałem to już 100 lat temu. Kod USB ST nie jest wielobieżny; sam peryferial "nie jest wielobieżny", bo wymaga operacji bitowych (realizowanych jako logiczne AND i OR) na rejestrach, w których każdemu endpoint odpowiada jeden bit (a jako pasjonat bitband zapewne zauważyłeś, że USB nie leży w obszarze bitband). Wszelkie procedury operujące na endpointach/kanałach...
Problem pojawia się na mikrokontrolerze STM32F100RB, aczkolwiek wydaje mi się, że nie ma on związku z samym mikrokontrolerem. Próbuje odczytywać dane z ultradźwiękowego anemometru, który jako jedyną magistralę cyfrową posiada RS485 (ma też wyjścia analogowe). Podłączam go do mojego sterownika przy pomocy takiego konwertera: . Jest on oparty na układzie...
Zeruje falgi żądań przerwań w rejestrach peryferiów: void DMA1_Channel1_IRQHandler(void) { GPIOB ->ODR ^= GPIO_BSRR_BS13 ; // Zerwoanie flagi żądania przerwania wpisaniem 1 DMA1->ISR |= DMA_ISR_HTIF1; } void ADC1_2_IRQHandler(void) { if(ADC1->SR & ADC_SR_EOC) { GPIOB ->ODR ^= GPIO_BSRR_BS12 ; ADC1->SR...
Korzystam z: Układ STM32 P103 (procesor STM32 F103 RBT6) Programator ARM-USB-OCD-H Środowisko CrossWorks v2.1.1 Problem: Pisząc własną obsługę USB wzorowałem się na przykładzie dla Keila (USB HID) i paczce z przykładowymi programami do USB ze strony Olimexa dla układu STM32 P103. Pierwszy (dla Keila) nie działał (operował na innych PINach itp.) ale...
i co mogę powiedzieć 8051 - ale w bardzo fajnej wersji, dużo rejestrów, szybkie, ciekawe peryferia, programowanie po UART. Prawdę mówiąc wyglądają lepiej niż sporo AVR-ów.... 20..30 lat temu byłaby to rewelacja, teraz raczej kit niż hit. Architektura 8051 ma spore ograniczenia i nawet gdy jest 1-taktowa nie zrówna się (przy tym samym zegarze) z AVR....
Problem polega na tym, że potrzebuję 2 liczników do zliczania impulsów z 2 źródeł, a te źródła to piny PB6 i PB7, czyli jak wskazuje nota katalogowa uC odpowiednio kanały 1 i 2 timera TIM4: http://obrazki.elektroda.pl/5000204900_1... Myślałem, że jak są 2 kanały to każdy z nich może być źródłem sygnału taktującego i każdy kanał może...
Odkopuję temat, ponieważ mój problem również tyczy się przerwania od przycisku, przy użyciu tych nieszczęsnych bibliotek :) Wydaje mi się, że wszystko jest włączone i zainicjowane jak należy... Dokładnie przeszedłem przez UM, oraz posiłkowałem się tematami na 'stackoverflow'. Przerwanie następuje, ale trwałe, tzn wszystko się zatrzymuje migająca dioda...
Jej, ślepy jestem. Wyrzuć atrybut static z deklaracji SysTick_Handler !!! Ze static jej nazwa staje się prywatna dla modułu i niewidoczna dla linkera. Dodano po 15 Freddi: ty błądzisz :) Kompilator w obsłudze przerwania musi zapamiętać rejestry grupy saved, bo rejestry grupy temp są zapamiętywane automatycznie przez procesor. Tak samo każda inna procedura...
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Bardzo ciekawie się prezentują STM32 ale to chyba zupełnie inny rdzeń. Najnowszy z "popularnych", czyli Cortex-M3 (architektura ARMv7). Bęzie łatwiej od nich zaczynać? Na pewno nie, w necie jest pełno informacji o ARM7, Cortex-M3 to wciąż nowość w świecie mikrokontrolerów. Nie mówię już nawet o książkach, kursach i dokumentach. 4\/3!! Książki zaraz...
ADC1_2_IRQHand _ er Chyba koło fortuny się ta gra nazywała (; 4\/3!!
Musisz wyzerować flagę, a czy zrobisz to normalnie czy przy użyciu tej bzdurnej biblioteki to już nie ma znaczenia. 4\/3!!
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...
Jeżeli skok jest z przerwania to HardFault jest spowodowany tym, że zmieniasz wskaźnik stosu w obsłudze przerwania.
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...
Spróbuj korzystać z funkcji NVIC_EnableIRQ() oraz NVIC_DisableIRQ(). 4\/3!!
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.
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...
Problemem było chyba to, że nie włączyłem globalnych przerwań.
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....
W internecie pisali że w tym pliku się trzyma wszystkie obsługi przerwania, ale jak nie trzeba to ok
Witam kolegów. Nie chcę zakładać podobnego tematu, więc zapytam się tutaj. Czy jeśli mam obsługę I2C na przerwaniach, to jest taka możliwość, aby całkowicie zawiesić STM32 przy wysłaniu z funkcji I2C_CR1_START ? Przy założeniu, że coś jest niedopracowane w obsłudze przerwania ?
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...
Zacznij od określenia protokołu transmisji - w jaki sposób będziesz przesyłał te dane (znakowo/binarnie), jaka jest ich długość, po czym program może je rozpoznać, czy i jak sprawdzać poprawność transmisji. Zastanów się nad strukturą oprogramowania - same przerwania, RTOS, czy (w ostateczności) jakaś pętla zdarzeń? Potem dopiero planuj programową obsługę...
Skoro plik main.cpp jest plikiem C++, a wektory są funkcjami z C, to handler obsługi przerwania musi mieć ozdobnik `extern "C"`. Wstawiaj kod i logi w odpowiednich znacznikach (code/syntax), bo nie da się tego czytać.
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ń
Zrób wegług opisu z https://forbot.pl/blog/kurs-stm32-f1-hal... Opisany jest tam sposób obsługi przerwania EXTI.
Ponieważ PD2 nie da się skonfigurować jako UART5_TX to nie można zrealizować pół-automatycznego zegara. Pozostaje tylko działanie rdzenia lub przesłanie ciągu danych z użyciem DMA do GPIOD->BSRR dla PD2. Odczyt danych z PA15 będzie wtedy synchronicznie ze zmianą stanu pinu PD2. Obsługa w przerwaniu będzie kosztować trochę więcej, ale też jest możliwa....
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...
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ść...
Domyślny startup może np. źle konfigurować stos/stertę albo nie definiować nazw procedur obsługi przerwań, więc Twoje obsługi mogą się nie wywoływać.
Powiedzmy że w obsłudze przerwania od RX czekasz na jakiś 0xA3 Koncepcja jest nie najgorsza pod warunkiem, że w ciągu danych nie występuje 0xA3. Jakby na to nie patrzeć nie skreślałbym jednak timeouta. Szczególnie, że jeśli użyjesz sprzętowego to zbieranie danych możesz zupełnie przerzucić na DMA.
Hej. Czy moglibyście się podzielić jakimś sprawdzonym kodem do obsługi I2C (pooling, przerwania, etc) na STM32, tylko na nowsze rdzenie niż F103 - np. F03x, F3xx, F4xx, etc. Z góry dziękuję.
stm32 przerwań stm32 wyłączenie przerwań obsługa przerwań bascom
ładowanie akumulatora regeneracja karta graficzna pikseli pakiet 18650 ładować
regulator wentylatora komparator ominąć immobilizer
Jaki zasilacz do Lenovo M83 z GTX 750 i Pentium G3220? Wyłączanie pompy obiegowej w kotle PWHC 24-28-33