Skocz do zawartości

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.

Link do komentarza
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.

Link do komentarza
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ą? 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
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?

Link do komentarza
Share on other sites

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
Link do komentarza
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
Link do komentarza
Share on other sites

Dlaczego przy wprowadzaniu TIM10 pojawia się też komenda inicjalizacji zegara portu H?
 __HAL_RCC_GPIOH_CLK_ENABLE();

Chciałbym też zauważyć, iż w rozwiązaniu zadania domowego nie zrealizowano 2s przerwy między cyklem zapalania i gaszenia LED.

Edytowano przez Emerid
Link do komentarza
Share on other sites

@Emerid dzięki za zgłoszenie tematu - zapisuję obie kwestie do weryfikacji. Ten kurs jest już całkiem stary (ma 5 lat) i właśnie debatujemy wewnętrznie co dalej z nim zrobić, bo z jednej strony można go odświeżyć (głównie ze względu na zmiany w IDE), ale z drugiej strony można tutaj zrobić znacznie większą rewolucję 🙂

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.