STM32F4 - Timer

OP (Firma: HEGRO GmbH) #4219249
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
Gast #4219264
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.
OP (Firma: HEGRO GmbH) #4219273
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?
Gast #4219289
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.
OP (Firma: HEGRO GmbH) #4219303
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 :)
Gast #4219319
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.
OP (Firma: HEGRO GmbH) #4219329
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!
OP (Firma: HEGRO GmbH) #4219497
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?
Angehängte Dateien:
Gast #4219525
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.
OP (Firma: HEGRO GmbH) #4219609
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.
#4219649
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)
OP (Firma: HEGRO GmbH) #4224726
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren