STM32 in Timer.Period schreiben

OP #7464151
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?

#7464159
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.

OP #7464162
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;

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