Chapter 09 - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

09. General-Purpose Timer (TIM2)

Goal

STM32F439ZI์˜ TIM2 General-Purpose Timer๋ฅผ ์ด์šฉํ•ด 1์ดˆ ์ฃผ๊ธฐ(1 Hz) ๋ฅผ ๋งŒ๋“ค๊ณ , 1์ดˆ๋งˆ๋‹ค LD1(PB0)์„ toggleํ•œ๋‹ค.

์ด๋ฒˆ ์žฅ์˜ ํ•ต์‹ฌ ํ๋ฆ„:

16 MHz Timer Clock
        โ†“
PSC = 1599
        โ†“
10 kHz
        โ†“
ARR = 9999
        โ†“
1 Hz Update Event
        โ†“
UIF = 1
        โ†“
LED Toggle

์‚ฌ์šฉ register:

RCC->APB1ENR
TIM2->PSC
TIM2->ARR
TIM2->CNT
TIM2->CR1
TIM2->SR

1. TIM2 ํ•ต์‹ฌ

Ch08์˜ SysTick์€ Cortex-M core ๋‚ด๋ถ€ timer์˜€๋‹ค.

TIM2๋Š” STM32๊ฐ€ ์ œ๊ณตํ•˜๋Š” peripheral timer๋‹ค.

SysTick
โ†’ Cortex-M Core

TIM2
โ†’ STM32 Peripheral

TIM2์˜ ์ฃผ์š” register:

Register ์—ญํ• 
PSC ์ž…๋ ฅ clock ๋ถ„์ฃผ
ARR Counter ์ตœ๋Œ€๊ฐ’
CNT ํ˜„์žฌ counter value
CR1 Timer control
SR Status flag

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด:

SysTick
COUNTFLAG

vs

TIM2
UIF

์ด๋‹ค.


2. SysTick๊ณผ TIM2 ๋น„๊ต

SysTick์€ ARM Cortex-M ์ฝ”์–ด์— ํฌํ•จ๋œ ๊ณตํ†ต ํƒ€์ด๋จธ์ด๊ณ , TIM2๋Š” STM32 ์ฃผ๋ณ€์žฅ์น˜๋‹ค. ์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” TIM2์˜ Update Event ํ”Œ๋ž˜๊ทธ(UIF)๋ฅผ Pollingํ•˜์—ฌ LED๋ฅผ ํ† ๊ธ€ํ•œ๋‹ค.

ํ•ญ๋ชฉ SysTick TIM2
์†Œ์† Cortex-M ์ฝ”์–ด STM32 Peripheral
Counter 24-bit Down Counter 32-bit Counter
์ƒํƒœ ํ‘œ์‹œ COUNTFLAG UIF(Update Interrupt Flag)
์ด๋ฒˆ ์‹ค์Šต SysTick Polling TIM2 Update Event Polling

TIM2๋Š” ์ด์™ธ์—๋„ PWM, Input Capture, Output Compare ๋“ฑ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


3. Timer ์ฃผํŒŒ์ˆ˜์™€ 1 Hz ๊ณ„์‚ฐ

์›๋ณธ ์‹ค์Šต์˜ ๊ฐ€์ •: TIM2์— ๊ณต๊ธ‰๋˜๋Š” ์‹ค์ œ Timer Clock = 16 MHz.

f_update = f_TIM2 / ((PSC + 1) ร— (ARR + 1))

PSC = 1599  โ†’  16,000,000 / 1600 = 10,000 Hz
ARR = 9999  โ†’  10,000 / 10000 = 1 Hz

๊ฒฐ๊ณผ: 1์ดˆ๋งˆ๋‹ค Update Event ๋ฐœ์ƒ

PSC/ARR์€ 0๋ถ€ํ„ฐ ์„ธ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์ฃผ์œจ ๊ณ„์‚ฐ์— +1์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ด ๊ณ„์‚ฐ์€ TIM2 Clock์ด 16 MHz๋กœ ์„ค์ •๋๋‹ค๋Š” ๊ฐ€์ •์— ์˜์กดํ•œ๋‹ค. MCU ์ฝ”์–ด ํด๋Ÿญ์ด 16 MHz๋ผ๊ณ  ํ•ด์„œ ๋ชจ๋“  APB Timer ์ž…๋ ฅ ํด๋Ÿญ์ด ์ž๋™์œผ๋กœ 16 MHz๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.


4. APB1 Clock Enable

TIM2 ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์ „ RCC์˜ APB1 Peripheral Clock์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์›๋ณธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„ํŠธ 0์„ ์„ค์ •ํ•œ๋‹ค.

#define TIM2EN (1U << 0)
RCC->APB1ENR |= TIM2EN;

์ด๊ฒƒ์€ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํด๋Ÿญ ๊ฒŒ์ดํŠธ ํ™œ์„ฑํ™”์ด๊ณ , ๋ณ„๋„๋กœ CR1.CEN์„ ์„ค์ •ํ•ด์•ผ ์นด์šดํ„ฐ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.


5. PSC โ€” Prescaler

TIM2->PSC๋Š” Timer ์ž…๋ ฅ Clock์„ ๋‚˜๋ˆ„๋Š” ๋ถ„์ฃผ ๊ฐ’์„ ๋ณด์œ ํ•œ๋‹ค.

TIM2->PSC = 1600 - 1;

16 MHz / 1600 = 10 kHz๊ฐ€ ๋œ๋‹ค. (์›๋ณธ ์‹ค์Šต ๊ฐ€์ •)


6. ARR โ€” Auto-Reload Register

TIM2->ARR๋Š” ์นด์šดํ„ฐ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋Œ์•„๊ฐˆ ๊ธฐ์ค€๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค.

TIM2->ARR = 10000 - 1;

10 kHz์˜ Timer Count๋ฅผ 10,000๊ฐœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Update Event ์ฃผ๊ธฐ๋Š” 1์ดˆ๋‹ค.


7. CNT โ€” Counter

TIM2->CNT๋Š” ํ˜„์žฌ ์นด์šดํ„ฐ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์›๋ณธ ์‹ค์Šต์€ ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

TIM2->CNT = 0;

Debugger์˜ Watch์—์„œ CNT์˜ ์ฆ๊ฐ€์™€ ์ฃผ๊ธฐ์ ์ธ Reload๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.


8. CR1.CEN โ€” Timer Start

CR1์˜ 0๋ฒˆ ๋น„ํŠธ์ธ CEN์ด ์นด์šดํ„ฐ ์‹คํ–‰์„ ์ œ์–ดํ•œ๋‹ค.

#define CR1_CEN (1U << 0)
TIM2->CR1 = CR1_CEN;

์‹ค์Šต์€ ๋‹ค๋ฅธ CR1 ๋น„ํŠธ๋“ค์„ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•œ๋‹ค.


9. SR.UIF โ€” Update Event ๊ฐ์ง€ ๋ฐ Clear

Timer Update Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด TIM2->SR์˜ UIF ๋น„ํŠธ๊ฐ€ ์„ค์ •๋œ๋‹ค. ์›๋ณธ ์ฝ”๋“œ๋Š” ์ด ์ƒํƒœ๋ฅผ Pollingํ•˜๊ณ , ์ฒ˜๋ฆฌํ•œ ๋’ค Software์—์„œ UIF๋ฅผ ์ง€์šด๋‹ค.

#define SR_UIF (1U << 0)

while (!(TIM2->SR & SR_UIF)) { }
TIM2->SR &= ~SR_UIF;

UIF๋ฅผ Clearํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ TIM SR ๋น„ํŠธ๋Š” Write-0-to-Clear ์„ฑ๊ฒฉ์ด๋ฏ€๋กœ, ์‹ค๋ฌด ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค๋ฅธ Pending Flag๋ฅผ ์šฐ๋ฐœ์ ์œผ๋กœ ์ง€์šฐ์ง€ ์•Š๋„๋ก ํ•ด๋‹น MCU ๋ ˆํผ๋Ÿฐ์Šค ๋งค๋‰ด์–ผ์— ๋งž์ถฐ Clear ๋ฐฉ์‹์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ •ํ•ด์•ผ ํ•œ๋‹ค.


10. TIM2 ์ „์ฒด ๋™์ž‘ ์ˆœ์„œ

RCC APB1 Clock Enable
       โ†“
PSC = 1599
       โ†“
ARR = 9999
       โ†“
CNT = 0
       โ†“
CR1.CEN = 1
       โ†“
TIM2 Counting
       โ†“
Update Event (UIF = 1)
       โ†“
Software Polling / UIF Clear
       โ†“
LD1 Toggle

๊ตฌํ˜„ ์ˆœ์„œ ์ฃผ์˜: ์œ„ ์ˆœ์„œ๋Š” ์›๋ฆฌ ์„ค๋ช…์— ๋งž์ถ˜ ํ๋ฆ„์ด๋‹ค. ์•„๋ž˜์— ๋ณด์กดํ•œ ์›๋ณธ main.c ์ฝ”๋“œ๋Š” led_toggle()์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  UIF๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ˆœ์„œ์ด๋ฏ€๋กœ, ์ตœ์ดˆ Toggle์€ 1์ดˆ ๋’ค๊ฐ€ ์•„๋‹ˆ๋ผ ์ดˆ๊ธฐํ™” ์งํ›„ ๋ฐœ์ƒํ•œ๋‹ค. ์›๋ณธ ์‹ค์Šต ์ฝ”๋“œ์™€ ์„ค๋ช…์˜ ์ฐจ์ด๋ฅผ ์˜๋„์ ์œผ๋กœ ๋‚จ๊ฒจ ๋‘”๋‹ค.


11. ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์„ฑ

๋ณ„๋„ ๋ณด๊ด€๋œ Ch09 ์›๋ณธ์—์„œ ๋ช…์‹œ๋œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋‹ค.

Ch09_tim/
โ”œโ”€โ”€ Inc/
โ”‚   โ”œโ”€โ”€ gpio.h
โ”‚   โ””โ”€โ”€ tim.h
โ”œโ”€โ”€ Src/
โ”‚   โ”œโ”€โ”€ gpio.c
โ”‚   โ”œโ”€โ”€ tim.c
โ”‚   โ””โ”€โ”€ main.c
โ””โ”€โ”€ ๊ธฐํƒ€ ๊ณตํ†ต Startup, Linker, CMSIS ํŒŒ์ผ

Ch04์—์„œ ๋‹ค๋ฃฌ ๊ณตํ†ต MCU Startup ๋ฐ Build ํ™˜๊ฒฝ์€ ์ด ์žฅ์—์„œ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.


12. ์ „์ฒด ์ฝ”๋“œ (1) โ€” GPIO

์›๋ณธ ๋ณ„๋„ Ch09 TIM ์‹ค์Šต ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ–ˆ๋‹ค.

Inc/gpio.h

#ifndef GPIO_H
#define GPIO_H

#include <stdbool.h>

/* ---- LED (PB0, LD1 ๋…น์ƒ‰) ---- */
void led_init(void);
void led_on(void);
void led_off(void);

/* ---- Push Button (PC13, B1) ---- */
void button_init(void);
bool get_btn_state(void);

void led_toggle(void);   /* Ch08์—์„œ ์ถ”๊ฐ€ */

#endif /* GPIO_H */

Src/gpio.c

#include "stm32f4xx.h"
#include "gpio.h"

#define LED_PIN    0U   /* PB0 = LD1 (๋…น์ƒ‰) */
#define BTN_PIN    13U  /* PC13 = B1 */

void led_init(void)
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;

    GPIOB->MODER &= ~(0x3UL << (LED_PIN * 2));
    GPIOB->MODER |=  (0x1UL << (LED_PIN * 2));
}

void led_on(void)
{
    GPIOB->BSRR = (1UL << LED_PIN);        /* Set */
}

void led_off(void)
{
    GPIOB->BSRR = (1UL << (LED_PIN + 16)); /* Reset */
}

void button_init(void)
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;

    GPIOC->MODER &= ~(0x3UL << (BTN_PIN * 2));  /* Input */
    GPIOC->PUPDR &= ~(0x3UL << (BTN_PIN * 2));  /* No pull (๋ณด๋“œ๊ฐ€ ์ž์ฒด ์ฒ˜๋ฆฌ) */
}

bool get_btn_state(void)
{
    return (GPIOC->IDR & (1UL << BTN_PIN)) != 0U;  /* active-HIGH */
}

void led_toggle(void)
{
    GPIOB->ODR ^= (1UL << 0);  /* PB0 = LD1 */
}

13. ์ „์ฒด ์ฝ”๋“œ (2) โ€” TIM2

Inc/tim.h

#ifndef TIM_H_
#define TIM_H_

#include "stm32f4xx.h"

#define SR_UIF (1U << 0)

void tim2_1hz_init(void);

#endif /* TIM_H_ */

Src/tim.c

#include "tim.h"

#define TIM2EN   (1U << 0)
#define CR1_CEN  (1U << 0)

void tim2_1hz_init(void)
{
    RCC->APB1ENR |= TIM2EN;

    TIM2->PSC = 1600 - 1;   /* 16MHz -> 10kHz */
    TIM2->ARR = 10000 - 1;  /* 10kHz -> 1์ดˆ */
    TIM2->CNT = 0;
    TIM2->CR1 = CR1_CEN;
}

14. ์ „์ฒด ์ฝ”๋“œ (3) โ€” main() ๋ฐ ํ™•์ธํ•  ์‚ฌํ•ญ

Src/main.c

#include "gpio.h"
#include "tim.h"

int main(void)
{
    led_init();
    tim2_1hz_init();

    while (1)
    {
        led_toggle();

        while (!(TIM2->SR & SR_UIF)) { }
        TIM2->SR &= ~SR_UIF;
    }
}

์›๋ณธ ์ฝ”๋“œ ์ดํ•ด ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ์ฒซ ํ† ๊ธ€ ์‹œ์ : led_toggle()์ด while (!(TIM2->SR & SR_UIF)) ์•ž์— ์žˆ์–ด ์ฒซ LED ์ „ํ™˜์€ ์ดˆ๊ธฐํ™” ์งํ›„์— ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค์Œ ์ „ํ™˜๋ถ€ํ„ฐ Timer Event๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • ์‹ค์ œ Timer Clock: PSC=1599, ARR=9999์—์„œ 1 Hz๊ฐ€ ๋˜๋ ค๋ฉด TIM2์— ์ž…๋ ฅ๋˜๋Š” Clock์ด 16 MHz์—ฌ์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅธ ์„ค์ •์—์„œ๋Š” PSC/ARR ์žฌ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค.
  • UIF ์ดˆ๊ธฐ ์ƒํƒœ: Timer ์ดˆ๊ธฐํ™” ๊ณผ์ • ์ค‘ Update Flag๊ฐ€ ์ด๋ฏธ ์„ค์ •๋˜๋ฉด ์ฒซ ๋Œ€๊ธฐ ๋™์ž‘์ด ์ฆ‰์‹œ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ์ธํ„ฐ๋ฒŒ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ์‹œ์ž‘ ์ „ Flag/Update Event ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • UIF Clear: ์›๋ณธ์€ TIM2->SR &= ~SR_UIF๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋ฅธ Flag์˜ ๋ณด์กด๊ณผ W0C ๋ ˆ์ง€์Šคํ„ฐ ์ •์ฑ…๊นŒ์ง€ ๊ฒ€ํ† ํ•œ ๊ฐœ์„  ์ฝ”๋“œ๋Š” ๋ณ„๋„ ๋‹จ๊ณ„์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • Button ๊ด€๋ จ ํ•จ์ˆ˜: GPIO ์†Œ์Šค์— ๋ฒ„ํŠผ ์ดˆ๊ธฐํ™”/์ฝ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋‚˜ ์ด main.c์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด ํŽ˜์ด์ง€์— ์‹ค์€ ์ฝ”๋“œ๋Š” ์—ญ์‚ฌ์  ์‹ค์Šต ์›๋ณธ์ด๋ฉฐ, ์œ„ ์ฃผ์˜์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ด ์ƒˆ ๋นŒ๋“œ/๋ณด๋“œ ์‹คํ—˜์„ ์™„๋ฃŒํ•œ ์ˆ˜์ • ์ฝ”๋“œ๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.


15. Why TIM2?

SysTick์€ ๋‹จ์ˆœ timing์„ ๋งŒ๋“ค๊ธฐ์—๋Š” ํŽธํ•˜์ง€๋งŒ general-purpose timer๋Š” ์ดํ›„ ๋” ๋‹ค์–‘ํ•œ hardware ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

TIM
โ”œโ”€โ”€ Periodic Timing
โ”œโ”€โ”€ PWM
โ”œโ”€โ”€ Output Compare
โ”œโ”€โ”€ Input Capture
โ””โ”€โ”€ Event Generation

๋”ฐ๋ผ์„œ ์ด๋ฒˆ 1Hz ์‹ค์Šต์€ ์ดํ›„ Timer peripheral ํ™œ์šฉ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ๊ณ„๋‹ค.


16. Build Result

๊ธฐ์กด ์‹ค์Šต ๊ฒฐ๊ณผ:

text = 764 bytes
data = 0 bytes
bss  = 2560 bytes

Warning ์—†์ด build ์™„๋ฃŒ.


17. Verification

1. Build

make clean
make

Expected:

Build PASS

text = 764
data = 0
bss  = 2560

2. Check PSC

Debugger:

TIM2->PSC

Expected:

1599

๊ณ„์‚ฐ:

16 MHz / 1600
=
10 kHz

3. Check ARR

Debugger:

TIM2->ARR

Expected:

9999

๊ณ„์‚ฐ:

10 kHz / 10000
=
1 Hz

4. Check CNT

Watch:

TIM2->CNT

์‹คํ–‰ ์ค‘ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.

0
โ†’
1
โ†’
2
โ†’
...

5. Check UIF

Breakpoint๋ฅผ ๋‹ค์Œ ์ค„์— ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.

TIM2->SR &= ~SR_UIF;

1์ดˆ๊ฐ€ ์ง€๋‚˜ breakpoint์— ๋„๋‹ฌํ•˜๋ฉด:

TIM2->SR bit0
=
1

์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋‹ค์Œ clear ์ดํ›„:

UIF
=
0

์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.


6. Board

Expected:

LD1 Toggle
every 1 second

์ฆ‰:

LED ON  โ†’ ์•ฝ 1์ดˆ
LED OFF โ†’ ์•ฝ 1์ดˆ

์ด๋ฏ€๋กœ ์™„์ „ํ•œ ON/OFF cycle์€ ์•ฝ:

2 seconds

์ด๋‹ค.


18. Recommended Debug Evidence

์ด ์žฅ์—์„œ๋Š” board ์‚ฌ์ง„๋ณด๋‹ค debugger์—์„œ timer register๊ฐ€ ์‹ค์ œ ๊ณ„์‚ฐ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

PSC = 1599
ARR = 9999
CNT = increasing
UIF = 0 โ†’ 1

์ด ๋„ค ๊ฐ€์ง€๋ฅผ ํ•œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•˜๋ฉด ์ข‹๋‹ค.


19. Screenshots to Add

images/ch09_build.png
images/ch09_psc_arr.png
images/ch09_cnt.png
images/ch09_uif.png
images/ch09_led.gif

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฆ๊ฑฐ:

PSC / ARR Register
+
CNT Counting
+
UIF Assert
+
1-second LED Toggle

20. Key Points

16 MHz
   โ†“
PSC + 1 = 1600
   โ†“
10 kHz
   โ†“
ARR + 1 = 10000
   โ†“
1 Hz
   โ†“
Update Event
   โ†“
UIF
  • TIM2๋Š” STM32์˜ General-Purpose Timer๋‹ค.
  • TIM2๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— APB1 clock์„ enableํ•œ๋‹ค.
  • PSC๋Š” timer input clock์„ ๋ถ„์ฃผํ•œ๋‹ค.
  • ARR์€ timer period๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
  • CNT๋Š” ํ˜„์žฌ counter value๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Update Event ์ฃผํŒŒ์ˆ˜๋Š” f_timer / ((PSC+1) ร— (ARR+1))์ด๋‹ค.
  • 16MHz์—์„œ PSC=1599, ARR=9999๋กœ 1Hz๋ฅผ ๋งŒ๋“ ๋‹ค.
  • CR1.CEN์„ setํ•˜๋ฉด counter๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.
  • Update Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด SR.UIF๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฒˆ ์‹ค์Šต์€ UIF polling ๋ฐฉ์‹์ด๋‹ค.
  • ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ›„ UIF๋ฅผ clearํ•˜๊ณ  ๋‹ค์Œ ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ