Ich probiere grade die SysTick_Config() Funktion(CMSIS - core_cm4.h) ein
wenig genauer zu verstehen:
Nachdem ich jetzt so halb verstanden habe, warum der Divisor bei kleiner
werdenden Abständen immer größer wird -> die Frequenz wird größer. Und
da ist auch schon mein erstes Problem: Warum teile ich um die Abstände
immer kleiner zu machen(Vorteiler oder was ist das) mit der Frequenz,
die ich haben will? Ich teile doch die Frequenz des Prozessors(STM32F4)
und da müsste der Teilfaktor doch immer kleiner werden, je größer ich
die Frequenz haben will!?
Um das zu verstehen habe ich mir die Funktion angeschaut, um mir etwas
Klarheit zu verschaffen. Ich hatte vermutet, dass da irgendeine
Umrechnung implementiert ist, die es uns einfacher machen soll, die
Frequenzen zu berechnen. Aber nichts von alledem. Leider habe ich kaum
etwas verstanden von dem paar Zeilen. Ich bitte euch deshalb mir diese
Funktion zu erklären, und auch die Werte, die dann da in die Register
eingelesen werden.
schon mal vielen Dank
StM
PS: Hier ist der Code der Funktion:
1
/** \brief System Tick Configuration
2
3
This function initialises the system tick timer and its interrupt and start the system tick timer.
4
Counter is in free running mode to generate periodical interrupts.
5
6
\param [in] ticks Number of ticks between two interrupts
Vielleicht versteht niemand dein Problem. Ich jedenfalls habe ein
Problem mit Sätzen wie "Nachdem ich jetzt so halb verstanden habe, warum
der Divisor bei kleiner werdenden Abständen immer größer wird -> die
Frequenz wird größer."
Die Funktion definiert Systick so, dass alle tick AHB Takte ein
Interrupt ausgelöst wird. Die Zeilen zu kommentieren ist sinnlos, das
steht alles schon drin. Den Rest verrät das Cortex M4 Programming
Manual.
NB: Es ist ein kleiner Fehler eingebaut. Der anfängliche Test ist ein
klitzekleines Bisschen zu restriktiv.
A. K. schrieb:> NB: Es ist ein kleiner Fehler eingebaut. Der anfängliche Test ist ein> klitzekleines Bisschen zu restriktiv.
Ich würde sagen, es wird nicht der Takt vom AHB sondern der Takt des
Prozessors wird verwendet.
A. K. schrieb:> Vielleicht versteht niemand dein Problem. Ich jedenfalls habe ein> Problem mit Sätzen wie "Nachdem ich jetzt so halb verstanden habe, warum> der Divisor bei kleiner werdenden Abständen immer größer wird -> die> Frequenz wird größer."
Hast wahrscheinlich recht, ich meinte: Die Abstände zwischen den
Interrupts werden kleiner, obwohl der
Teiler(SysTick_Config(SystemCoreClock1000) größer wird. Das habe ich mir
so erklärt, dass man die gewünschte Frequenz(in desem Fall 1000) als
Teiler übergibt. Aber warum man das so gemacht habe habe ich mir nicht
erklären können.
StM schrieb:> Ich würde sagen, es wird nicht der Takt vom AHB sondern der Takt des> Prozessors wird verwendet.
Mangels CM4 hatte ich beim CM3 reingesehen, und da steht
1: Processor clock (AHB)
Ist das beim CM4 anders?
StM schrieb:> Teiler(SysTick_Config(SystemCoreClock1000) größer wird.
Jetzt müsste ich nur noch wissen, was SystemCoreClock1000 ist.
Wenn das Board hier eine Division geklaut hat: Wenn du 1000 Systicks pro
Sekunde haben willst, obige Funktion den Systick auf einen Interrupt
alle "ticks" Proztakte programmiert und SystemCoreClock der Proztakt in
Hertz ist, also die Anzahl Takte pro Sekunde, dann passt das.
StM schrieb:> ich meinte: Die Abstände zwischen den> Interrupts werden kleiner, obwohl der> Teiler(SysTick_Config(SystemCoreClock1000) größer wird.
Denkst du dir das so oder ist das wirklich so? Und wenn das wirklich so
ist, dann solltest du dem Compiler eine Chance geben, und ihm den
jeweils echten Takt verraten. Den misst der nämlich nicht nach (wie?),
sondern leitet ihn aus deinen Angaben ab.
Wenn die falsch sind, dann sind es SystemCoreClock und der Systick auch.
Es reicht auch nicht aus, dem Compiler den Wunschtakt zu verraten, wenn
man den Prozessor nicht entsprechend konfiguriert.
StM schrieb:> Naja ich denke die Angaben, die man überall bekommt sind schon richtig:
Wenn eine Platine, die jemand im Web als Basis verwendet, mit 8MHz als
Grundtakt arbeitet, deine aber mit 12MHz, dann ist nichts richtig.
Und wenn du ins Include-File 80MHz reinschreibst, dann wird der
Prozessor nur dann mit diesen 80MHz arbeiten, wenn du das entsprechend
programmierst. Von alleine passiert das nicht.
Wenn dein Prozessor also nicht mit dem Takt arbeitet, den dein Programm
bzw. der CMSIS Code annimmt, dann gilt das alte Prinzip:
Schrott rein, Schrott raus
Daran ändern dann auch Weblinks nichts.
Es geht um genau meinen Prozessor auf dieser Website(168Mhz), aber ich
bin mit auch ziemlich sicher, dass das bei allen c-m4 so ist.
Referenz "the definitive guide to arm cortex m3 and cortex m4
prozessors" Joseph Yiu Seite 314 folgende
Auch der läuft ab Reset nicht mit 168MHz. Das wird ähnlich wie bei den
STM32 CM3 sein, die mit 8MHz starten und es dem Programm überlassen,
daraus mehr MHz zu machen.
Da wir Systecoreclock teilen und das im besagten Buch genau so gemacht
wird, nehme ich an, dass das genau so ist wie man es gerne haben möchte.
Aber meine ursprüngliche Frage war, ob mir jemand erklären kann, wie die
Geschichte mit diesem Teiler funktioniert.
StM schrieb:> Ich bitte euch deshalb mir diese> Funktion zu erklären, und auch die Werte, die dann da in die Register> eingelesen werden.
Wo ist das Problem?
- Bereichsprüfung
- ähnlich anderen Timern wird ein Nachladewert gespeichert
- Interrupt installieren
- Startwert einstellen
- Initialisierung anstoßen und Funktion aktivieren
Bitte schön schrieb:> StM schrieb:>> Ich bitte euch deshalb mir diese>> Funktion zu erklären, und auch die Werte, die dann da in die Register>> eingelesen werden.>> Wo ist das Problem?> - Bereichsprüfung> - ähnlich anderen Timern wird ein Nachladewert gespeichert> - Interrupt installieren> - Startwert einstellen> - Initialisierung anstoßen und Funktion aktivieren
Also die Kurzerklärung. Vielen Dank. Eine Frage habe ich allerdings
noch: Was wird da für ein Wert in das Reload-Register eingelesen? Sind
das die Ticks, die zwischen den Interrupts liegen? ICh glaube jetzt habe
ich es verstanden. Korregiert mich bitte wenn es falsch ist.
StM schrieb:> Was wird da für ein Wert in das Reload-Register eingelesen? Sind> das die Ticks, die zwischen den Interrupts liegen?
JaNein, der Timer zählt von 0 bis zu dem Wert. Dann geht es von 0 wieder
los, usw.