Ankieta: Jaki system operacyjnym preferujesz
Ankieta jest zamknięta.
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]

Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie ARM, nauka, środowiska programistyczne IDE
SQ8MVY Offline
Paweł
****

Liczba postów: 724
Dołączył: 30-07-2011
Post: #54
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
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ł
(Ten post był ostatnio modyfikowany: 06-07-2016 10:12 przez SQ8MVY.)
06-07-2016 8:53
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie ARM, nauka, środowiska programistyczne IDE - SQ8MVY - 06-07-2016 8:53

Skocz do:


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