1)TIM3 時鍾使能 。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); //時鍾使能
2) 初始化定時器參數,設置自動重裝值, 分頻系數,計數方式等。
定時器的初始化函數TIM_TimeBaseInit
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //前面指是哪個TIM,后面指TimeBaseInitStruct結構體指針。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定義TIM初始化類型結構體變量
TIM_TimeBaseStructure.TIM_Period = 5000; //設置自動重載計數周期值
TIM_TimeBaseStructure.TIM_Prescaler =7199; //設置分頻系數
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鍾分頻因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //設置為向上計數方式
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); //初始化時鍾TIMx
3) 設置 TIM3_DIER 允許更新中斷 。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第一個參數是選擇定時器號,這個容易理解,取值為 TIM1~TIM17。
第二個參數非常關鍵,是用來指明我們使能的定時器中斷的類型,定時器中斷的類型有很
多種,包括更新中斷 TIM_IT_Update,觸發中斷 TIM_IT_Trigger,以及輸入捕獲中斷等等。
第三個參數就很簡單了, 就是失能還是使能 。
4) TIM3 中斷優先級設置。
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級 0 級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級 3 級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
TIM_Cmd(TIM3, ENABLE); //⑤使能 TIM3
5) 允許 TIMx工作,也就是使能 TIMx。
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) ;
6) 編寫中斷服務函數。
在固件庫函數里面, 用來讀取中斷狀態寄存器的值判斷中斷類型的函數是:
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t) ;
固件庫中清除中斷標志位的函數是:
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) ;
例如:我們判斷定時器3是否發生更新(溢出)中斷,並清除中斷標志位。
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
//定時器 3 中斷服務程序⑥
void TIM3_IRQHandler(void) //TIM3 中斷
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查 TIM3 更新中斷發生與否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中斷標志
LED1=!LED1;
}
}
知識來源:STM32F1開發指南-庫函數版本_V3.1