Configuration of the TIM peripheral to generate a timebase. This example is based on the STM32C0xx TIM LL API. The peripheral initialization uses LL unitary service functions for optimization purposes (performance and size).
In this example TIM1 input clock TIM1CLK is set to APB clock (PCLK),
since APB pre-scaler is equal to 1.
TIM1CLK = PCLK
PCLK = HCLK
=> TIM1CLK = SystemCoreClock (48 MHz)
To set the TIM1 counter clock frequency to 10 KHz, the pre-scaler (PSC) is calculated as follows:
PSC = (TIM1CLK / TIM1 counter clock) - 1
PSC = ((SystemCoreClock/1) /10 KHz) - 1
SystemCoreClock is set to 48 MHz for STM32C0xx Devices.
The auto-reload (ARR) is calculated to get a timebase period of 100ms, meaning that initial timebase frequency is 10 Hz.
ARR = (TIM1 counter clock / timebase frequency) - 1
ARR = (TIM1 counter clock / 10) - 1
Update interrupts are enabled. Within the update interrupt service routine, pin PA5 (connected to LED1 on board NUCLEO-C071RB) is toggled. So the period of blinking of LED1 = 2 * timebase period.
User push-button can be used to modify the timebase period from 100 ms to 1 s in 100 ms steps. To do so, every time User push-button is pressed, the autoreload register (ARR) is updated. In up-counting update event is generated at each counter overflow (when the counter reaches the auto-reload value).
Finally the timebase frequency is calculated as follows: timebase frequency = TIM1 counter clock /((PSC + 1)(ARR + 1)(RCR + 1))
Timer, TIM, timebase, Interrupt, Clock source
This example runs on STM32C071RBTx devices.
This example has been tested with NUCLEO-C071RB board and can be easily tailored to any other supported device and development board.
In order to make the program work, you must do the following :