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
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ł

