Kulfi27 napisał(a):
Skonfigurowałem tyle według książki i teraz chciał bym żeby wywołać przerwanie od timera 1, brakuje mi ustawienia do ile ma liczyć licznik, i nie wiem gdzie mam szukać nazwy funkcji wywoływanej przez przerwanie jakoś nie mogę tego wszystkiego jak na razie ogarnąć
Bardzo bym prosił o wskazówki co dalej
Na razie skonfigurowałeś zegary wewnętrzne, ale teraz sobie myślisz co to u licha są zegary i jest ich kilka?
No tak projektanci procesora zauważyli że czasami nie ma potrzeby uruchamiać wszystkich peryfierii z maksymalną i tylko jedną szybkością i dali taką możliwość użytkownikowi.
Jeżeli otworzyłbyś sobie dokument
https://www.google.nl/search?q=RM+STM32F429&oq=RM+STM32F429&aqs=chrome..69i57j69i60l2.1462j0j7&sourceid=chrome&ie=UTF-8#q=reference+manual+STM32F429, który odpowiada twojemu uC, to po lewej lub prawiej stronie powinna być lista ze wszystkimi tematami, jeden z nich to RCC - jest to rejestr który odpowiada za wszystkie zegary w twoim uC. Na stronie 152 RM00090 jest diagram przedstawiający wszystkie linie łączący twoje źródło zegarowe z odpowiednimi peryfieriami.
W lini 3:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawia to że źródłem będzie sygnał zewnętrzny podpięty pod piny OSC_OUT OSC_IN, zobacz sobie w datasheet(nie w reference manual) gdzie to jest podłączone-prawdopodobnie na płytce masz rezonator kwarcowy
. Dobra jedziemy dalej.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po ustawieniu tego zegara (instrukcja powyżej), należy odczekać chwilkę aż wszystko się ustabilizuje.
Jezęli wszystko się powiedzie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wykonywane są następne instrukcje.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jest to taki dodatkowy bajer pamięci flash a ty go włączasz (Cortex M4 manual strona 275).
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jako że nie używasz standardowej prędkości tylko jakiejś wyższej (co objaśnimy za chwile), należy spowolnić dostęp do pamięci FLASH - chodzi o to że pamieć FLASH jest wolniejsza niż szyna DANYCH AHB (RM strona 80 jest sobie tabelka która wszystko objaśnia).
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawiasz dzielnik częstotliwości HCLK, spójrz jeszcze raz na Diagram 16 Clock Tree ze strony 152, jest tam coś takiego jak AHB_Prescaler.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawiasz dzielnik częstotliwości dla PCLK2 na jeden (a dlaczego akurat jeden? no to też trzeba przemyśleć, to zobaczymy zaraz)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawiasz dzielnik częstotliwości dla PCLK1 na dwa, dlatego że tam maksymalnie może być 45Mhz
Strona 153 z RM znowu nam wszystko wyjaśnia:
Cytuj:
The maximum allowed frequency of the high-speed APB2 domain is 90 MHz. The
maximum allowed frequency of the low-speed APB1 domain is 45 MHz
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tak jak napisałeś sobie PLLCLK 8MHz * 9 = 72 MHz czy jesteś pewny że akurat taki zegar jest na twojej płytce? a nie 16?
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
tego chyba nie trzeba wyjaśniać, no może co to tak jest ta PLL (Pętla Synchronizacji Fazy), jest to taki (pod)układ który pozwala na powielanie częstotliwości ale nie tylko, jak będziesz ciekawy jak to się dziej to też mogę wyjaśnić. Jednak ten proces synchronizacji pętli trwa pewien czas więc należy poczekać aż się ustabilizuje.
Kiedy jest już gotowa możesz jej użyć jako źródła dla twojego zegara HCLK również to zdarzenie można znaleźć w manualu - zapraszam strona 152 nasz ulubiony Clock Tree
Na środku rysunku jest właśnie taki "Switch" który możesz sobie ustawić za pomocą rejestru
RCC->CFGR strona 167 .
No i na końcu sprawdzasz czy już wybrane źródło się przełączyło na to które chcesz.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać przygotowujesz się do uruchomienia zegara nr 1 (TIM1) włączając mu sygnał zegarowy (bo go potrzebuje), teraz musisz się zastanowić bo tak naprawde to Twojego zegara TIM1 jeszcze nie zacząłeś konfigurować.
Odpowiedz sobie na pytania:
-z jaką częstotliwością działa APB2 (Tam jest podłączony zegar, a skąd to wiadomo zapytasz: DataSheet STM32F429xx strona 18 piękny diagram obrazujący wszystkie podłączenia
no i tak jak skonfigurowałeś HCLK
Na co jeszcze należy zwrócić uwagę?
Cytuj:
1. The timers connected to APB2 are clocked from TIMxCLK up to 180 MHz, while the timers connected to APB1 are clocked
from TIMxCLK either up to 90 MHz or 180 MHz depending on TIMPRE bit configuration in the RCC_DCKCFGR register
-Jak ma działać licznik: liczyć w góre, w dół, czy w góre i w dół?
-Kiedy ma następować przerwanie, czy na początku zliczania, na końcu a może wtedy kiedy komparator wewnętrzny wyzwoli?
-Jak szybko ma działać licznik, do ilu przedziałów czasu ma zliczyć?
-Jaki będzie podstawowy przedział czasu (rozdzielczość) twojego zegara
------------------------ [ Dodano po: 49 minutach ]Pamiętaj nie zniechęcaj się tylko dlatego że to wymaga czasu, on i tak upłynie a ty się czegoś nauczysz
Ja mam trochę inny mikroprocesor, ale przez analogię na pewno dojdziesz
Mój to STM32F411 do tego nie używam biblioteki znaczy używam ale te stworzone przez siebie
Ale tak żeby nie zaciemniać:
Funkcja konfigurująca uC na maksymalną prędkość podałem strony rejestrów tak żebyś mógł sobie odnaleźć w RM0383
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no dobrze w moim przypadku zegar działa na 100Mhz - mam 8 Mhz Kwarc skąd się taka prędkość wzięła chyba już wiesz? Jeżeli nie to Clock Tree rozwieje twoje wątpliwości
Ale ale APB1 działa już na 50Mhz tyle że dla zegarów jest mnożnik x2 sorawdź to !
Jako że mój zegar ma działać w górę i w dół na 10khz oto konfiguracja:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dlaczego tutaj jest 10khz ? ABP2 działa na 50MHz x2 (mnożnik
Cytuj:
if APBx PRESC =1 x1 else x2[
) TIM5->PSC=0; co = 1 koniec końców daje nam 100Mhz => 100 000 000 hz=>1/f=T - otrzymamy czas bazowy w którym będzie zliczał nasz licznik: 1/100 000 000 = 0,00000001s => 10ns
teraz zliczamy w górę i w dół ile ? a no tyle TIM5->ARR=5000; czyli 5000*10ns w górę 5000*10ns w dół razem =>100 000 ns=> 100us =0.0001 s a z tego juz łatwo poznamy częstotliwośc 1/0.0001=10kHz
Nom mamy gotową funkcję która konfiguruje nam TIM5 ale teraz trzeba ją wywołać zatem pętla główna:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Gwoli wyjaśnienia przerwanie wystąpi w momencie wystąpienia UPDATE EVENT, a skąd to ? a stąd : strona 308 / 837 RM0383 - czyli wtedy kiedy licznik się "przepełni" czyli doliczy do 2x5000xtimeBase(10ns) w moim przypadku