Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2024, o 07:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 11 sty 2017, o 23:48 
Offline
Użytkownik

Dołączył(a): 22 lut 2015
Posty: 61
Pomógł: 0

Witam kolegów stawiam pierwsze kroki z STM32 i nie wiem jak mam skonfigurować timera 1 żeby mi generował przerwanie
program piszę w atolicu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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ąć :o Bardzo bym prosił o wskazówki co dalej ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2017, o 18:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Zajrzyj tu: http://forbot.pl/blog/artykuly/programowanie/kurs-stm32-f4-1-czas-poznac-hal-spis-tresci-kursu-id14114 i tu http://forbot.pl/blog/artykuly/programowanie/stm32-praktyce-1-platforma-srodowisko-id2733

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2017, o 19:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 mar 2013
Posty: 38
Lokalizacja: Gdynia
Pomógł: 1

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ąć :o 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:
Składnia: [ Pobierz ] [ Ukryj ]
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.


Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wykonywane są następne instrukcje.

Składnia: [ Pobierz ] [ Ukryj ]
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).
Składnia: [ Pobierz ] [ Ukryj ]
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).

Składnia: [ Pobierz ] [ Ukryj ]
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.

Składnia: [ Pobierz ] [ Ukryj ]
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)
Składnia: [ Pobierz ] [ Ukryj ]
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


Składnia: [ Pobierz ] [ Ukryj ]
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?

Składnia: [ Pobierz ] [ Ukryj ]
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.
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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 :)


Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 21:19 
Offline
Użytkownik

Dołączył(a): 22 lut 2015
Posty: 61
Pomógł: 0

Dziękuje koledze za ten wpis przede wszystkim za prezentacje kodu konfiguracji tego na rejestrach bardzo mi pomogłeś ;)
Siedzę całymi wieczorami przed kompem :twisted: i coś tam skrobie nie będę udawał ciężko mi to idzie ale z uporem maniaka. Wracając do tematu posiadam taką płytkę
http://elty.pl/pl/p/STM32F429IGT6-MCU-core-board/1122
kwarc zamontowany to 8Mhz prosił bym o wyjaśnienie kilku rzeczy mianowicie jeżeli nie skonfigurowałem procka na zewnętrzny kwarc to w tej chwili korzysta z HSI RC 16Mhz czyli wewnętrznego, teraz nie wiem czy się dobrze wyrażę jeżeli chcę podkręcić na maksa rdzeń to muszę skorzystać z pętli PLL ustawiam częstotliwość na 180Mhz i co jeszcze muszę ustawić, czy dobrze rozumie dla każdego peryferialu procka muszę tą częstotliwość podzielić zebu uzyskać częstotliwość maksymalna z jaką może pracować dany peryferial.
A teraz takie pytanie czy ten procesor sobie poradzi ze sterowaniem łazikiem zbieranie danych z kamery i wysłanie do odbiornika, po stronie odbiornika tak sobie założyłem ze ten sam procek i wyświetlacz 480*272 no i odbiornik, myślę ze obraz będę musiał skonwertować do jpg żeby to jakoś przesłać, takie moje założenia więc się bawię :D i wiem jeszcze dużo wody upłynie zanim to ogarnę ale co tam sam łazik częściowo skonstruowany :lol:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2017, o 08:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 mar 2013
Posty: 38
Lokalizacja: Gdynia
Pomógł: 1

Ściągnij sobie CubeMx tam masz graficzną konfigurację tego samego co jest w dokumentacji STM32.
Tak to wygląda.
Link

Tylko wtedy musisz wybrać nie RCC_HSEConfig(RCC_HSE_ON); , RCC_HSI_ON , która prawdopodobnie po resecie jest ustawione już, też jest to opisane w dokumetnacji, jak zajrzysz na strone gdzie jest tabelka z rejestrami (czyli np teraz RCC->CR) to zobaczysz u góry "RESET VALUE", czyli to w jaki sposób działa uC po resecie.
np:
0x0000 XX81b zastem widzisz że LSB (czyli ten najmniej ważny bit jest 1, zatem HSI domyślnie jest ON) ,
potem należy wybrać w CFGR rejestrze co ma być źródłem zegara HCLK.

Po pracy dzisiaj uzupełnie ten kod co ci przesąłem to zrozumiesz dlaczego wybrałem takie a nie inne PLL_Q, N, M, P ale możesz do tego dojść sam. tzn

Na pewno na tym Clock Tree zauważysz PLL, odążaj linią:
Tak można to np skonfigurować:
HSI=16MHz
HSI/M=16/4=4Mhz
HSI/M*N=4Mhz*90=360Mhz
(HSI/M*N)*P=180Mhz

Spróbuj to policzyć kiedy zegar bedzie miał 8Mhz i będzie zewnętrzny ;) na pewno dasz rade.

Co do następnego pytania to musisz sobie odpowiedzieć jakie interfejsy do tego potrzebujesz?
-kamerka działa na jaki protokół, jaki ? pewnie SPI
-możesz używac sprzetwoego wspomagania dla transferu danych: DMA, zwolni to twój uC z mozolnego kopiowania bitów.
-jaki będzie krok bazowy twojego algorytmu główne?

No tak naprawdę zrób to przez analogie, przypatrz się tym rejestrom na poczatku próbuj budowy inkrementalnej:
-zaświeć diodą bez żadnego przerwania
-skonfiguruj RCC i włącz sobie SYSTick, migaj tam diodą co 1 sec, jeżeli masz oscyloskop lub analizator stanów logicznyc to się podłącz i zmierz to, jeżeli nie to miernikiem nawet.
-potem jak juz wiesz czy skonfigurowales zegar odpowiednia (systic ci o tym powie), zacznij configuracje TIMERA, najpierw prosto, nie musi być to TIM1 bo jest on najbardziej złożony- co prawda nauczysz się wtedy wszystkich innych timerów ale jeżeli chcesz gładko przez to przejść to lepiej wybierz sobie np TIM5 lub coś takiego.
-poczytaj o trybach w dokumentacji, zastanów jak chcesz żeby dział?:góra dół, góra, dół? co ile ma być przerwanie, jaka jednostaka czasu bazowego ma być ustawiona, czy jest ci potrzebna duża rozdzielczość?
-jaki juz sobie odpowiesz i skonfigurujesz to zrób tak żęby na wyjściu tego licznika (kanału- czyli portom przypisanym do danego licznika w trybie output) migaj sobie diodą lub podepnij się osc, jeżeli czestotliwość jest ok, to zajmij się przerwaniem tego Timera
-kiedy przerwanie ma następować: Update, Compare itd w dokumentacji jest opisane.
-w przerwaniu migaj sobie diodą lub czymś co będziesz miał jako indykację że wszystko jest wporzadku
-zacznij pisać algortym
-czym będziesz wysyłał (jaki interfejs, protokół) i odbierał dane?
-Załóż sobie zeszyt i notuj spotrzeżenia, wydrukuj sobie RM (te strony które potrzebujesz np.rejestry clock tree) i komentuj je sobie , pisz spostrzeżenia

[off topic] Jaki masz debugger do niego?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2017, o 19:04 
Offline
Użytkownik

Dołączył(a): 22 lut 2015
Posty: 61
Pomógł: 0

Jakieś małe postępy już mi się udało zrobić mianowicie Timera1 skonfigurowałem jako PWM na kilku wyjściach :D, Timer3 jako zwykły licznik, i tak powoli mozolnie nawet LCD 4*20 już śmiga, staram się to wszystko na rejestrach programować.
Jeżeli chodzi o debugger to wszystko jest już upchane w Atolicu choć nie do końca umiem z niego korzystać.

Kamery jeszcze żadnej nie wybrałem na razie zakupiłem wyświetlacz 480*272 ze sterownikiem SSD1963 wpierw to chciał bym wdrożyć w życie żeby móc coś wyświetlić, więc przede mną jeszcze użycie DMA, komunikacja USART no i zwiększenie częstotliwości dla wszystkich peryferialów jak i rdzenia. :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2017, o 19:06 
Offline
Użytkownik

Dołączył(a): 22 lut 2015
Posty: 61
Pomógł: 0

Witam kolegów po czasie temat znowu powrócił z samymi Timerami sobie jakoś już radze teraz chce na rejestrach rozkręcić procka na maksa i mógł by ktoś z was rzucić okiem na kod nie wiem do końca jak to sprawdzić zapewne coś działa bo musiałem pozmieniać czasy dla wyświetlacza


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO