Repository navigation
Chapter 09
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->SRCh08의 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
이다.
SysTick은 단순 timing을 만들기에는 편하지만 general-purpose timer는 이후 더 다양한 hardware 기능으로 확장할 수 있다.
TIM
├── Periodic Timing
├── PWM
├── Output Compare
├── Input Capture
└── Event Generation따라서 이번 1Hz 실습은 이후 Timer peripheral 활용의 가장 기본적인 단계다.
기존 실습 결과:
text = 764 bytes
data = 0 bytes
bss = 2560 bytesWarning 없이 build 완료.
make clean
makeExpected:
Build PASS
text = 764
data = 0
bss = 2560
Debugger:
TIM2->PSCExpected:
1599계산:
16 MHz / 1600
10 kHz
Debugger:
TIM2->ARRExpected:
9999계산:
10 kHz / 10000
1 Hz
Watch:
TIM2->CNT실행 중 값이 증가하는 것을 확인한다.
0
→
1
→
2
→
...Breakpoint를 다음 줄에 걸 수 있다.
TIM2->SR &= ~SR_UIF;1초가 지나 breakpoint에 도달하면:
TIM2->SR bit0
1
인지 확인한다.
그다음 clear 이후:
UIF
0
으로 돌아가는지 확인한다.
Expected:
LD1 Toggle
every 1 second즉:
LED ON → 약 1초
LED OFF → 약 1초이므로 완전한 ON/OFF cycle은 약:
2 seconds이다.
이 장에서는 board 사진보다 debugger에서 timer register가 실제 계산값과 일치하는 것을 보여주는 것이 중요하다.
PSC = 1599
ARR = 9999
CNT = increasing
UIF = 0 → 1이 네 가지를 한 화면에서 확인하면 좋다.
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 Toggle16 MHz
↓
PSC + 1 = 1600
↓
10 kHz
↓
ARR + 1 = 10000
↓
1 Hz
↓
Update Event
↓
UIFTIM2는 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하고 다음 주기를 기다린다.