Timer & SysTick

moonsyu·2026년 9월 15일

stm32

목록 보기
8/9

1. TIMER의 개념

  • 클럭 신호를 세어 시간의 흐름을 측정하거나 특정 시점에 동작을 발생시키는 하드웨어.
  • 주요 구성 요소
    • PSC(Prescaler): 입력 클럭을 나누어 카운트 속도 조절.
    • CNT(Counter): 현재 카운트 값 저장.
    • ARR(Auto-Reload Register): 카운트 주기를 결정하는 기준값 저장.
  • CPU가 반복문으로 시간을 세지 않아도 타이머 하드웨어가 독립적으로 카운트 수행.
  • 주요 활용
    • 일정한 간격의 인터럽트 발생.
    • PWM 생성으로 LED 밝기·모터 제어.
    • 입력 신호의 주기·펄스 폭 측정.
    • 외부 펄스 개수 측정.
  • 지원 기능은 타이머 종류에 따라 다름.

※ PWM(Pulse Sidth Modulation): 신호의 On/Off를 반복하여 신호가 켜져있는 시간의 비율을 조절하는 방식

2. TIMER의 동작 원리

TIM2를 내부 클럭으로 구동하여 주기적인 인터럽트를 만드는 예시.

STM32F446RE 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로 소프트웨어 업데이트 이벤트 발생.
  • PSC와 프리로드된 설정을 반영하고 카운터·분주기 초기화.
  • PSC는 버퍼를 거쳐 반영되며, ARR의 프리로드 사용 여부는 CR1.ARPE로 결정.

④ 인터럽트 준비

  • TIM2_SR.UIF를 클리어하여 초기화 과정에서 발생한 업데이트 표시 제거.
  • TIM2_DIER.UIE = 1로 업데이트 인터럽트 허용.
  • NVIC에서 TIM2 인터럽트 허용.

⑤ 카운터 시작

  • TIM2_CR1.CEN = 1 설정.

⑥ 분주된 클럭으로 카운트

  • TIM2_CNT가 0 → 1 → … → ARR 순서로 증가.

⑦ 오버플로와 업데이트 발생

  • ARR에 도달한 다음 카운트 클럭에서 CNT가 0으로 복귀.
  • 업데이트 이벤트가 발생하고 UIF = 1로 설정.

⑧ 인터럽트 처리

  • 인터럽트가 허용되고 CPU가 처리할 수 있으면 ISR(인터럽트 처리 함수) 실행.
  • ISR에서 UIF를 클리어하고 필요한 작업 수행.
  • 카운터는 ISR 완료를 기다리지 않고 다음 주기를 계속 진행.

업데이트 이벤트는 타이머 내부에서 발생하는 하드웨어 사건.
인터럽트는 이 사건을 CPU에 알리는 선택적 기능.
따라서 타이머가 카운트하려면 반드시 인터럽트를 사용해야 하는 것은 아님.

주기 계산

  • 카운트 주파수: f_CNT = f_TIM / (PSC + 1)
  • 업데이트 주기: T_update = (PSC + 1) × (ARR + 1) / f_TIM
  • f_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 설정에 따라 결정.

3. 동작 원리에 사용된 레지스터

레지스터명기능
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으로 복귀.

4. SysTick의 개념

  • Cortex-M4 코어에 내장된 24비트 시스템 타이머.
  • 설정한 값부터 0까지 감소하는 다운 카운터.
  • 0에 도달하면 다음 클럭에서 재장전 값을 불러와 반복 동작.
  • 일정한 시간 간격인 시스템 틱(tick) 생성에 사용.
  • 주요 레지스터
    • STK_CTRL: 동작 활성화, 클럭 선택, 인터럽트 설정.
    • STK_LOAD: 재장전 값 설정.
    • STK_VAL: 현재 카운트 값.
    • STK_CALIB: 보정 관련 정보.
  • STM32F446RE에서는 HCLK 또는 HCLK/8을 클럭으로 선택.
  • 인터럽트를 허용하면 0에 도달할 때 SysTick 예외 요청 발생.
  • 반복 주기는 (LOAD + 1) ÷ SysTick 클럭 주파수로 결정.

5. SysTick과 TIM의 관계

공통점

  • 클럭을 세어 시간을 측정하는 하드웨어.
  • 일정 주기의 인터럽트 생성 가능.

구조적 관계

  • SysTick은 CPU 코어 내부의 시스템 타이머.
  • TIM은 STM32의 주변장치 타이머.
  • 서로 별개의 하드웨어이므로 함께 사용 가능.
  • SysTick이 TIM을 구동하거나, TIM이 있어야 SysTick이 동작하는 관계는 아님.

주요 역할

  • SysTick: 시스템 시간 기준, 운영체제의 주기적 처리.
  • TIM: 주기적 작업, PWM, 입력 캡처, 외부 펄스 계수 등.
  • SysTick에는 TIM의 PWM·입력 캡처 채널이 없음.

STM32 HAL에서의 관계

  • 기본 HAL 구현은 SysTick을 1 ms 시간 기준으로 사용.
  • 이 시간 기준이 HAL_GetTick()과 HAL_Delay()에 사용됨.
  • 필요하면 HAL 시간 기준을 TIM 기반으로 변경 가능.
  • 따라서 1 ms는 HAL 기본 설정이며, SysTick 하드웨어의 고정 주기가 아님.

0개의 댓글