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
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.
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
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.
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 :)
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.
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!
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?
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.
>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.
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
Der Prescaler ist fest, den kann man nicht ändern, deswegen wirst du ihn im Quellcode auch nicht finden.
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 ;)
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
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"?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.