타이머(Timer)란
타이머란 임의의 주기를 갖는 신호를 측정하거나 생성할 때 사용되는 디지털 회로를 말한다.
특정 주기마다 이벤트를 발생시키거나, 외부에서 들어온 신호의 길이를 측정할 때 사용한다.
또 PWM과 같은 파형을 생성하여 출력으로 보낼 때도 사용된다.
MCU에서 GPIO, 통신 모듈과 더불어 자주 사용되는 모듈 중 하나이다.
대표적인 타이머
타이머는 대표적으로 4가지가 있다.
범용(General-Purpose) 타이머
출력 비교, 원펄스 입력캡쳐, 센서 인터페이스(엔코더, 홀 센서 등) 등의 용도로 사용할 수 있는 범용 기능을 가지는 타이머
고급(Advanced) 타이머
범용 타이머보다 더 많은 기능을 가지는 타이머, 주로 모터 제어와 디지털 파워 변환(Power Conversion)
용도로 사용가능한 데드타임을 가지는 3상 출력, 비상 셧다운 입력 등의 기능이 더 추가됨
기본(Basic) 타이머
입출력 기능은 없고 시간기반 타이머(Timebase Timer)나 DAC의 트리거 용도로만 사용되는 타이머
채널(Channel) 타이머
범용 타이머와 기능은 동일하나 채널을 1 ~ 2개만 가지는 타이머
범용 타이머의 주요 구성요소
1. 프리스케일러(PSC : Prescaler)
16비트의 프리스케일러는 공급되는 클럭(TIMx_CLK 또는 CK_PSC)을 1 ~ 65,536(16bit)의
값으로 나누어 카운터의 동작 클럭(CK_CNT)을 만들어 내는 분주기
2. 카운터(CNT : Counter)
16비트의 카운터는 타이머의 핵심적인 요소로써, 공급되는 클럭을 이용한 업, 다운, 업/다운 카운팅이 가능함
3. 오토 리로드 레지스터(ARR : Auto Reload Register)
업 카운터의 경우 ‘CNT 값 == ARR의 설정 값’ 이 되면 CNT는 0부터 다시 카운팅 시작
다운 카운터의 경우 ‘CNT 값 == 0’ 이 되면 CNT는 ARR의 설정 값부터 다시 카운팅 시작
4. 캡쳐/비교기(CCR : Capture/Compare Register)
입력 신호가 주어질 때 카운터(CNT) 값을 캡쳐하거나 또는 CNT == CCR이 되면 인터럽트를 발생하거나 출력 채널로 0또는 1을 출력
타이머의 주요 모드
1. 업 카운팅(Up Counting) 모드
카운터의 값이 증가하면서 카운팅을 하는 모드. 카운터는
CNT = 0 부터 시작해서 CNT = ARR 값 까지 증가한 후, 다시 0부터 카운팅을 시작하는 작업을 계속하여 반복한다.
그리고 CNT = 0 이 될 때 오버플로우, 업데이트 이벤트(UEV) 와 업데이트 인터럽트(UI)가 발생한다.
2. 다운 카운팅(Down Counting) 모드
다운 카운팅 모드는 카운터의 값이 감소하면서 카운팅을 하는 모드.
카운터는 CNT = ARR부터 CNT = 0 까지 감소한 후에,
다시 CNT = ARR부터 카운팅을 시작하는 작업을 계속하여 반복한다.
그리고 CNT = ARR이 될 때 언더플로우, 업데이트 이벤트(UEV) 와 업데이트 인터럽트(UI),
업데이트이트 인터럽트 플래그(UIF)가 발생한다.
3. 업/다운 카운팅(Up/Down Counting) 모드
카운터의 값이 증가한 후 다시 감소하면서 카운팅을 하는 모드.
카운터는 0부터 오토-리로드(ARR) 값 까지 증가한 후, 다시 0까지 감소한다.
이 후에는 다시 증가 -> 감소 -> 증가 -> 감소를 계속 반복하면서 카운팅 한다.
이 모드에서 업 카운터는 0 ~ (ARR-1) 까지 카운팅, 다운 카운터는 ARR ~ 1 까지 카운팅을 한다.
업 카운팅을 할 때 CNT = ARR이 되면 오버플로우, 업데이트 이벤트, 업데이트 인터럽트가 발생하고
다운 카운팅을 할 때 CNT = 0이 되면 언더플로우, 업데이트 이벤트, 업데이트 인터럽트가 발생한다.
업/다운 카운팅 모드를 센터 얼라인(Center Aligned) 모드라고도 한다.
4. 입력 캡쳐(Input Capture) 모드
입력 캡쳐 모드는 외부의 입력 값이 들어오는 순간 그 때의 카운터 값을 캡쳐하는 동작을 하는 모드이다.
좀 더 구체적으로 설명하면, 입력 캡쳐신호인 ICx가 입력되면 그 때의 카운터 값이 캡쳐/비교기에 저장되며
캡쳐 플래그(CCxIF)가 설정되고 인터럽트가 Enable 되어 있는 경우는 인터럽트(CCxI) 가 발생한다.
캡쳐 플래그(CCxIF)가 이미 설정되어 있는데 캡쳐가 또 발생하는 경우는 오버 캡쳐 플래그)CCxOF)가 설정되게 된다.
5. 출력 비교(Output Compare) 모드
출력 비교 모드는 카운터의 출력값이 캡쳐/비교기에 설정된 비교값(CCRx)과 일치 할 때
인터럽트(CCx)나 해당 핀에 출력(OCx)이 발생하는 모드.
핀의 출력 값은 다음과 같은 모드로 설정할 수 있다.
Output Compare Timing : 캡쳐/비교기에 설정된 비교 값(CCRx)이 출력에 아무런 영향을 주지 않는다.
이 모드에서의 동작은 일반적인 타이머의 동작과 유사함.
Output Compare Active : 카운터의 값 = 캡쳐/비교기의 설정 값(CCRx) 이면 OCx값이 High 됨.
Output Compare Inactive : 카운터의 값 = 캡쳐/비교기의 설정 값(CCRx) 이면 OCx 값이 Low 됨.
Output Compare Toggle : 카운터의 값 = 캡쳐/비교기의 설정 값(CCRx) 이면 OCx 값이 Toggle 됨.
Output Compare Forced Active/Inactive : 카운터의 값이 상관없이 OCx 값이 High(Active Mode) 또는
Low(Inactive Mode)로 된다.
6. PWM 출력 모드
PWM 출력을 발생시키는 모드, 출력의 주파수는 ARR값에 의해 결정되며 듀티비(Duty Rate)는 CCR에 의해 결정됨.
PWM 출력 모드는 1, 2 로 나뉘어 진다.
7. 원 펄스(One Pulse) 모드
외부 입력이 인가될 경우 이로부터 일정 시간이 지난 후에 펄스를 1번 발생시키는 모드임.
펄스가 발생하는 시간과 지속하는 시간은 프로그래밍 가능하다.
고급제어 타이머(Advanced-Control Timer)의 구조 및 기능
고급제어 타이머로 APB2 버스에 연결되어 있고 각 특징이 있음
범용 타이머와 동일한 특징 (범용 타이머도 가지고 있는 특징)
1. 1개의 16비트 카운터를 가짐
업, 다운, 업/다운 모드로 동작이 가능하며, 오토-리로드 기능이 있음
2. 16비트의 프리스케일러를 이용하여 카운터 동작 클럭을 1 ~ 1/63356 까지 다운이 가능
3. 4개의 16비트 캡쳐/비교 채널을 가지며 여러모드 동작 가능
카운터, 입력 캡처, 출력 비교, PWM 입,출력, 원 펄스 등등
4. 엔코더 및 홀 센서 인터페이스 가능
6개의 독립적인 IRQ/DMA 요청 신호를 발생
업 데이트 이벤트 발생 시
캡쳐/비교 이벤트 발생 시
입력 트리거 발생 시
고급제어 타이머만 가지는 특징 (고급제어 타이머에만 있는 특징)
1. 3개의 반전될 출력 신호 발생 채널(TIMx_CH1N ~ TIMx_CH3N)을 가짐
2. 브레이크 입력 신호 채널(BKIN)을 가짐
3. 브레이크 입력 시 IRQ/DMA 요청 신호를 발 생
4. 반복(Repeatition) 타이머 기능을 가짐
고급제어 타이머 모드
1. 반전 출력(Complementary Outputs)
고급제어 타이머의 3개 채널의 출력은 OC1 ~ OC3와 이것을 반전시킨 출력 OC1N ~ OC3N을 가지며
OCx(1~3)와 OCxN은 데드 타임(Dead or Delay Time)을 줄 수 있다.
3개의 채널 출력과 반전 출력은 3상 AC 모터를 구동할 때 아주 유용하게 사용할 수 있고
모터 구동의 안정성을 위해 일반적으로 반전된 출력에 데드 타임을 설정함.
2. 카운터, PWM, 원 펄스, 기타 등등 기본 타이머에 있는 모드 사용 가능
타이머 관련 함수
타임 베이스 함수(Time Base Function)
타이머의 기본적이 기능인 타이머/카운터 동작을 제어하는 함수
함수 명
|
설명
|
HAL_TIM_Base_Init
(TIM_HandleDef * htim)
|
TIM의 카운터 부분(Time Base Unit)을 TIM_HandleTypeDef 구조체의 설정값에 맞추어 초기화 하고 TIM Base Handle 생성
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_Base_DeInit
(TIM_HandleDef * htim)
|
TIM의 카운터 부분(Time Base Unit)을 초기화 해제
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_Base_Start
(TIM_HandleDef * htim)
|
TIM Base의 동작 시작
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_Base_Stop
(TIM_HandleDef * htim)
|
TIM Base의 동작 정지
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_Base_Start_IT
(TIM_HandleDef * htim)
|
TIM Base의 동작을 인터럽트 모드로 시작
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_Base_Stop _IT
(TIM_HandleDef * htim)
|
TIM Base의 인터럽트 모드 동작 종료
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
타임 출력 비교 함수(Time Output Compare function)
타이머의 출력비교 동작을 제어하는 함수
함수 명
|
설명
|
HAL_TIM_OC_Init
(TIM_HandleDef * htim)
|
TIM의 Output Compare를 TIM_HandleTypeDef 구조체의 설정값에 맞추어 초기화하고 TIM Output Compare Handle 생성
[Parameter] : TIM Output Compare handle
[Return] : HAL status
|
HAL_TIM_OC_DeInit
(TIM_HandleDef * htim)
|
TIM의 Output Compare의 초기화를 해제
[Parameter] : TIM Output Compare handle
[Return] : HAL status
|
HAL_TIM_OC_Start
(TIM_HandleDef * htim,
uint32_t, Channel)
|
TIM Base의 동작 시작
[Parameter] : *htim : TIM Output handle
Channel : 활성화 할 TIM 채널을 지정, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_OC_Stop
((TIM_HandleDef * htim,
uint32_t, Channel)
|
TIM Output Compare의 동작 정지
[Parameter] : *htim : TIM Compare handle
Channel : 비활성화 할 TIM 채널을 지정, TIM_CHANNEL_x(1 ~ 2)
[Return] : HAL status
|
HAL_TIM_OC_Start_IT
(TIM_HandleDef * htim,
uint32_t Channel)
|
TIM Output Compare의 Signal Generation을 인터럽트 모드로 시작
[Parameter] : *htim : TIM Output Compare handle
Channel : 활성화 할 TIM 체널을 지정 TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_OC_Stop _IT
(TIM_HandleDef * htim,
uint32_t Channel
|
TIM Output Compare의 인터럽트 모드 동작 정지
Channel : 정지할 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
타임 PWM 함수(Time PWM Function)
함수 명
|
설명
|
HAL_TIM_PWM_Init
(TIM_HandleDef * htim)
|
TIM의 PWM Time Base를 TIM_HandleTypeDef 구조체의 설정값에 맞추어 초기화하고 대응하는 handle 생성
[Parameter] : *htim : TIM handle
[Return] : HAL status
|
HAL_TIM_PWM_DeInit
(TIM_HandleDef * htim)
|
TIM의 PWM Time Base의 초기화 해제
[Parameter] : *htim : TIM handle
[Return] : HAL status
|
HAL_TIM_PWM_Start
(TIM_HandleDef * htim,
Uint32_t Channel)
|
PWM Signal Generation 시작
[Parameter] : *htim : TIM handle
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_PWM_Stop
(TIM_HandleDef * htim,
Uint32_t CHANNEL)
|
PWM Signal Generation 정지
[Parameter] : *htim : TIM handle
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_PWM_Start_IT
(TIM_HandleDef * htim,
Uint32_t CHANNEL)
|
TIM Signal Generation을 인터럽트 모드로 시작
Parameter] : *htim : TIM handle
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_PWM_Stop _IT
(TIM_HandleDef * htim,
Uint32_t CHANNEL)
|
PWM Signal Generation의 인터럽트 모드 동작 정지
[Parameter] : *htim : TIM handle
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
주변장치 설정용 함수(Peripheral Control Functions)
함수 명
|
설명
|
HAL_TIM_OC_ConfigChannel
(TIM_HandleDef * htim,
TIM_OC_InitTypeDef * sConfig,
uint32_t Channel)
|
TIM Output Compare Channel을 TIM_OC_InitTypeDef 구조체의 맞추어 초기화
[Parameter] : *htim : TIM handle
sConfig : TIM Output Compare Configuration 구조체
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
HAL_TIM_PWM_ConfigChannel
(TIM_HandleDef * htim,
TIM_OC_InitTypeDef * sConfig,
uint32_t Channel)
|
TIM PWM Channel을 TIM_OC_InitTypeDef 구조체의 설정 값에 맞추어 초기화
[Parameter] : *htim : TIM handle
sConfig : TIM Output Compare Configuration 구조체
Channel : Enable 시킬 채널, TIM_CHANNEL_x(1 ~ 4)
[Return] : HAL status
|
타이머 콜백 함수(TIM Callbacks Functions)
함수 명
|
설명
|
HAL_TIM_
PeriodElapsedCallback
(TIM_HandleDef * htim)
|
블로킹 되지 않은 모드(Non Blocking Mode)에서 Period elapsed Callback 함수
[Parameter] : *htim : TIM handle
[Return] : None
|
HAL_TIM_OC_
DelayElapsedCallback
(TIM_HandleDef * htim)
|
블로킹 되지 않은 모드(Non Blocking Mode)에서 Output Compare Callback 함수
[Parameter] : TIM OC handle
[Return] : None
|
HAL_TIM_IC_CaptureCallback
(TIM_HandleDef * htim)
|
블로킹 되지 않은 모드(Non Blocking Mode)에서 Input Capture Callback 함수
[Parameter] : TIM IC handle
[Return] : None
|
HAL_TIM_PWM_
PulseFinishedCallback
(TIM_HandleDef * htim)
|
블로킹되지 않은 모드(Non Blocking Mode)에서 PWM Pulse Finished Callback 함수
[Parameter] : TIM handle
[Return] : None
|
HAL_TIM_TriggerCallback
(TIM_HandleDef * htim)
|
블로킹 되지 않은 모드(Non Blocking Mode)에서 Hall Trigger Detection Callback 함수
[Parameter] : TIM IC handle
[Return] : None
|
HAL_TIM_ErrorCallback
(TIM_HandleDef * htim)
|
TIM Base의 상태 값을 반환하는 함수
[Parameter] : TIM Base handle
[Return] : HAL state
|
주변장치 상태 함수(Peripheral State Functions)
함수 명
|
설명
|
HAL_TIM_Base_GetState
(TIM_HandleDef * htim)
|
TIM Base의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM Base handle
[Return] : HAL status
|
HAL_TIM_OC_GetState
(TIM_HandleDef * htim)
|
TIM OC의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM Output Compare handle
[Return] : HAL status
|
HAL_TIM_PWM_GetState
(TIM_HandleDef * htim)
|
TIM PWM의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM handle
[Return] : HAL status
|
HAL_TIM_IC_GetState
(TIM_HandleDef * htim)
|
TIM Input Capture의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM IC handle
[Return] : HAL status
|
HAL_TIM_OnePulse_GetState
(TIM_HandleDef * htim)
|
TIM One Pulse Mode의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM OPM handle
[Return] : HAL status
|
HAL_TIM_Encoder_GetState
(TIM_HandleDef * htim)
|
TIM Encoder Mode의 상태 값을 반환하는 함수
[Parameter] : *htim : TIM Encoder handle
[Return] : HAL status
|
타이머 구동용 매크로 및 정의
TIM Channel 관련
TIM_CHANNEL_1
TIM_CHANNEL_2
TIM_CHANNEL_3
TIM_CHANNEL_4
TIM_CHANNEL_ALL
TIM Capture/Compare Channel State 관련
TIX_CCx_ENABLE
TIM_CCx_DISABLE
TIM_CCxN_ENABLE
TIM_CCxN_DISABLE
TIM Clock Polarity 관련
TIM Clear Input Polarty
TIM_CLEARINPUTPOLARITY_INVERTED : Polarity for ETRx pin
TIM_CLEARINPUTPOLARITY_NONINVERTED : Polarity for ETRx pin
TIM_CLOCKPOLARITY_INVERTED : Polaity for ETRx clock sources
TIM_CLOCKPOLARITY_NONINVERTED : Polaity for ETRx clock sources
TIM_CLOCKPOLARITY_RISING : for Tix clock source
TIM_CLOCKPOLARITY_ : FALLING
TIM_CLOCKPOLARITY_ : Polarity for Tix clock sources
'Embedded > STM32' 카테고리의 다른 글
[STM32] RCC 설정용 구조체 및 구동 함수 (0) | 2022.11.12 |
---|---|
[STM32] ADC(Analog Digital Converter) (0) | 2022.11.12 |
[STM32] DAC(Digital Analog Convertor) (2) | 2022.11.12 |
[STM32] UART, USART (4) | 2022.11.12 |