Forum: Mikrocontroller und Digitale Elektronik SysTick_Config() Cortex M4 Verständnisprobleme


von StM (Gast)


Lesenswert?

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
7
    \return          0  Function succeeded
8
    \return          1  Function failed
9
 */
10
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
11
{
12
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
13
14
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
15
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
16
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
17
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
18
                   SysTick_CTRL_TICKINT_Msk   |
19
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
20
  return (0);                                                  /* Function successful */
21
}

von StM (Gast)


Lesenswert?

Hat keiner eine Idee?

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von StM (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von StM (Gast)


Lesenswert?

Naja ich denke die Angaben, die man überall bekommt sind schon richtig:
http://patrickleyman.be/blog/stm32f407-delay-with-systick/
Vielleicht könnt ihr jetzt besser verstehen was ich meine.

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von StM (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von StM (Gast)


Lesenswert?

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.

von Bitte schön (Gast)


Lesenswert?

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

von StM (Gast)


Lesenswert?

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.

von Bitte schön (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Bitte schön schrieb:
> JaNein, der Timer zählt von 0 bis zu dem Wert. Dann geht es von 0 wieder
> los, usw.

Fast. Er zählt in die umgekehrte Richtung.

von Bitte schön (Gast)


Lesenswert?


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.