Skocz do zawartości
Komentator

Kurs STM32 F4 - #6 - Liczniki, konfiguracja zegara, debugger

Pomocna odpowiedź

Dzień dobry.

Zacząłem przygodę z programowaniem STM32 (troszkę liznąłem Arduino) Zakupiłem zestaw startowy do kursu. Gdy chcę ustawić zegary to mam problem z HSE. Wszystko wcześniej jest OK. W HSE wpisuję wartość z kwarcu na płytce, i nie chce zapamiętać wpisanej wartości. Ciągle wraca na 0.0 lub 0.0000010 jak mam to wykonać aby zapisała się tam "8" Input Frequency 8MHz? I Main PLL mam ciągle 8 i nie chce się zmienić na 4. Płytka mam dokładnie taką jak w kursie STM32F411E-DISCO.

Proszę o pomoc.

Udostępnij ten post


Link to post
Share on other sites
Dnia 4.04.2019 o 11:23, rafcio_bed napisał:

W HSE wpisuję wartość z kwarcu na płytce, i nie chce zapamiętać wpisanej wartości.

@rafcio_bed a co dokładnie Ci się nie zapisuje? Masz na myśli, że wartość nie wpisuje się w pole tekstowe w GUI?

Przed chwilą sprawdzałem na wersji  CubeMX 5.1.0, którą instalowałem kilka dni temu na Win 10 i wszystko poprawnie się zapisuje.

Udostępnij ten post


Link to post
Share on other sites

Wpisuje wartość tak aby było 8MHz i gdy kliknę gdziekolwiek wartość zmienia się na 0.0 lub 0.0000010

Nie chce zapamiętać wartości 8 ani żadnej innej tylko te zera. 

Udostępnij ten post


Link to post
Share on other sites

@rafcio_bed tak jak napisał @Gieneq, sprawdziliśmy temat na najnowszej wersji Cube, odtworzyliśmy ten sam przykład i u nas w GUI informacja zapisuje się bez problemu. To raczej coś po Twojej stronie (może jakiś błąd instalacji, niekompatybilność programów itd). A jak wygląda u Ciebie kwestia z innymi polami? Czy informacje wpisywane w inne pola też znikają? 

Udostępnij ten post


Link to post
Share on other sites

@rafcio_bed super, najważniejsze, że problem rozwiązany 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć,

Natrafiłem na identyczny problem jak koledzy wyżej, tj. przy korzystaniu z plug-in'u CubeMX'a do ac6 nie da się ustawić taktowania z HSE. Po wpisaniu do pola HSE 8, konwertuje liczbę na 8 Hz, tzn. 0.00..8. Jak wpisać 8 000 000, wtedy akceptuje wartość jako 8 MHz tylko po to, by po przejściu do innej karty lub kliknięciu innego pola od razu skonwertować powrotnie na 8 Hz. Przy czym problem jest o tyle gorszy, że po reinstallu nic się nie zmieniło, dalej plug-in zachowuje się tak samo. Korzystanie z zewnętrznego CubeMX'a rozwiązuje problem, ale jest dosyć... upierdliwe, bo za każdym razem muszę ręcznie ścieżki zmieniać, a przy plug-in'ie szło to z automatu. Da się coś z tym zrobić? Dodam, że plug-in najnowszy, ściągnięty ze strony ST.

EDIT: Cofam to, co pisałem o zewnętrznym CubeMX'ie. Owszem, można tam ustawić zegar, ale z kolei wyrzuca błąd przy generowaniu projektu. Więc problem zaczyna być bardzo uciążliwy.

EDIT2: Ok. Problem z CubeMX'em zewnętrznym rozwiązany. Nie pasował mu polski znak w ścieżce (cóż, taki użytkownik... ). Pozostaje więc jedynie kwestia plug-in'u.

Pozdrawiam

Edytowano przez PrimeSoul
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Proszę o wyjaśnienie taktowania magistrali APB1. W części #6 napisane jest: "Uwaga! Dla magistrali APB1 ograniczenie do 50MHz istnieje tylko dla części obsługującej peryferia. Timery znajdujące się na APB1 Timer Clocks mogą być taktowane częstotliwością 100MHz!". Natomiast w części #8 napisane jest: "Zaglądając na początek artykułu o zegarach dowiemy się, że timer 4 znajduje się na magistrali APB1, a więc będzie taktowany częstotliwością 50MHz (TIM_CLK)."

Jak to jest z tym taktowaniem? Przy ustawieniu 50/100MHz co jest taktowanie wolniej a co szybciej?

 

Edytowano przez jaceksz73

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
1 godzinę temu, jaceksz73 napisał:

Proszę o wyjaśnienie taktowania magistrali APB1. W części #6 napisane jest: "Uwaga! Dla magistrali APB1 ograniczenie do 50MHz istnieje tylko dla części obsługującej peryferia. Timery znajdujące się na APB1 Timer Clocks mogą być taktowane częstotliwością 100MHz!". Natomiast w części #8 napisane jest: "Zaglądając na początek artykułu o zegarach dowiemy się, że timer 4 znajduje się na magistrali APB1, a więc będzie taktowany częstotliwością 50MHz (TIM_CLK)."

Jak to jest z tym taktowaniem? Przy ustawieniu 50/100MHz co jest taktowanie wolniej a co szybciej?

 

Najszybsza metoda to zerknięcie do strony konfiguracji zegara w CubeMXie. Masz tam po prawej stronie taktowanie poszczególnych magistral, w tym APB1 i wskazana dla niej wartość. Poniżej albo powyżej powinna znajdować się wartość dla timerów tej samej magistrali, najczęściej pomnożona przez 2. Przy czym w tej chwili piszę mając w głowie STM32F407VG, bo akurat ostatnio miałem go w ręku, a nie zestaw do kursu, który leży gdzieś w szafce, czekając na lepsze czasy ;). A szczegółowe informacje znajdziesz na 100% w nocie katalogowej mikrokontrolera  / reference manualu / manualu do Cube'a (przyda się opcja Ctrl + F, bo to nie są lekkie lektury...). STMy mają to do siebie, że tych zegarów jest sporo i większość można całkiem spoko indywidualnie sobie poustawiać, w tym zegary timerów.

Edytowano przez PrimeSoul
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

W CubeMX jest dokładnie tak jak piszesz. W dokumentacji do F411 jest dokładnie tak samo. Ale pytanie pozostaje: dlaczego w odcinku #6 i odcinku #8 są podane chyba sprzeczne informacje? I drugie pytanie co jest taktowane wolniej a co szybciej. W dokumentacji jest napisane: "Max. interface clock (MHz)" to jest wolniej taktowane i "Max. timer clock (MHz)" to jest szybciej taktowane. Ale co to dokładnie jest?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
11 godzin temu, jaceksz73 napisał:

W CubeMX jest dokładnie tak jak piszesz. W dokumentacji do F411 jest dokładnie tak samo. Ale pytanie pozostaje: dlaczego w odcinku #6 i odcinku #8 są podane chyba sprzeczne informacje? I drugie pytanie co jest taktowane wolniej a co szybciej. W dokumentacji jest napisane: "Max. interface clock (MHz)" to jest wolniej taktowane i "Max. timer clock (MHz)" to jest szybciej taktowane. Ale co to dokładnie jest?

Max. timer clock to maksymalna częstotliwość sygnału zegarowego podawana na timery "przylepione" do danej magistrali. Więcej niż ta wartość nie osiągniesz. Max. interface clock to maksymalna częstotliwość taktowania wszystkich pozostałych peryferiów "przylepionych" do tej magistrali, np. USART, I2C itp. Podejrzewam, że w złożonych projektach może mieć to znaczenie, ale w hobbystycznych rozwiązaniach z reguły tylko taktowanie timerów, tudzież jakichś middleware'ów nas tak naprawdę interesuje.

Natomiast jeśli chodzi o tutorial, to trudno mi powiedzieć, co autor miał na myśli. Jeśli magistrala jest taktowana z 50MHz maksymalnie, to timery na niej przeważnie mogą hulać do 100MHz, o ile nie ustawi się inaczej w konfiguracji zegara (np. bez podwojenia).

Edytowano przez PrimeSoul
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Mam uwagę co do opisu rejestru Internal Clock Division (CKD). W kursie opisano go jako 
"Internal Clock Division - jeszcze jedno miejsce, gdzie można dokonać dzielenia sygnału taktującego timer."
Spróbowałem dziś użyć tego rejestru do wydłużenia okresu licznika na STM32F103C8 i niezależnie od ustawienia okres był ten sam - wynikający z rejestrów AutoReload Register (ARR) i Prescaler (PSC). 
Postanowiłem nieco zgłębić zasadę działania liczników i w dokumencie 
https://www.st.com/resource/en/application_note/dm00042534-stm32-crossseries-timer-overview-stmicroelectronics.pdf
znalazłem informację, że rejestr ten służy do czegoś kompletnie innego - jest preskalerem do licznika, ale... tego liczącego ile impulsów ma trwać dead time w trybach input capture.
Oznacza to, że informacja w kursie jest błędna. W tym samym dokumencie znaleźć można na stronie 11 wzór do wyznaczania okresu (częstotliwości) licznika:
Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR + 1))
Jest niemal identyczny do tego w kursie:
INT_FREQ = TIM_CLK/(ARR+1)(PSC+1)(CKD+1)
Jedyną różnicą jest... nazwa jednego rejestru, gdzie w kursie występuje właśnie CKD, a powinno RCR (Repetition Counter). Brzmi jak niewinny błąd, ale w moim przypadku akurat robi to sporą różnicę, bo RCR nie wykorzystam do wydłużenia okresu sygnału PWM, bo RCR nie jest preskalerem. 

Zaznaczę od razu, ze użycie innego mikrokontrolera nie powinno grać roli, gdyż dokument odnosi się do całej rodziny STM32

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...