Timer 比較模式(compare) 具體會用在哪種狀況目前還沒有這種經驗,但Compare有配置功能pin想必有應用會用到這個模式
從Function Block來看比較模式比基本Timer多了比較這一個流程去控制Output狀態
Timer 具體配置如下 :
1 TIM_TimeBaseInitTypeDef TIM3_TimeBase; 2 TIM_OCInitTypeDef TIM3_OC; 3 4 TIM3_TimeBase.TIM_ClockDivision = 0; 5 TIM3_TimeBase.TIM_CounterMode = TIM_CounterMode_Up; 6 TIM3_TimeBase.TIM_Period = 65535; 7 TIM3_TimeBase.TIM_Prescaler = TIM_PRESCALER; 8 TIM_TimeBaseInit(TIM3, &TIM3_TimeBase); 9 10 TIM3_OC.TIM_OCMode = TIM_OCMode_Toggle; 11 TIM3_OC.TIM_OutputState = TIM_OutputState_Enable; 12 TIM3_OC.TIM_OCPolarity = TIM_OCPolarity_Low; 13 TIM3_OC.TIM_Pulse = TIM3_PULSE; 14 TIM_OC1Init(TIM3, &TIM3_OC); 15 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); 16 TIM_Cmd(TIM3, ENABLE); 17 TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
第13行
1 TIM3_OC.TIM_Pulse = TIM3_PULSE;
這一行主要是配置給Compare Register CCR1顧名思義就是Timer Counter要比較的數值。
1 void TIM3_IRQHandler(void) 2 { 3 if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) 4 { 5 TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); 6 current_count = TIM_GetCapture1(TIM3); 7 TIM_SetCompare1(TIM3, current_count + TIM3_PULSE); 8 } 9 }
其中第6, 7行我的理解是,TIM->CNT計數到設定值之後會發IRQ但是我們會希望下次也是計數一樣的數值在發IRQ
所以我們必須把現在的counter累加達到我們要的效果。
舉例來說 比較值 = 2000
第一次發IRQ CNT = 2000, 下一次發IRQ會是 4000,所以原本的2000必須加上最原始的設定值 2000
所以說 Interrup Frequency = TIM計數頻率 / Compare Reg Value