Forum: Mikrocontroller und Digitale Elektronik Atmel SAM4E SysTick Verständnisproblem


von Andi K. (fry12)


Lesenswert?

Hallo Leute!

Ich möchte zu Testzwecken den SysTick-Timer meines SAM4E konfigurieren 
und damit bspw. eine LED blinken lassen.

Überall lese ich, dass mit der Initialisierung
1
SysTick_Config(sysclk_get_cpu_hz() / 1000);
der SysTick jede Millisekunde einen Interrupt triggert (Quelle bspw. 
http://www.atmel.com/Images/Atmel-42145-SAM-AT03088-Getting-Started-with-SAM4E_Application-Note.pdf).

Das wäre auch verständlich, wenn der SysTick Timer direkt mit 
Prozessortakt laufen würde. Laut Datenblatt des SAM4E (Seite 575, 
Blockschaltbild des PMC) wird aber der durch 8 dividierte Master Clock 
(MCK) verwendet. Heißt im Umkehrschluss, bei einer Maximalfrequenz des 
Prozessors von 120 MHz, würde der SysTick seinen Zähler mit 120 MHz / 8 
= 15 MHz dekrementieren. Daher bräuchte ich für einen 1ms-SysTick einen 
Initialwert von 15000 und nicht die oben angegebene Zuweisung, die 
stattdessen 120000 (= 120 MHz / 1000) liefern würde.

An andrerer Stelle des Datenblatts steht aber die Aussage "The SysTick 
counter runs on the processor clock." (Seite 254). Daher bin ich jetzt 
völlig verwirrt, was den nun richtig ist.

Mir ist bewusst, dass der SysTick Teil des Cortex-M4 ist und auch die 
SysTick_Config Funktion nicht von Atmel selbst, sondern vom ARM CMSIS 
stammt. Normalerweise würde ich denken, dass Atmel eben einen anderen 
Weg gegangen ist und den SysTick nicht mit Prozessortakt, sondern eben 
einem Achtel des Prozessortaktes laufen lässt. Stutzig hat mich nur die 
Aussage aus dem Application Note "Getting Started with SAM4E" von Atmel 
selbst gemacht, da selbst hier steht "To generate 1ms period, the only 
parameter of this function should be system clock frequency / 1000".

Oder übersehe ich einfach nur was?

Danke :)

von Jim M. (turboj)


Lesenswert?

Warum probierst Du das nicht einfach aus? Ob eine LED 1x oder 8x in der 
Sekunde blinkt, sieht man dann doch sofort...

von Andi K. (fry12)


Lesenswert?

Gerade getestet mit der Konfiguration:
1
SysTick_Config(sysclk_get_cpu_hz() / 1000);

Zusammen mit einem Counter im Interrupt-Handler, der bis 1000 zählt, 
leuchtet die LED 1s, bevor sie dann wieder für 1s aus ist (ich toggle im 
Interrupt-Handler).

Heißt also, dass nicht MCK/8 als Taktversorgung verwendet wird, sondern 
MCK. Stellt sich die Frage, wieso das in allen Atmel Datenblättern, die 
ich bisher durchgesehen habe (SAM4S/E, SAM V 71), anders dargestellt 
ist. Hängt das irgendwie mit dem Calibration Register zusammen? Dessen 
Sinn und Zweck habe ich noch nicht verstanden.

von Alexxx (Gast)


Lesenswert?

Ich würde vermuten, dass das halt wieder "Atmel-Qualität" ist.
In den Datenblättern steht zum Teil Himmel schreiender und 
widersprüchlicher Schrott.
Die Datenblätter werden anscheinend von der Marketingabteilung 
geschrieben - und nicht von den Entwicklern!
Wenn also was wiedersprüchlich ist: Einfach überlegen, wie es plausibler 
ist.
SysTick sind/sollten Ticks der Systemfrequenz sein...

von Maxx (Gast)


Lesenswert?

Alexxx schrieb:
> Ich würde vermuten, dass das halt wieder "Atmel-Qualität" ist.
> In den Datenblättern steht zum Teil Himmel schreiender und
> widersprüchlicher Schrott.

Vielleicht sollte man zwischen dem SW Framework und der HW 
Unterscheiden.
1
SysTick_Config(sysclk_get_cpu_hz() / 1000);
ist offensichtlich der Aufruf einer Funktion. Eine Funktion, die nicht 
vom DB abgedeckt ist, denn dieses beschreibt die Hardware.

Davon abgesehen lese ich im DB zu den Systick Control Register, dass der 
Systick mit MCLK läuft. Lediglich in der Überisicht zu den Fähigkeiten 
steht
1
The SysTick calibration value is fixed to 12500 which allows the generation of a time base of 1ms with SysTick clock to the maximum frequency on MCK divided by 8.

Das liest sich für mich nach einer Beschränkung, die durch die 
Kalibration entsteht, dass der SysTick nicht häufiger als MCLK / 8 
feuern darf -> Sprich du kannst keine sauberen 1ms Ticks bei MCLK < 8kHz 
erzeugen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.