?定時器:有4個獨立通道:輸入捕獲;輸出比較PWM生成;單脈沖模式輸出;可通外部信號控制定時器(TIMx-ETR);
?支持針對定時的增量(正交)編碼器、霍爾傳感器電路
通用定時器配置步驟:
- 使能定時器時鐘
?? ?RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘
- 初始化定時器參數
typedef struct
{uint16_t TIM_Prescaler;//指定用于分頻TIM時鐘的預分頻器值//實際分頻值 = 此參數值+1uint16_t TIM_CounterMode; //指定計數器計數模式- TIM_CounterMode_Up: 向上計數模式(從0遞增到ARR)- TIM_CounterMode_Down: 向下計數模式(從ARR遞減到0)- TIM_CounterMode_CenterAligned1: 中心對齊模式1- TIM_CounterMode_CenterAligned2: 中心對齊模式2- TIM_CounterMode_CenterAligned3: 中心對齊模式3 uint16_t TIM_Period;//指定將在下一次更新事件時加載到自動重載寄存器(ARR)的值uint16_t TIM_ClockDivision; //指定時鐘分頻因子(用于數字濾波器)- TIM_CKD_DIV1: 不分頻(Tclk = TIM時鐘)- TIM_CKD_DIV2: 2分頻(Tclk = TIM時鐘/2)- TIM_CKD_DIV4: 4分頻(Tclk = TIM時鐘/4) */uint8_t TIM_RepetitionCounter;//指定重復計數器值(僅高級定時器TIM1和TIM8支持)} TIM_TimeBaseInitTypeDef;
- 設置定時器中斷類型,并使能
/*** @brief 使能或禁用TIM定時器的中斷* @param TIMx: 指向TIM外設的指針,例如TIM1、TIM2等* @param TIM_IT: 指定要配置的中斷源,可使用邏輯或組合多個中斷源* 例如: TIM_IT_Update(更新中斷)、TIM_IT_CC1(通道1比較中斷)* @param NewState: 新狀態,可選擇ENABLE或DISABLE*/
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
- 設置定時器中斷優先級使能定時器通道
- 開啟定時器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
- 編寫定時器中斷服務函數
void TIM4_IRQHandler(void)【每個不一樣可以去啟動文件查看】
/*** @brief 檢查指定TIM定時器的中斷狀態標志* @param TIMx: 指向TIM外設的指針,如TIM1、TIM2等* @param TIM_IT: 指定要檢查的中斷源,可使用邏輯或組合多個中斷源* 例如: TIM_IT_Update(更新中斷)、TIM_IT_CC1(通道1比較中斷)* @retval ITStatus: 中斷狀態(SET = 中斷發生; RESET = 中斷未發生)*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
/*** @brief 清除指定TIM定時器的中斷掛起標志* @param TIMx: 指向TIM外設的指針,如TIM1、TIM2等* @param TIM_IT: 指定要清除的中斷源,可使用邏輯或組合多個中斷源* 例如: TIM_IT_Update(更新中斷)、TIM_IT_CC1(通道1比較中斷)* @note 必須在中斷處理完成后調用此函數,否則會持續觸發中斷* @note 通過向TIMx_SR寄存器的對應位寫入0來清除標志* @example TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除TIM3的更新中斷標志*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
代碼實現(500msLED電平翻轉一次)
#include "time.h"
#include "led.h"/*******************************************************************************
* 函 數 名 : TIM4_Init
* 函數功能 : TIM4初始化函數
* 輸 入 : per:重裝載值psc:分頻系數
* 輸 出 : 無
*******************************************************************************/
void TIM4_Init(u16 per,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘TIM_TimeBaseInitStructure.TIM_Period=per; //自動裝載值(設置溢出中斷值)TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //開啟定時器中斷TIM_ClearITPendingBit(TIM4,TIM_IT_Update);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定時器中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM4,ENABLE); //使能定時器 }
/*******************************************************************************
* 函 數 名 : TIM4_IRQHandler
* 函數功能 : TIM4中斷函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update))//查詢中斷標志位{LED2=!LED2;}TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除標志位
}
主函數代碼
u8 i;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組LED_Init();TIM4_Init(1000,36000-1); //定時500ms