Forum: Mikrocontroller und Digitale Elektronik STM32 in Timer.Period schreiben


von Christoph K. (chriskuku)


Lesenswert?

Ich habe einen Timer (TIM1 in einem STM32F103C8T6) programmiert, daß er 
mit einer Frequenz von ca. 8KHz (ca. 8372.09 Hz) läuft. Timerclock is 72 
MHz. Initialisierungscode:
1
/* USER CODE END TIM1_Init 1 */
2
  htim1.Instance = TIM1;
3
  htim1.Init.Prescaler = 0;
4
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
5
  htim1.Init.Period = 8599;
6
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
7
  htim1.Init.RepetitionCounter = 0;
8
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

Kann ich, während der Timer läuft, "on the fly" die Timer.Period 
schreiben, also z.B. TIM1->ARR=5739? Es funktioniert, aber was passiert 
genau?

Wenn z.B. der Timer mit der Periode 8599 läuft und er kriegt eine 5739 
"verpaßt", während er gerade bei 7123 mit der "Zählerei dran" ist?

Hört er dann auf? Er ist ja längst drüber, oder macht er die 8599 zu 
Ende?
Wie wäre die "saubere" Vorgehensweise? Zähler anhalten, Period neu 
schreiben und wieder starten?

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Es gibt ein Flag, dass der geschriebene Wert erst mit dem Timer Update 
neu geladen wird.

von Peter (pittyj)


Lesenswert?

Beim meinem Timer (STM H Serie) laut Handbuch
...
If the timer counter is down-counting and it reaches the zero value, 
then the timer counter value is set to the content of the timer 
auto-reload register (TIMx_ARR) and a new counting cycle is restarted.
...

Das würde bedeuten:
Den Timer Abwärts laufen lassen, und immer wenn er auf 0 kommt, wird ARR 
neu gelanden. Dann sollte er den neuen Wert nehmen.

Vielleicht geht das ja auch in der F Serie.

von Christoph K. (chriskuku)


Lesenswert?

Uwe B. schrieb:
> Es gibt ein Flag, dass der geschriebene Wert erst mit dem Timer Update
> neu geladen wird.

Danke. Gefunden.
"The auto-reload register is preloaded. Writing to or reading from the 
auto-reload register accesses the preload register. The content of the 
preload register are transferred into the shadow register permanently or 
at each update event (UEV), depending on the auto-reload preload enable 
bit (ARPE) in TIMx_CR1 register. The update event is sent when the 
counter reaches the overflow (or underflow when downcounting) and if the 
UDIS bit equals 0 in the TIMx_CR1 register. It can also be generated by 
software. The generation of the update event is described in detailed 
for each configuration."

Das wird dann diese Zeile sein:
1
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

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.