[STM32 (ARM Cortex - M)] OutPut Compare Mode
Output Compare Mode는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx) 값과 일치할 때 Interrupt 또는 해당 핀에 출력을 발생시키는 모드이다.
Application :
TIM4 의 Up counter와 Output Compare Mode를 이용하여 LED를 On/ OFF함.
1. 타이머의 Frequency를 1Hz로 맞춰서 업데이트 인터럽트를 발생 시 HAL_TIM_PeriodElapsedCallback 에서 LED를 On 시킴
2. Output Compare Mode에서 CCR값과 CNT의 값이 일치할 때 출력비교 인터럽트(CCxI)가 발생하고 HAL_TIM_OC_DelayElapsedCallback 함수에서 LED를 Off 시킴
3. 스위치 1~4 의 EXTI 인터럽트 발생시 HAL_GPIO_EXTI_Callback 함수에서 CCR값을 변경시킴
Clock Configuration은 위와 같다.
TIM2,3,4,5는 APB1에서 Clock Source를 공급받는다.
PD0-7 : GPIO_Output
PG0-PG3 : EXTI
LED를 GPIO Output으로 잡고 스위치는 EXTI 로 잡는다. 호환보드의 스위치는 풀업회로로 구성되어 있으므로 Falling edge에 트리거 되게 한다. 그리고 NVIC(Nested Vectored Interrupt Controller) 세팅에서 인터럽트도 켠다
Timer 설정
OC핀을 출력으로 쓰지 않고 CCR과 비교하는 데만 쓸 거기 때문에 채널 1을 No Output으로 설정해줬다.
PSC와 ARR은 위와 같이 설정 1Hz마다 업데이트 인터럽트가 발생되게 한다.
OC모드의 CCR 초기값은 일단 ARR과 동일한 9999로 해준다. 나중에 스위치를 눌렀을 때 변경되게 할 것이다.
이렇게 ARR과 CCR값이 동일하면 업데이트 인터럽트와 출력 비교 인터럽트가 동시에 일어날텐데 먼저 HAL_TIM_PeriodElapsedCallback 에 들어가고 바로 그 다음에 HAL_TIM_OC_DelayElapsedCallback 에 들어간다.
Global Interrupt를 켠다.
USER CODE 2에서 HAL_TIM_Base_Start_IT 과 HAL_TIM_OC_Start_IT 둘 다 enable 한다.
스위치에 따라 LED의 듀티비가 10%, 30%, 50%, 100%로 변경된다.