※ PWM(Pulse Sidth Modulation): 신호의 On/Off를 반복하여 신호가 켜져있는 시간의 비율을 조절하는 방식
TIM2를 내부 클럭으로 구동하여 주기적인 인터럽트를 만드는 예시.

RCC_APB1ENR.TIM2EN = 1로 TIM2 클럭 활성화.TIM2_CR1: 정지 상태에서 상향 카운트·연속 동작 설정.CEN = 0: 설정 중 카운터 정지.DIR = 0, CMS = 00: 상향 카운트.OPM = 0: 연속 동작.UDIS = 0, URS = 0: 아래 업데이트 동작의 기준 설정.TIM2_PSC: 분주값 설정.TIM2_ARR: 카운트 상한값 설정.TIM2_EGR.UG = 1로 소프트웨어 업데이트 이벤트 발생.CR1.ARPE로 결정.TIM2_SR.UIF를 클리어하여 초기화 과정에서 발생한 업데이트 표시 제거.TIM2_DIER.UIE = 1로 업데이트 인터럽트 허용.TIM2_CR1.CEN = 1 설정.TIM2_CNT가 0 → 1 → … → ARR 순서로 증가.UIF = 1로 설정.업데이트 이벤트는 타이머 내부에서 발생하는 하드웨어 사건.
인터럽트는 이 사건을 CPU에 알리는 선택적 기능.
따라서 타이머가 카운트하려면 반드시 인터럽트를 사용해야 하는 것은 아님.
f_CNT = f_TIM / (PSC + 1)T_update = (PSC + 1) × (ARR + 1) / f_TIMf_TIM: 타이머에 실제 공급되는 클럭 주파수.PSC + 1: 클럭 분주 비율.ARR + 1: 0부터 ARR까지 세는 데 필요한 카운트 수.계산 예시
f_TIM = 90 MHz, PSC = 89, ARR = 999라고 가정.90 MHz ÷ 90 = 1 MHz.1 μs.1 μs × 1,000 = 1 ms.
f_TIM은 CPU 클럭과 항상 같지 않으며, RCC의 APB 분주 및TIMPRE설정에 따라 결정.
| 레지스터명 | 기능 |
|---|---|
RCC_APB1ENR | ① TIM2EN으로 TIM2 클럭 공급 활성화. |
TIM2_CR1 | ② 카운트 방향·연속 동작·업데이트 제어·ARR 프리로드 설정. ⑤ CEN으로 카운터 시작·정지. |
TIM2_PSC | ② 입력 클럭을 PSC + 1로 나누는 분주값 설정. |
TIM2_ARR | ② 상향 카운트의 상한값 설정. 카운터 주기는 ARR + 1클럭. |
TIM2_EGR | ③ UG로 소프트웨어 업데이트 이벤트 발생 및 설정 반영. |
TIM2_SR | ④·⑦·⑧ 상태 표시. UIF는 업데이트 발생 표시이며 0을 써서 클리어. |
TIM2_DIER | ④ UIE로 업데이트 인터럽트 요청 허용. |
NVIC_ISER0 | ④ TIM2에 해당하는 비트로 CPU 측 인터럽트 허용. TIM 전용 레지스터가 아닌 Cortex-M4의 NVIC 레지스터. |
TIM2_CNT | ⑥ 현재 카운트 값 저장. ⑦ 오버플로 시 0으로 복귀. |
STK_CTRL: 동작 활성화, 클럭 선택, 인터럽트 설정.STK_LOAD: 재장전 값 설정.STK_VAL: 현재 카운트 값.STK_CALIB: 보정 관련 정보.HCLK 또는 HCLK/8을 클럭으로 선택.(LOAD + 1) ÷ SysTick 클럭 주파수로 결정.HAL_GetTick()과 HAL_Delay()에 사용됨.