Microcontroller Interfacing Tutorials

Learn it by examples - (Timers)

By David Kebo Houngninou

On this page, you will find some interfacing experiments using the ARM Cortex M3.
- The evaluation board we target is the MCBSTM32C running on the STM32F107VC microcontroller.
- The tutorial focuses on configuring the MCBSTM32C and interfacing.
- Datasheets and documentation for STMicroelectronics STM32F107VC core is available at: http://www.keil.com/dd/chip/4889.htm.
- The reference used for this tutorial is the RM0008 Reference manual for STM32F107xx advanced ARM®-based 32-bit MCUs.

Tutorial 4: Timers

Timers are clock sources used as the ‘heartbeats’ for operations.

e.g. of applications using timers:
Counting pulses
Measuring time periods of waveforms
Generating pulse width modulation (PWM) signals
Triggering external devices
Timing special events

03 groups of timers:

  • Basic Timers
  • General Purpose Timers
  • Advanced Timers (TIM1&TIM8)

1- Basic Timers



no I/O channels for input capture
no PWM generation
Only used for time-base generation

2- General Purpose Timers



PWM generation
Input capture
Time-base generation
Output compare

3- Advanced Timers



Advanced PWM generation
Input capture
Time-base generation
Output compare

Timers pin

Each timer is associated with an I/O pin
Configure the alternate function to use the timer pin

What is an alternate function (A.F)?

In addition to general purpose input and output the ARM subsystem can implement other specialized input output functions.
e.g. TIM4_Ch4 is an alternate function for pin PB9

TIMx functional description

The main block of the timer is a 16-bit counter TIMx_CNT with an auto-reload register TIMx_ARR
The counter can count up, down or both up and down.
The counter clock can be divided by a pre-scaler TIMx_PSC


TIMx functional description

Counter timing diagram with pre-scaler division change from 1 to 2

Timer configuration

RCC->APB1ENR //Enable clock to the timer

RCC->APB2ENR //Enable the Alternate function and the GPIO clock

(TIMx_SMCR)TIMx slave mode control register //Set the internal clock as system clock

(TIMx_PSC)TIMx pre-scaler register // Set the pre-scaler

(TIMx_CR1)TIMx control register // Enable the timer


1.Enable clock to the timer
2.Enable the Alternate function and the GPIO clock
3.Set the internal clock as system clock
4.Set the pre-scaler
5.Enable the timer

Notes about the clock usage:

The HSI clock signal is generated from an internal 8 MHz RC oscillator and can be used directly as a system clock.
(HSI) high-speed internal oscillator

To set the pre-scaler register:
Use the counter clock frequency (CK_CNT), CK_CNT = fCK_PSC / (PSC[15:0] + 1)

Timer example

A developer is writing a function for a counter user a timer.
The internal HIS clock signal runs at 8 MHz
What is value to set the pre-scaler to count every millisecond?

CK_CNT = fCK_PSC / (PSC[15:0] + 1)
PSC[15:0] + 1 = fCK_PSC / 1000
PSC[15:0] = (fCK_PSC / 1000) - 1
PSC[15:0] = 7999

Timer clock


Timer clock

Advanced Peripheral Bus 1 Enable Register

RCC->APB1ENR |= (1<<2); //enable clock to TIM4.

Timer clock

Advanced Peripheral Bus 2 Enable Register

// e.g: To use TIM4
RCC->APB2ENR |= (1)|(1<<3);    //Enable the A.F clock and the GPIO clock

Timer pre-scaler register


Timer pre-scaler register

TIM1&TIM8 pre-scaler (TIMx_PSC)
PSC[15:0]: Pre-scaler value

Timer slave mode register


Timer slave mode register

TIM1&TIM8 slave mode control register (TIMx_SMCR)
SMS = 000, the pre-scaler is clocked directly by the internal clock.

Timer control register


Timer control register

TIM1&TIM8 control register 1 (TIMx_CR1)
CEN: Counter enable
0: Counter disabled
1: Counter enabled