1、使能TIM時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE);
2、基礎設定
TIM_TimeBaseStructure.TIM_Period 計數值
TIM_TimeBaseStructure.TIM_Prescaler 預分頻,此值+1為分頻的除數
TIM_TimeBaseStructure.TIM_ClockDivision = 0 時鐘因子 待做進一步說明
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0 待做進一步說明
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up 向上計數
TIM_CounterMode_Dowm 向下計數
TIM_CounterMode_CenterAligned1 中心對齊方式1
TIM_CounterMode_CenterAligned2 中心對齊方式2
TIM_CounterMode_CenterAligned3 中心對齊方式3
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
3、通道設定
----------------------------------------------------------------------------------------------
輸出比較 & PWM通道
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing 輸出比較時間模式 (輸出引腳當機無效)
TIM_OCMode_Active 輸出比較主動模式 (比對時設定輸出引腳為有效電平,當計數值為比較/捕獲寄存器值相同時,強制輸出為高電平)
TIM_OCMode_Inactive; 輸出比較非主動模式 (比對時設定輸出引腳為無效電平,當計數值為比較/捕獲寄存器值相同時,強制輸出為低電平)
TIM_OCMode_Toggle 輸出比較觸發模式 (翻轉。當計數值與比較/捕獲寄存器值相同時,翻轉輸出引腳的電平)
TIM_OCMode_PWM1 向上計數時,當TIMx_CNT < TIMx_CCR*時,輸出電平有效,否則為無效
向下計數時,當TIMx_CNT > TIMx_CCR*時,輸出電平無效,否則為有效
TIM_OCMode_PWM2 與PWM1模式相反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable 禁止OC*輸出
TIM_OutputState_Enable 開啟OC*輸出到對應引腳
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable 互補輸出使能。關閉OC*N輸出
TIM_OutputNState_Enable 互補輸出使能。開啟OC*N輸出到對應的引腳
TIM_OCInitStructure.TIM_Pulse 比較/PWM 通道的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 極性為正
TIM_OCPolarity_Low 極必為負
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 極性為正
TIM_OCNPolarity_Low 極必為負
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set 當MOE=0時,如果實作了OC*N,則死區後OC*=1
TIM_OCIdleState_Reset 當MOE=0時,如果實作了OC*N,則死區後OC*=0
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleNState_Set 當MOE=0時,死區後OC*N=1
TIM_OCIdleNState_Reset 當MOE=0時,死區後OC*N=0
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); 禁止OC1重裝載,即TIM*_CCR*的數一經寫入立即生效,否則要在下一個更新事件到來後才被裝入寄存器
TIM_CtrlPWMOutputs(TIM1,ENABLE); 如果使用PWM模式,則此句一定不能省
----------------------------------------------------------------------------------------------
輸入捕獲通道
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1
TIM_Channel_2
TIM_Channel_3
TIM_Channel_4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising 輸入/捕獲上升沿有效
TIM_ICPolarity_Falling 輸入/捕獲下降沿有效
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI IC*輸入引腳選擇,針對IC1/IC2有不同的定義
TIM_ICSelection_IndirectTI
TIM_ICSelection_TRC
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 輸入模式下,捕獲端口上的每一次邊沿都觸發一次捕獲
TIM_ICPSC_DIV2 輸入模式下,每2次事件觸發一次捕獲
TIM_ICPSC_DIV4 輸入模式下,每4次事件觸發一次捕獲
TIM_ICPSC_DIV8 輸入模式下,每8次事件觸發一次捕獲
TIM_ICInitStructure.TIM_ICFilter = 捕獲采樣頻率,詳見TIM*_CCMR->IC*F說明
----------------------------------------------------------------------------------------------
死區設定
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable
TIM_OSSRState_Disable
TIM_BDTRInitStructure.TIM_OSSRIState = TIM_OSSRIState_Enable
TIM_OSSRIState_Disable
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF
TIM_LOCKLevel_1
TIM_LOCKLevel_2
TIM_LOCKLevel_3
TIM_BDTRInitStructure.TIM_DeadTime = 這裡調整死區大小0-0xff
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable
TIM_Break_Disable
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low
TIM_BreakPolarity_High
TIM_BDTRInitStructure.TIM_AutomaticOutput= TIM_AutomaticOutput_Enable
TIM_AutomaticOutPut_Disable
4、配置中斷
5、開啟TIM
----------------------------------------------------------------------------------------------------
例:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = 60000;
u16 CCR2_Val = 40000;
u16 CCR3_Val = 20000;
u16 CCR4_Val = 10000;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 65535; //計數值
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //預分頻,此值+1為分頻的除數
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //輸出比較非主動模式
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //極性為正
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); //禁止OC1重裝載,其實可以省掉這句,因為預設是4路都不重裝的.
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);