Bird
Raised Fist0
Embedded Cprogramming~7 mins

Timer prescaler and clock division in Embedded C

Choose your learning style10 modes available
Introduction

Timers count clock pulses to measure time. A prescaler slows down the timer clock so it counts slower, letting you measure longer times easily.

You want to create a delay longer than the timer's maximum count.
You need to measure slow events with a fast microcontroller clock.
You want to reduce power by running the timer at a slower speed.
You want to generate a specific frequency output using a timer.
You want to adjust timer resolution for different applications.
Syntax
Embedded C
TIMx->PSC = prescaler_value; // Set prescaler register
TIMx->ARR = auto_reload_value; // Set timer max count
TIMx->CR1 |= TIM_CR1_CEN; // Enable timer

The prescaler divides the main clock by (prescaler_value + 1).

Setting prescaler to 0 means no division (timer runs at full clock speed).

Examples
This sets the timer to count every 1 ms if the clock is 8 MHz (8 MHz / 8000 = 1 kHz).
Embedded C
TIM2->PSC = 7999; // Divide clock by 8000
TIM2->ARR = 999;  // Count up to 1000
TIM2->CR1 |= TIM_CR1_CEN; // Start timer
Timer counts very fast, useful for short precise timing.
Embedded C
TIM3->PSC = 0; // No prescaler, timer runs at full clock speed
TIM3->ARR = 65535; // Max count for 16-bit timer
TIM3->CR1 |= TIM_CR1_CEN; // Start timer
Sample Program

This program sets up a timer to count 1 second intervals by using a prescaler and auto-reload value. The timer clock is slowed down by the prescaler to make counting easier.

Embedded C
#include <stdint.h>
#include "stm32f4xx.h" // Example MCU header

void timer_init(void) {
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Enable clock for TIM2
    TIM2->PSC = 7999; // Prescaler: divide clock by 8000
    TIM2->ARR = 999;  // Auto-reload: count to 1000
    TIM2->CNT = 0;    // Reset counter
    TIM2->CR1 |= TIM_CR1_CEN; // Start timer
}

int main(void) {
    timer_init();
    while(1) {
        if (TIM2->SR & TIM_SR_UIF) { // Check update interrupt flag
            TIM2->SR &= ~TIM_SR_UIF; // Clear flag
            // Timer reached 1 second (assuming 8 MHz clock)
        }
    }
}
OutputSuccess
Important Notes

Prescaler value is always one less than the division factor.

Changing prescaler affects timer speed and resolution.

Always clear timer interrupt flags after handling to avoid repeated triggers.

Summary

Prescaler slows down the timer clock by dividing the main clock.

Use prescaler to measure longer times or slower events.

Timer count speed = main clock / (prescaler + 1).

Practice

(1/5)
1. What is the main purpose of a timer prescaler in embedded C programming?
easy
A. To generate an interrupt on every clock cycle
B. To increase the CPU clock speed
C. To divide the main clock frequency and slow down the timer counting
D. To reset the timer counter automatically

Solution

  1. Step 1: Understand the role of a prescaler

    A prescaler divides the main clock frequency to slow down the timer's counting speed.
  2. Step 2: Compare options with prescaler function

    Only To divide the main clock frequency and slow down the timer counting correctly describes this function; others describe unrelated timer features.
  3. Final Answer:

    To divide the main clock frequency and slow down the timer counting -> Option C
  4. Quick Check:

    Prescaler divides clock = To slow timer [OK]
Hint: Prescaler always divides clock to slow timer [OK]
Common Mistakes:
  • Confusing prescaler with timer reset
  • Thinking prescaler speeds up the clock
  • Assuming prescaler triggers interrupts
2. Which of the following is the correct way to set a prescaler value of 8 for a timer in embedded C?
easy
A. TCCR0 |= (1 << CS01);
B. TCCR0 |= (1 << CS00);
C. TCCR0 |= (1 << CS02);
D. TCCR0 |= (1 << CS01) | (1 << CS00);

Solution

  1. Step 1: Recall prescaler bits for timer0

    For prescaler 8, only bit CS01 must be set.
  2. Step 2: Match bits to options

    TCCR0 |= (1 << CS01); sets CS01 bit, correctly configuring prescaler 8.
  3. Final Answer:

    TCCR0 |= (1 << CS01); -> Option A
  4. Quick Check:

    Prescaler 8 = CS01 set only [OK]
Hint: Check datasheet bits for prescaler values [OK]
Common Mistakes:
  • Setting multiple bits for prescaler 8
  • Confusing bit positions for prescaler values
  • Using wrong register for timer control
3. Given a microcontroller clock of 16 MHz and a timer prescaler set to 64, what is the timer tick frequency?
medium
A. 1,000,000 Hz
B. 250,000 Hz
C. 16,000,000 Hz
D. 64 Hz

Solution

  1. Step 1: Calculate timer tick frequency

    Timer tick frequency = CPU clock / prescaler = 16,000,000 / 64 = 250,000 Hz.
  2. Step 2: Compare with options

    250,000 Hz matches the calculated frequency exactly.
  3. Final Answer:

    250,000 Hz -> Option B
  4. Quick Check:

    16MHz/64 = 250kHz [OK]
Hint: Divide clock by prescaler for tick frequency [OK]
Common Mistakes:
  • Multiplying instead of dividing clock by prescaler
  • Using wrong prescaler value
  • Confusing frequency units
4. Identify the error in this code snippet setting a prescaler of 256 for Timer1:
  TCCR1B = (1 << CS12) | (1 << CS10);
medium
A. CS12 bit is missing
B. No error, code is correct
C. TCCR1B register is incorrect for prescaler
D. CS10 should not be set for prescaler 256

Solution

  1. Step 1: Check prescaler bits for 256 on Timer1

    Prescaler 256 requires only CS12 bit set; CS10 must be cleared.
  2. Step 2: Analyze given code

    Code sets both CS12 and CS10 bits, which corresponds to prescaler 1024, not 256.
  3. Final Answer:

    CS10 should not be set for prescaler 256 -> Option D
  4. Quick Check:

    Prescaler 256 = only CS12 set [OK]
Hint: Only set bits matching prescaler exactly [OK]
Common Mistakes:
  • Setting extra bits causing wrong prescaler
  • Confusing prescaler bit combinations
  • Assuming code is correct without checking datasheet
5. You want to measure a 1-second delay using a 16-bit timer with a 16 MHz clock. Which prescaler value should you choose to make the timer count up to 1 second without overflow? (Timer max count = 65535)
hard
A. Prescaler 1024
B. Prescaler 64
C. Prescaler 128
D. Prescaler 8

Solution

  1. Step 1: Calculate timer tick frequency for each prescaler

    Tick frequency = 16,000,000 / prescaler. For 1024: 16,000,000 / 1024 ≈ 15,625 Hz.
  2. Step 2: Calculate max timer duration

    Max duration = max count / tick frequency = 65535 / 15,625 ≈ 4.19 seconds, which covers 1 second.
  3. Step 3: Check smaller prescalers

    Prescaler 128 gives 125,000 ticks per second, 64 gives 250,000, and 8 gives 2,000,000--all exceeding 65,535, causing overflow before 1 second.
  4. Final Answer:

    Prescaler 1024 -> Option A
  5. Quick Check:

    Prescaler 1024 allows 1s count without overflow [OK]
Hint: Choose prescaler so max count ≥ ticks in 1 second [OK]
Common Mistakes:
  • Ignoring timer max count limit
  • Choosing prescaler too small causing overflow
  • Not calculating ticks per second correctly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard