Forum: Mikrocontroller und Digitale Elektronik STM32F4 - Timer


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Guten Abend :)

Folgendes Szenario (bin neu in der µC Welt :) ):
Ein Timer setzt jedes mal, nachdem er seinen Maximalwert erreicht hat, x 
= x + 1. Gehe ich richtig der Annahme, dass der Timer während der 
Variablensetzung, oder auch weiterführendem Code, sofort im nächsten 
Takt, nachdem er seinen Maximalwert erreicht hat, wieder bei 0 anfängt 
(UpCounter)?

Danke schonmal!


Grüße
Reggie

von Stephan (Gast)


Lesenswert?

Reginald L. schrieb:
> Ein Timer setzt jedes mal, nachdem er seinen Maximalwert erreicht hat, x
> = x + 1

warum sollte ein Timer das machen?

Der Timer sagt lediglich irgendwann Bescheid des sein vorgegebener 
Zählwert erreicht ist. Was weiter passiert musst Du dann schon 
festlegen. Wenn Du möchtest daß eine Variable hoch oder runter gezählt 
wird musst Du das schreiben.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Du hast meine Frage leider nicht verstanden ;)

Es geht darum, ob der Timer bei jedem Takt um einen Wert hochspringt, 
auch, wenn dazwischen Code ausgeführt wird und der Timer vom Maximalwert 
wieder auf 0 springt. Wäre ja eigentlich der Sinn eines Timers. Im 
Internet habe ich schon gegoogelt, aber genau diese konkrete Frage 
konnte ich mir nicht beantworten. Bin wie gesagt, neu auf dem Gebiet.

Danke nochmal!

EDIT: Wenn ich deinen Text nochmals durchlese, hab ich vielleicht deine 
Antwort nicht verstanden ;) Kann ich den Wert des Timers nicht abfragen?

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Der Timer ist Hardware und läuft unabhängig von der Software sobald er 
konfiguriert ist.

Wenn man Überläufe zählen will kann man das natürlich in Software 
machen. Das interessiert aber den Timer nicht.

Wie schnell der Timer läuft hängt btw. vom Prescaler ab.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Alles klar, tausend Dank und schönen Abend noch!

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Eine Frage noch hinterhergeschmissen, weils so schön war :)

Es geht um den 32bit Counter:
1
>> BusClock    = 42*10^6; %MHz
2
TimerCounts = 2^32;       %32bit
3
TimeStep    = 0.000001;   %in s
4
5
SecondsForLoop = TimeStep * TimerCounts  % Time for 1 loop of counter in s
6
NewClock = TimerCounts / SecondsForLoop; 
7
PreScaler = BusClock / NewClock          % Time for 1 step of counter in s
8
9
SecondsForLoop =
10
11
   4.2950e+03
12
13
14
PreScaler =
15
16
    42

Stimmt die Rechnung so? Kommt mir irgendwie "krass viel" vor.
ST Manual, 32bit: max count 51.1s, min period 0.0119µs. Bezieht sich max 
count auf min period?

Danke nochmals :)

von Martin (Gast)


Lesenswert?

Welcher Busclock ist gemeint? Die Peripherals und Timer laufen nicht 
unbedingt im gleichen Takt. Schau dir den Clock tree an.

2^32 ist ja auch 'ne große Zahl.

0.0119µs ist gerundet die Periodendauer der genannten Einstellung von 
84MHz.
Der Timer läuft dann nach 2^32/84000000 Sekunden über, was 51.1s 
entspricht.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Mit Busclock ist der vom APB1 gemeint (Timer3). Da bin ich mir übrigens 
auch nicht sicher. Danke für den Tipp, hab ich ganz vergessen, da gibt's 
von ST doch das kleine Programm.

Ah Ok, große Zahl, ist ja mega cool. So ein Timer ist genial, genau was 
ich brauche.

Vielen lieben Dank nochmal!

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Ich glaube jetzt hab ichs, für ein kurzes Feedback wäre ich dankbar.

Auszug aus der system_stm32f4xx.c:
1
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx)
2
    /* PCLK2 = HCLK / 2*/
3
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
4
5
    /* PCLK1 = HCLK / 4*/
6
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

Wenn ich hier nach dem Tool von ST und dem geposteten Code gehe, heißt 
das, ich habe auf APB1 einen PreScaler von 4 drin, PCLK1 wie auf Bild 
42MHz. Analog dazu APB2, PreScaler 2, PCLK2 84MHz. Soweit so klar. Aber 
was ist das für ein "X 2" auf dem Bild? Da steige ich noch nicht so ganz 
durch. Ist das der PreScaler vom Timer? Eher nicht, oder? Wo finde ich 
den im Code?

von Christian K. (the_kirsch)


Lesenswert?

Reginald L. schrieb:
> Aber
> was ist das für ein "X 2" auf dem Bild? Da steige ich noch nicht so ganz
> durch.

Da ist eine Taktverdoppelung gemeint, siehst du ja im Textfeld daneben 
das die Zahl doppelt so Groß ist.

von Martin (Gast)


Lesenswert?

>Aber was ist das für ein "X 2" auf dem Bild? ...
>Ist das der PreScaler vom Timer? Eher nicht, oder?
>Wo finde ich den im Code?

Das ist einfach ein mal 2. Der Faktor zwischen Peripheral Clock und 
Timer Clock. Ob der Faktor 1 oder 2 ist hängt von der Einstellung des 
Prescalers direkt davor ab. (AFAIR x2 wenn der Prescaler teilt, 1 wenn 
der Prescaler 1:1 durchreicht).

Die Timer haben dann jeweils zusätzlich ihre eignen Prescaler mit denen 
die APBx Timer Clocks 'runter geteilt werden können bevor sie in die 
eigentlichen Timer laufen.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Martin schrieb:
>>Aber was ist das für ein "X 2" auf dem Bild? ...
>>Ist das der PreScaler vom Timer? Eher nicht, oder?
>>Wo finde ich den im Code?
>
> Das ist einfach ein mal 2. Der Faktor zwischen Peripheral Clock und
> Timer Clock. Ob der Faktor 1 oder 2 ist hängt von der Einstellung des
> Prescalers direkt davor ab. (AFAIR x2 wenn der Prescaler teilt, 1 wenn
> der Prescaler 1:1 durchreicht).
>
> Die Timer haben dann jeweils zusätzlich ihre eignen Prescaler mit denen
> die APBx Timer Clocks 'runter geteilt werden können bevor sie in die
> eigentlichen Timer laufen.

Gehört das hier dazu?
1
void RCC_TIMCLKPresConfig  ( uint32_t  RCC_TIMCLKPrescaler )  
2
3
Configures the Timers clocks prescalers selection. 
4
5
Note:
6
This function can be used only for STM32F42xxx/43xxx and STM32F401xx/411xE devices.
7
Parameters:
8
RCC_TIMCLKPrescaler : specifies the Timers clocks prescalers selection This parameter can be one of the following values: 
9
RCC_TIMPrescDesactivated: The Timers kernels clocks prescaler is equal to HPRE if PPREx is corresponding to division by 1 or 2, else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to division by 4 or more. 
10
RCC_TIMPrescActivated: The Timers kernels clocks prescaler is equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding to division by 8 or more.

Da steht aber nichts vom STM32F407. Jetzt bin ich total durcheinander. 
Ist gar nicht so einfach, mit den Dokumentationen von ST. Hat mein 
STM32F407VGT6 nun diesen Prescaler oder nicht? Nach STM32CubeMX ja, nach 
der SPL nein.

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

Der Prescaler ist fest, den kann man nicht ändern, deswegen wirst du ihn 
im Quellcode auch nicht finden.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Christian K. schrieb:
> Der Prescaler ist fest, den kann man nicht ändern, deswegen wirst du ihn
> im Quellcode auch nicht finden.

Aaaah, OK, vielen Dank. Deshalb kann man den im Cube wohl auch nicht 
anklicken ;)

von Christian K. (the_kirsch)


Lesenswert?

Ich meine den konstanten Faktor x2 am Ende des Clocktrees der zu den 
Timer geht.

Jeder Timer hat noch einen eigenen Prescaler den du in deinem Code 
einstellen musst.


Wenn du die HAL verwendest geht das so:
1
TIM_HandleTypeDef hT4; //global handle
2
3
void initTIM4(void){
4
  __HAL_RCC_TIM4_CLK_ENABLE();
5
  hT4.Instance = TIM4;
6
  hT4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // ClockDivision not supported
7
  hT4.Init.Prescaler = 239; // 84 MHz / (239 + 1) = 100 KHz
8
  hT4.Init.Period = 799; // 100 KHz / (799 + 1) = 125 Hz
9
  hT4.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  hT4.Init.RepetitionCounter = 0;
11
  HAL_TIM_Base_Init(&hT4);
12
  //HAL_TIM_Base_Start(&hT4);
13
  HAL_TIM_Base_Start_IT(&hT4);
14
}
In dem Beispiel hatte ich ein Timer clock von 84 MHz eingestellt. Der 
Timer hat einen Überlauf alle 8ms (125Hz)

: Bearbeitet durch User
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Ja, das ist mir schon klar :)

Ah, aber danke für den Hinweis mit der - 1, ich nehme an das ist wegen 
dem ersten Zählschritt "0"?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Jetzt muss ich den Thread hier doch noch ausgraben.

Im Prozessordatenblatt steht, dass der schnellste Schritt des Timers 
11.9ns dauert (TimerClock 84MHz). Setze ich den Prescaler jetzt auf 
84-1, sollte er ja jede µs takten. Wo bleiben hier die 11.9ns, die er 
für jeden Takt braucht bei einem Prescaler von 1? Bzw. wo ist mein 
Fehler?

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.