Ankieta: Jaki system operacyjnym preferujesz
Nie posiadasz uprawnień, aby oddać głos w tej ankiecie.
Windows
60.78%
31 60.78%
Linux
31.37%
16 31.37%
MAC/OS
7.84%
4 7.84%
Inny
0%
0 0%
Razem 51 głosów 100%
*) odpowiedź wybrana przez Ciebie [Wyniki ankiety]

Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie ARM, nauka, środowiska programistyczne IDE
#54
Witaj,

Niech zgadnę.... Diody mrugają Ci około 3 razy za wolno ?

W tym przykładzie mają świecić naprzemiennie po 0.5 sekundy.
Jeżeli tak nie jest, to znaczy, że obliczona wartość w SystemCoreClock nie pokrywa się z rzeczywistą częstotliwością jaką jest taktowany rdzeń.

Dzieje się tak, ponieważ częstotliwość rezonatora kwarcowego zewnętrznego nie ma takiej wartości jak przypisana do HSE_VALUE w pliku stm32f4xx.h lub system_stm32f4xx.c. Domyślnie do HSE_VALUE przypisana jest wartość 25000000 (25Mhz), natomiast kwarc zewnętrzny na płytce stm32f429I Discovery ma częstotliwość 8000000 (8Mhz).

Z tego wynika, że obliczona wartość częstotliwości jest błędna, jeżeli bez wiedzy użytkownika funkcja startowa SystemInit() rozpędza zegary na maxa z użyciem zewnętrznego kwarcu.

Należy więc poprawić ręcznie wartość HSE_VALUE na taką, jaką ma zewnętrzny kwarc dołączony do STM-a

W projekcie utworzonym w EmBitz zegary domyślnie są rozpędzane na maxa w funkcji SystemInit()
Natomiast w projekcie utworzonym w SeggerStudio funkcja SystemInit() nie rusza konfiguracji zegarów, czyli rdzeń pracuje z domyślnym zegarem wewnętrznym 16Mhz.

Funkcja SystemInit() jest wywoływana w sekcji inicjalizującej procesor, jeszcze przed funkcją main()

Co do przykładu. Dlaczego jest SystemCoreClock/8.
Trzeba powiedzieć, że licznik SysTicka jest tylko 24 bitowy. Więc zmieści wartość 2^24 (16.7 mln). Jeżeli wartość SystemCoreClock/2, która jest przekazana jako parametr funkcji konfigurującej SysTicka. będzie się mieścić w liczniku SysTicka, to zostanie on skonfigurowany i funkcja zwróci 0.

Jeżeli wartość SystemCoreClock/2 będzie większa od 2^24 to funkcja konfigurująca SysTick-a zwróci wartość rózną od 0 (błąd), instrukcja warunkowa "if" pozwoli na wywołanie funkcji konfigurującej SysTick-a z parametrem SystemCoreClock/8/2, następnie zostanie włączony preskaler /8 licznika SysTicka. Więc licznik SysTicka będzie taktowany częstotliwością rdzenia podzieloną przez 8.

Dlatego też, przerwanie SysTicka bez względu na częstotliwość taktowania rdzenia będzie wykonywane co 0.5 sek , bo wartość SystemCoreClock dzielimy przez 2
73 Paweł
Odpowiedz


Wiadomości w tym wątku

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości