(STM32F4) Timer Compare mode 操作

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

猜你喜欢

转载自www.cnblogs.com/ollie-lin/p/10120848.html