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, to temu, że timer 6 będzie taktowany z prędkością 2x większa niż magistrala APB1. Wytłumaczenie masz w reference manual (u mnie Doc ID 13902 Rev 11) str. 84, 85.
Pokaż log kompilacji po zrobieniu "clean".
Możesz dowolnie zmieniać tryb pracy Timera.
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!!
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.
Stos dla przerwań ustawiłeś? 4\/3!!
Mam problem z programem w którym timer ma zliczać impulsy (zbocza opadające). Konkretnie zegar timera ma działać w rytm impulsów podawanych na piny TIM4_CH1 i TIM4_CH2, z tym, że osobno liczę impulsy z każdego kanału i generuję osobne przerwanie dla każdego kanału. Liczenie impulsów z dwóch kanałów powinno działać jednocześnie. Impulsy pochodzą od 2...
Uzupełniłem o Dodano po 8 Zmierzyłem stoperem ile czasu utrzymuje się 0 V a ile czasu 0,38 V i wyszło, że 10 s 0V poczym zmienia się na 0,38 V i utrzymuje się przez 10 s i cykl się powtarza, co ciekawe wykasowałem rejestry [syntax=c]TIM3->CCR3 = 500; TIM3->CCR4 = 500;[/syntax] i działa dalej tak samo.
[syntax=c]przerwanie_timera(void) { static uint16_t utimer = 0; if (utimer) utimer --; switch (stan_bramy) { case ZAMKNIETA: if (chcemy_otworzyc) { utimer = MAX_CZAS_OTWIERANIA; otworz(); stan_bramy = OTWIERANIE; } break; case OTWIERANIE; if (czujnik_otwarcia) { stan_bramy = OTWARTA; utimer = CZAS_OTWARCIA; } if (!utimer) // awaria break; case OTWARTA:...
Brak Ci preloadingu (buforowania). Wytłumaczę ten fenomen tak: Powiedzmy że Twój timer liczy od 0 do 100 (taka wartość jest w ARR), a ty nagle zmieniasz ARR na 10, tyle że aktualna wartośc licznika wynosi 50. No i teraz Twój timer musi doliczyć do 65535 żeby się przekręcić i doliczyć do tych 10. Dokładnie tak samo ma się sprawa z wartością CCR. Przed...
Ok po pierwsze zdecyduj się czy używasz kanału 1 czy kanału 2 DAC bo odpalasz DMA dla kanału pierwszego DAC ale w rejestrze DAC_CR odpalasz kanał drugi. Do tego aby działał trigger inny niż software'owy musisz ustawić bit TEN1 oraz bity TSEL1[2:0] w zależności od źródła wyzwalania. Więc dla TIM6: [syntax=c]DAC->CR = DAC_CR_DMAEN1 | DAC_CR_TEN1 |...
Może to na początek. [url=https://www.digikey.com/en/maker/pr... [url=https://community.st.com/s/article/...
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ł...
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...
może popatrz na to: https://stm32.eu/2012/04/11/timer-systic... Nie mam doświadczenia z STM32. Moja odpowiedź raczej dotyczyła licznika 4-bitowego.
A tak się nie zeruje znaczników przerwań timera: TIM2 -> SR &= ~TIM_SR_UIF; Powinno być: TIM2->SR = ~TIM_SR_UIF;
Ta biblioteka została stworzona po to, żeby ich nie rozumieć jako nadrzędne "wysokopoziomowe" API. Jak chcesz je znać w szczegółach to jej nie używaj i wtedy nota Ci wszystko wyjaśni. Nie mam pojęcia czemu to nie działa, analogiczny kod pisany z notą w ręku bez użycia bibliotek działa tak jak chcesz żeby działał.
A musisz te dane pchać cyklicznie co jakiś czas czy generalnie kiedy tylko się pojawią? Jak źle kombinuję to mnie poprawcie, ale nie lepiej byłoby wykorzystać tu FSMC i pisać po prostu pod odp. adres?
Jakim cudem zmiany kodu wykonywanego w pętli głównej mogą mieć wpływ na działanie tego co jest przed nią ?! Może jest coś wspólnego np. funkcja delay_ms() jest także wykorzystywana przed pętlą główną? ;) A jak wygląda delay_ms(): zwykła pętla for czy użyłeś timera?
Kupa błędów, trudno, żeby działało. Nie wiem, czy wszystkie wyliczę: 1. W komentarzach jest TIM1 ch1, TIM1 ch2, TIM1 ch3, ale kody pod tymi komentarzami są identyczne (tylko rejestr CCRx jest zmieniony) - niby czym się różni inicjowanie dla poszczególnych kanałów? 1a. Rejestry PSC i ARR są określone dla timera (wspólne dla wszystkich kanałów), więc...
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...
Patrząc pobieżnie, używasz SPI1, które to w tym procku może korzystać z PB4, PB5 (mosi i miso). Konfiguracja SPI następuje po konfiguracji pinów "pod" enkoder. Może konfiguracja SPI "psuje", ustawienia portów PB4 lub PB5. To teoria na szybko, usunięcie linijek od SPI pewnie rozwieje moje podejrzenia...
Cześć, Chcę skonfigurować w STM32 4xPWM na jednym Timerze. Tak żeby Timer ciągle działał, ale jednocześnie móc załączać wypuszczanie sygnału PWM na określone piny wyjściowe kanałów. Czyli Timer ciągle działa, a ja kontroluje na które kanały mają wyjść sygnały na zewnątrz procesora. Czy da się tak zrobić w HALu? Jak to skonfigurować w HALu? Pozdrawiam.
Zrobiłbyś większy gdybyś zrobił co ci się mówi. a nie żerował na innych. Oczekujesz gotowców. Bo już pokazałeś ze ignorujesz właściwe rozwiązania. A gdybyś poświecił 30sekund i znalazłbyś przykład dokładnie robiący to czego oczekujesz.
No to jest CM3 a nie 0 jak napisał sulfur. Z resztą żeby nie wprowadzać ewentualnych kłótni [url=http://www.st.com/internet/mcu/prod... jest źdódło. Różne częstotliwości na kanałach jednego Timera można uzyskać tylko programowo.
Proste pytanie - czy przeczytałeś opis timera 1 w manualu? 4\/3!!
Mimo wszystko nie działa. Jak linijke RCC->APB2ENR|= RCC_APB2ENR_TIM1EN dodam gdzieś poniżej pierwszego odwołania do rejestrów TIMERA1 to diody nie zapalają się w żadnej kombinacji, wtedy chyba nie wchodzi do przerwania w ogóle. edit: [syntax=c]#include "stm32f10x.h" void TIM1_UP_TIM16_IRQHandler(void) { GPIOC->ODR ^= 0x300; /*break point*/ } int main(void)...
Timer w STM32 ma sprzętowe filtry itd w timerze.
Może by tak te impulsy na próbę podać na zwykły licznik/timer i zobaczyc ile zliczy na sek. i czy zlicza stabilnie? Przynajmniej bedzie wiadomo czy to problem bardziej sprzetowy, czy programowy.
Sprawdź w Ref. Manual, ile jest w Twoim mikrokontrokerze dostępnych wyjść timerów na nogach portów. Prawie wszystkie mogą pracować jako PWM. Jeśli ma poziomy wejściowe TTL, to możesz. Zaryzykuj - prawdopodobnie będzie ok. W każdym razie nic nie zepsujesz, najwyżej nie będzie działać.
Witam Panowie mam takie pytanie: używając pętli for kopiowanie np 5 tys elementów z jednego bufora od drugiego trwa jakieś ~1,85ms. Mierzę to timerem robiąc przerwania co 50us. Jak używam memcpy to 5tys elementów kopiuje w 50us a dla 10 tys jest 100us . Czy to możliwe ? czy po prostu memcpy blokuje przerwania od mojego timera
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.
Chodzi o wyłączoną generację PWM, czy wyłączony timer?
Cześć, Chcę zmieniać w Tmerze na STM32 PWM 0..99%, ale w zakresie częstotliwości od niewielkiej do powiedzmy 40kHz (zmiana liniowa). Czy jest to możliwe? Pozdrawiam.
W STM32 timery chodzą nawet jak układ stoi - da się to przestawić rejestrem DBGMCU->CR. Pewnie z watchdogiem jest tak samo. Wtyczka GDB Hardware Debugging jest do znalezienia w "standardowym" repozytorium wtyczek dostępnym do wybrania zaraz po instalacji - http://download.eclipse.org/releases/ind... 4\/3!!
Jakaś dokumentacja jest w katalogu firmware procka. Są tam też jakieś przykłady. Jest taka fajna pozycja o STM32 z wykorzystaniem CubeMX: https://www.carminenoviello.com/masterin...
Dostępne peryferia opisane są na stronie Keila, dla powyższego układu (STM32f103RC) http://www.keil.com/dd/chip/4230.htm . Podobna sytuacja jest z innymi wersjami np. STM32F107VB (tu to jest tragedia nie ma części GPIO i są tylko 2 timery i inne ograniczenia) i coś ciężko im idzie usunięcie ograniczeń bo stan się nie zmienia od ponad roku.
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...
Czyli gdzie może być problem? :)
To nie ma znaczenia, i tak zostanie skonwertowane do całkowitego 23. Ale w sumie faktycznie śmiesznie wygląda [; Co do problemu, to jak masz oscyloskop, to sprawdź czy przypadkiem na samym początku na pinach nie dzieje się coś baaaaardzo dziwnego. Ewentualnie pokaż te przebiegi i porównaj je z przebiegami z kontrolera który masz. 4\/3!!
Poradziłem już sobie z tym. Niepoprawnie było wybrane wejście wyzwalacza (TIM_TS_ITRx) dla timera5. Było ustawione 1, a powinno być 0 -TIM_TS_ITR0. Zależności między numerem wejścia wyzwalacza a timerem który go steruje przedstawia poniższa tabela: http://obrazki.elektroda.pl/3959735900_1... (Źródło [url=http://mycontroller.ru/stm32-timer-...
Ja bym to zrobił przy pomocy Timera
W STM32 Advanced Timery mają wyjścia komplementarne z deadtimami. Komparatorów chyba nie uświadczych, nigdy nie potrzebowałem. No to jeszcze przykład takiego STM32 w cenie poniżej 4 PLN (za Dondu, nie sprawdzałem) i już się przesiadam. Albert
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...
Nie przemawia to do mnie, w stm32f0xx.h mamy coś takiego: #define TIM_SR_CC1IF ((uint16_t)0x0002) /*!<Capture/Compare 1 interrupt Flag */ jak na mój gust zapis: TIM1->SR = ~TIM_SR_CC1IF; spowoduje najpierw zanegowanie TIM_SR_CC1IF a potem przypisanie do rejestru SR, czyli de facto wrzucimy tam wartość 0xFFFD. Zapis: TIM1->SR...
Witaj. Tu masz trochę o PWM czyli o sterowaniu pompą: https://forbot.pl/blog/kurs-stm32-7-licz... Poczytaj również o STM32CubeMX. Dobrym środowiskiem programistycznym jest Atollic studio. a tu masz jak odczytywać napięcie: https://forbot.pl/blog/kurs-stm32-6-pomi...
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...
A nie masz tam czasem włączonego jakiegoś Watchdoga czy czegoś takiego co Ci resetuje procka? :)
A ktoś potrafi zmienić mi kod tego timera ? Mam po kompilacji 2 błędy ten z timera i "attachInterrupt(digitalPinToInterrupt(2... distance_count, FALLING); "
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...
NVIC->ISER U mnie przerzuciłem się na funkcję CMSIS, bo faktycznie sprawdzanie dwóch plików pdf w czterech miejscach w poszukiwaniu gdzie znajduje się dane przerwanie jest trochę utrudnionę. W tzw międzyczasie znalazłem sobie coś takiego: http://www.keil.com/download/docs/363.as... (STM32 Timer Example) i przyglądam się jak to jest tam zrobione
Popatrz na warunek pętli for - nigdy nie będzie spełniony, więc pętla nigdy nie będzie się kręcić. Może to i lepiej, bo opóźnień nie robi się na pętlach, tylko na timerach.
Hehe :) No niestety złapałem się na tym :) Dzięki za podpowiedź!
No ale w innych mikrokontrolerach jakoś jest to możliwe bez "cudownych" narzędzi, tutaj robi się to tak samo. Ja np otwieram arkusze excela, wypisuje co mi potrzebne, potem sprawdzam czy tak się da - oczywiście najpierw wśród "normalnych" pinów. Jeśli nie da się "normalnie", to przechodzę do tych zremapowanych, cały czas patrząc na manual (co wtedy...
Twoje problemy rozwiązałby jakiś TMS320 z serii C2000. Ale to tylko moje dywagacje. Jeśli chodzi o STM32F4 to musisz przemyśleć czy rzeczywiście 4 MHz jest niezbędne dla ADC. Kiedyś bawiłem się timerami w Keil'u więc kod wstępny na pewno Ci się przyda (kanały timera3 działają na GPIO->C6-C9): odznacz NVIC_EnableIRQ !!! ): [syntax=c]void TIM3_IRQHandler(void)...
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...
Peryferia w różnych STM32 są PRAWIE takie same. Identyczne są timery, UARTy mogą się różnić rozszerzeniami funkcjonalności (baza zawsze taka sama), SPI występuje w dwóch odmianach, USB - w kilku różnych. Seria L4 ma najmniej udziwnień i parę przyjemnych cech, np. w wielu modelach można używać USB bez kwarcu, co w F4 ani F7 nie jest możliwe. W wyborze...
Doczytałem głębiej i w sumie chyba faktycznie da się to zrobić. Wychodzi na to, że trzeba po prostu sprawdzić [; Trzeba tylko tak dobrać timer, aby jego (używane) kanały nie wypadały po kilka do jednego kanału DMA, bo wtedy się nie będzie dało. 4\/3!!
A nie prościej będzie zamiast zmieniać polaryzację załadować wypełnienie będące dopełnieniem do okresu? (czyli przełączenie polegałoby na załadowaniu (okres - x) zamiast dotychczasowego x). Sprzętowo nie da się zmienić polaryzacji ściśle synchronicznie z okresem. Nawet użycie DMA może wygenerować szpilkę.
Powiedzmy otwarcie, że o gustach się nie dyskutuje, co jest w użyciu przyjemniejsze. AVR są na pewno dużo prostsze niż ARM (prostsze znaczy także uboższe w możliwości), a czy to zaleta czy wada przy nauce od zera? Moim zdaniem zaleta. Sam chyba przyznasz, że jeśli ktoś szkoli się na mechanika (skoro już wchodzimy w tematy samochodów) to łatwiej zacząć...
Sorki, pomieszałem wartości. W Xmega zegar dla timera pracował z 128 lub 256MHz, ale dla 12-bit timera uzyskałem częstotliwości PWM 16 i 32KHz. Na pewno na STM32 są także podobne timery. Co do Xmega, to nie jestem jakimś jej fanem, ale swego czasu sporo się nią bawiłem i w sporym stopniu ją poznałem, dlatego teraz biorąc się za STM32 mam jakieś porównanie.
011<<4 Wiesz co w C oznacza zapis 011? Podpowiem, że odpowiada on liczbie 9, co binarnie odpowiada liczbie 1001. Proponowałbym napisać tam cyfrę 3. Pozatym każdy twój przykład kodu ma chyba więcej błędów. W tym momencie ustawiłeś, że timer liczy do 1, a zmianę pinu będziesz miał przy wartości 200. No to jakim cudem chcesz jakąkolwiek zaobserwować,...
Zobacz sobie obrazek nr 8 (Clock Tree) w RM0008 w rozdziale o RCC. DO: TIM2,3,4,5,6,7,12,13,14 idzie częstotliwość: jeżeli APB1 prescaler = 1 to częstotliwość APB1 w przeciwnym wypadku - częstotliwość 2*APB1 podobnie jest z pozostałymi timerami na APB2 więc jeśli uC jest taktowany zegarem 72MHz i na APB1 jest 36MHz (prescaler = 2) to tim2 i tak "działa"...
Nie. Jest jak w stm32. Uklad uart, timer czy twi można podłączyć do domyślnych lub alternatywnych pinów. I ot cały remap.
W rzeczywistości nie jest możliwe osiągnięcie takiej częstotliwości programowo. Zastanów się nad tym - nawet jeśli operacje które pokazałeś zajmowałyby 1 cykl (a nie zajmują!) to przy zegarze 72MHz (max dla typowych STM32) masz niby 2 cykle na zmianę, a więc 72MHz/2. 50MHz można wyciągnąć tylko za pomocą układów peryferyjnych typu timer, SPI, FSMC itd....
Dziękuję za odpowiedzi.
No tak, trochę zamieszałem. 4095 zapisze się na 12-bitach, więc mogę podzielić na 2 po 6 bitów czyli 63(dec). Zostaną mi dwa bity i mogę wykorzystać je do oznaczenia numeru kanału lub kodowania. a Ty Freddie Chopin jakie byś wybrał rozwiązanie, żeby było optymalnie? Odczytywałbyś ADC w trybie circular czy wyzwalał Timerem?
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.
Mam jeszcze jeden problem otóż uruchomiłem timer 1 i używam funkcji [syntax=c]TIM1_UP_IRQHandler[/syntax] do jego obsługi ale teraz postanowiłem uruchomić timer 2 i w żadnych plikach nie widzę funkcji do tego timera.
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...
Nie będę głębiej wnikał, bo dopiero zabieram się za ARMy, ale to: http://www.stm32.eu/index.php?option=com... może coś ułatwi, gotowy projekt, który sprawia wrażenie prostszego.
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ą.
W timerach STM32 jest coś takiego jak PWM Input Mode który służy do sprzętowego pomiaru wypełnienia i okresu PWM - szczegóły są w np w Reference manual. O ile jednak dobrze pamiętam to jednym timerem sprzętowo można mierzyć tylko jeden sygnał PWM. Na jednym timierze 4 kanały pewnie trzeba będzie mierzyć programowo z wykorzystaniem Input Capture Mode
a wyłączasz timer czy pwma ? :)
(at)excray To jest tzw. pluskwa milenijna :) Rozumiem że czytasz tylko 8 bitów z tego biednego ADC? Dopisek - a tak nie doczytałem że 8 bitowa rozdzielczość. Pewnie jest coś nie halo w tej części softu, której nie pokazałeś. Zmiani ARR zawsze wywoła odpowiednią zmianę w okresie pomiędzy przeładowaniami.
Jeśli ten STM32 nie będzei miał prawie nic innego do roboty, to i programowo mógłby to dekodować. Sensowniej jednak byłoby zaprząc do tego timer w trybie pomiaru okresu i szerokości PWM. Uda się i jedno i drugie, o ile nie będziesz korzystał z SPL.
Odpowiedz sobie (przy okazji możesz i nam) na poniższe pytania: Jaki to mikrokontroler? Jaka jest częstotliwość głównego zegara? Jaka jest częstotliwość zegara szyny timera? Jaka jest częstotliwość zegara timera? (to nie jest wcale takie oczywiste - są automatyczne dzielniki, przy podziale częstotliwości szyny zegar timera może być 2x szybszy od zegara...
Zupełnie nie rozumiem, w jakim celu miałbyś zapisywać rejestr timera, jeśli transmisję do WS na STM32 możesz zrobić bez timera na SPI, kodując każdy bit do WS2812 na trzech bitach zamiast na bajcie czy słowie 16-bitowym. Opis kodowania i transmisji SPI bez DMA masz w już darmowej EP 03'2014.
Rzeczy, które zaznaczyłeś - to stałe zdefiniowane na podstawie lektury manuala - wartości bitów włączających odpowiednie tryby pracy peryferiali. MODER. A to nie powinno być zdefiniowane w pliku "stm32f0xx.h" aby wykorzystać w kodzie programu? Opis, który wkleiłeś plus opis bitów w rejestrach daje komplet informacji potrzebnych do zaprogramowania timera....
Jeśli timer jest 16-bitowy to musisz dorzucić coś więcej - 16-bitów to zbyt mało. Licznik z którego korzystają run-time stats musi być 32-bitowy... Ja na STM32 mam to zrobione tak... 1. W FreeRTOSConfig.h mam: [syntax=C]... /*--------------------------------------... | Runtime...
Zmieniłem trochę kod, zgodnie z sugestiami kolegów. Teraz mam coś takiego: [syntax=c]#include <stm32f0xx.h> void TIM6_DAC_IRQHandler(void); int main(void) { RCC->CFGR &= ~(RCC_CFGR_SW_1 | RCC_CFGR_SW_0); //HSI RCC->AHBENR |= RCC_AHBENR_GPIOCEN; GPIOC->MODER |= GPIO_MODER_MODER9_0; //wejscie GPIOC->MODER &= ~GPIO_MODER_MODER9_1;...
stm32f103RB Nucleo i jestem pewien, że jest dobrze
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.
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
No to szukaj błędu w ustawieniach zegara - skąd bierzesz przebieg wejściowy, częstotliwość (sprawdź czy dobrze ustawiona w module startowym), wywołanie SystemCoreClockUpdate itp... Prosty test: zaprogramuj timer i procedurę przerwania od niego an miganie diodą z częstotliwością 1Hz i zmierz sekundnikiem czas np. 60 mignięć.
Jest wiele metod. Najwygodniejsze: 1. Ustaw sobie SWV data trace i pisz do jakiejś globalnej zmiennej. Bedzesz miał w CubeIde licznik taktów wyświetlony kiedy ten zapis się dokonał. Odejmiesz dwie wartości i będziesz miał wynik :) [url=https://www.elektroda.pl/rtvforum/v... pisałem Ci już o SWV Jest to potężne narzędzie...
Nie znam frameworku arduino dla stm32 ale wygląda na to że konfigurujesz timer ale go nie startujesz. tutaj jakiś przykład jak korzystać z timerów https://github.com/rogerclarkmelbourne/A... Spróbuj zmodyfikować funkcję void...
Jak już się upierasz przy "flagach", to może konsekwentnie również je "kliruj" i "setuj". ;) Ja wolę ustawiać znaczniki niż "setować flagi". Flagi to się raczej wywiesza, zwłaszcza o tej porze roku. Jak działa SR timera w STM32 - to dokładnie wiadomo - "w0c". żadna filozofia tego nie zmieni, a operacja &= skutkuje błędami, jeśli oprogramowanie ma reagować...
Niestety na STM'ach nie da się w prosty sposób zrobić generatora impulsów o liniowej częstotliwości. Proponowałbym taktować jakiś timer mikrokontrolera sygnałem zegarowym z DDS'a (będziesz miał skok 0,2Hz w zakresie 0 - kilku MHz przy zastosowaniu AD9834)
Sprawdź w manualu opis rejestru DBGMCU_CR (DBGMCU->CR). Musisz sobie w nim ustawić odpowiednie bity, aby timer został zatrzymany gdy zatrzymany jest rdzeń. Problem który obserwujesz wynika z tego, że timer domyślnie nie jest zatrzymywany gdy debugger zatrzymuje rdzeń. Jeśli np. masz przerwanie od przepełnienia co 1 sekundę, to podczas tegoż debuggowania...
Dane którymi będę karmił ten generator to jest wypełnienie czy częstotliwość. Wypełnienie. Timer będzie generował przebieg o stałej częstotliwości Częstotliwość ta powinna być większa od częstotliwości słyszalnej.
No jak wiesz ile masz zliczeń i z jaką częstotliwością chodzi timer to jeżeli łapiesz jeden okres to będzie coś jak: Fzmierzona = f taktowania timera /(Nzliczen na okres).
Możesz, poczytaj w RM8 jak można to zrobić bo fizyczne wyjście z Timera do wyzwalania ADC jest Ci niepotrzebne.
tylko nie bardzo rozumiem po co :?: Bo nie można dzielić przez zero. Jeśli PSC wynosi 0, to dzielnik faktycznie ma wartość 1. No i dlatego trzeba to 1 odjąć od dzielnika jaki chcesz uzyskać, aby się zgadzało.
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.
1. Czy ktoś Cię zmusza do używania bezsensownych funkcji HAL zamiast prostego podstawienia, takiego jak GPIO_LED->BSRR = LED_MSK; ? 2. WS2812 z STM32 można sterować z wyjścia timera lub SPI z użyciem DMA (w nowszych modelach również z UART). Każde z tych rozwiązań jest lepsze, niż programowe przestawianie wyjścia.
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.
Główne różnice to obecność "zanegowanych" sygnałów wyjściowych (OCxN) z opcjonalnym deadtime oraz wejście "hamulca" (BKIN). Timery w STM32 są niesamowicie rozbudowane... 4\/3!!
timer stm32 stm32 timer pulse stm32 przerwania timer
szczotka bosch oryginalny samsung np300e5a sterowniki samsung mruga dioda zasilania
technika radiowa technika radiowa
Traktorek MTD 92 gaśnie przy włączaniu kosiska - przyczyny i rozwiązania Ustawianie kanału TV Republika na dekoderze Strong