Embedded/STM32

STM32 시리즈 타이머(Timer) 이론 학습

변화의 물결1 2025. 2. 13. 10:03

 

 

 안녕하세요. 

 

 먼저 아래 내용은 STM32 모든 시리즈가 아니라 일부 Cortex-M 시리즈에 관한 내용임을 참고해주셨으면 합니다. 그리고 고사양 MCU일 경우 다를 수 있으며, 학습용에 사용되는 F103, F429, G071 등과 유사한 제품 내용이라고 보시면 됩니다.

 


 

1. MCU Timer(타이머)

 

 - MCU, CPU 내부에는 시간을 측정을 하기 위한 타이머가 있습니다. 일종의 시계 개념

 - 전자시계의 초 단위 시간, 아람 시간 설정 등은 타이머 기능을 사용합니다.

 

1) 크리스털 (Crystal Oscillator)

 

 : 압전소자로 만들어져 일정한 주기의 펄스 신호를 생성하며 MCU에서 정확한 시간을 측정하는 주요 소자입니다.

 

 부품 형태(Dip, SMD)는 차이는 있지만, 보통 회로도에 표기는 동일하게 나타냅니다.

  

      

 

2) 역할

 

  흐른 시간을 정확하게 카운트하는 스톱워치, 알람시계 역할을 합니다.

  주기적인 시간에 일정한 동작을 하기 위해서 MCU 내부에 PWM 신호를 생성합니다.

 

 PWM 파형을 보고 알아야 하는 것은 Period(주기), Duty Cycle(신호비), Amplitude(진폭)가 있습니다. Period는 High에서 Low로 변경되는 일정한 주기를 말하며, Duty Cycle(%)은 한 주기에서 High인 시간과 Low시간의 비율을 퍼센트로 나타낸 것이고, Amplitude는 파형(진동)의 중심에서 High일 때 최대 전압 레벨 크기(거리)입니다.

 

 

 

 MCU에는 일정한 시간이 지났음을 사용자에게 알리기 위한 타이머 인터럽트를 생성하는 기능이 있습니다.

 

 

3) RTC(Real Time Clock)

  MCU 에는 보통 RTC라는 타이머 하드웨어 블록이 있습니다. 빠른 MCU 혹은 CPU에 비해 느린 시간을 측정하기 위해 사용합니다.

 

 실제 연속된 초 단위의 시간을 측정하기 위해 RTC 전용 배터리(옵션)와 32.768KHz 크리스털을 주로 사용합니다. 이유는 초당 32768 진동하여 16비트 카운터로 정확하게 0.5초가 됩니다. 이를 2번 오버플로우(Overflow)가 되면 정확하게 1초를 알 수 있기 때문입니다.

 

4) CPU Clock

 CPU의 코어를 동작시키는 데 사용되며, 명령어 실행, 내부의 하드웨어 동작에 사용됩니다.

 PC급은 GHz이 있으며 소형 임베디드 장비의 경우 MHz, KHz급을 사용합니다. 처리속도와 소비전력량은 보통 Trade-off가 발생합니다. 빠른 만큼 전력소모가 큽니다.

 

 

2. STM32의 Clock

 CPU 내부에 16 MHz CPU Clock, 32KHz RTC를 내장하고 있습니다. 주의할 것은 RTC가 32.768KHz는 아닙니다.

 필요에 따라 외부 회로에 있는 클럭을 사용할지, 내부 클럭을 선택할지에 따른 HSE, HSI, LSE, LSI 등의 하드웨어 블록이 있습니다.

 

 CPU Clock 선택 시 HSE (High Speed External) 혹은 HSI(High Speed Internal)를 선택하면 됩니다.

 RTC 선택 시 LSE(Low Speed External) 혹은 LSI(Low Speed Internal)을 선택하면 됩니다.

 

 

 

3. STM32 타이머 종류

 

1) Systick

  시스템 타이머라고 불리며, 항상 동작하는 타이머입니다. HAL_Delay() 함수 등에 사용합니다.

 

2) WatchDog(와치독, WDG)

 CPU의 오동작을 탐지하여 문제가 발생하며 재부팅을 시켜주는 타이머 혹은 프로그램이 일정 시간 초과하여 동작하거나 멈춰있을 때 MCU 스스로가 리셋하는 기능을 하는 타이머로고 생각하면 됩니다. STM32에는 IWDG, WWDG 있는데 제품에 따라 WWDG 제공하지 않는 제품도 있습니다.

 

3) Basic

 입출력 기능이 없고 시간 기반의 타이머입니다.

 

4) General Purpose

 범용 타이머로 출력 비교, 원펄스, 입력캡처 등으로 사용하는 타이머입니다.

 

5) Advanced

 기본기능에 추가 기능이 있고, 모터제어와 디지털 파워변환 용도로 사용합니다.

 

 

4. 타이머의 분류 기준

 

1) 카운터 해상도

 타이머와 카운터는 비슷한 개념으로 타이머가 돌아가면서 카운터를 세어줍니다.

 카운터 해상도는 카운트 크기가 해상도가 될 수 있습니다. 16비트 카운트와 32비트 카운터가 있는데 카운트 크기가 크다는 것은 오랜 시간을 측정할 수 있다는 것이 됩니다.

 

2) 카운터 타입

 Up만 사용가능한 타이머도 있고 Up, Down을 사용가능한 타이머도 있습니다. Up이라고 하는 것은 숫자를 증가하는 것이고 Down이라고 하는 것은 설정한 값에서 감소하는 것을 말합니다.

 

3) DMA(Direct Memory Access)를 사용할 수 있는 타이머

 DMA를 사용하면 타이머가 캡처한 데이터를 CPU 도움 없이 직접 메모리로 전송할 수 있어, 속도와 효율성을 크게 향상할 수 있습니다. Input Capture 모드를 사용하면 타이머가 신호의 변화를 정확하게 기록하고, DMA를 통해 이 데이터를 메모리로 전송하여 정확한 타이밍 정보를 얻을 수 있습니다

 

 

4. STM32 타이머 레지스터

 

1) 카운터(Counter) 레지스터

 TIMx_CNT는 카운터 값 자체를 저장하는 레지스터입니다. 종류에 따라 Up, Down, Up/Down이 가능하며 x에 사용할 타이머 번호를 넣어 주면 됩니다. 예로 TIM1_CNT 가 되며 카운트값은 16bit 혹은 32비트로 구성됩니다.

 

 

2) 분주비(Prescaler) 레지스터

 TIMx_PSC는 고속의 클럭을 카운터 할 경우 카운터가 금방 오버플로우가 발생하므로 1~65,536 범위 내의 값으로 나눠 느린(원하는) 클럭을 공급할 수 있게 설정하는 레지스터입니다. 예로 TIM1_PSC가 되며 카운트값은 16bit 혹은 32비트로 구성됩니다.

 

 

 

3) 카운터 주기(Auto-Reload) 레지스터

 TIMx_ARR은 타이머의 목표 카운트 값을 설정하는 레지스터입니다. TIMx_ARR 레지스터의 값에 따라 타이머 카운터가 설정된 값에 도달하면 Update Event가 발생하고, 카운터는 다시 0으로 초기화됩니다.

 Up 카운터 경우 TIMx_CNT가 TIMx_ARR과 동일해지면 다시 0부터 증가합니다.

 Down 카운터 경우 TIMx_CNT가 0이 되면 TIMx_ARR과 값을 동일하게 하여 다시 감소합니다.

 

 

 

4) 캡처/비교기(Capture/Compare) 레지스터

 TIMx_CCR은 입력(외부) 신호가 주어질 때 TIMx_CNT 값을 캡처하거나 TIMx_CNT와 TIM_CCR이 동일해지면 인터럽터를 발생하거나 출력 채널로 0 또는 1을 출력을 설장하는 레지스터입니다.

 주로 PWM (Pulse Width Modulation) 출력을 위해 사용됩니다. 이 레지스터는 펄스의 비율 (Duty Cycle)을 결정합니다. 즉, CCR 값에 따라 출력 신호의 High와 Low 상태의 비율을 설정할 수 있습니다.

 

 

 

간단하게 ARR과 CCR레지스터 정리하면 ARR은 타이머가 어디까지 카운터 할지를 결정(주기 설정)이고 CCR은 특정한 순간을 설정(PWM 듀티 조절, 이벤트 발생)하는 것으로 생각하면 어떨까 합니다.

 

 

감사합니다.

 

 

<참고 사이트>

1. 임베디드 컨트롤러 기초 5차시 - STEP 교육과정

2. 결정 진동자

https://ko.wikipedia.org/wiki/%EA%B2%B0%EC%A0%95_%EC%A7%84%EB%8F%99%EC%9E%90

 

반응형