(1)使能定時器時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘
(2)初始化定時器參數,包含自動重裝值,分頻係數,計數方式等
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
typedef struct
{
uint16_t TIM_Prescaler; //定時器預分頻器
uint16_t TIM_CounterMode; //計數模式
uint32_t TIM_Period; //定時器周期
uint16_t TIM_ClockDivision; //時鐘分頻
uint8_t TIM_RepetitionCounter; //重複計數器
} TIM_TimeBaseInitTypeDef;
了解結構體成員功能後,就可以進行配置,例如:
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_Period=1000; //自動裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=35999; //分頻係數
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
定時器定時時間計算公式如下:Tout= ((per)*(psc+1))/Tclk;
(3)設置定時器中斷類型,並使能
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
(4)設置定時器中斷優先級,使能定時器中斷通道
NVIC初始化庫函數是NVIC_Init();
typedef struct
{
uint8_t NVIC_IRQChannel; //中斷源
uint8_t NVIC_IRQChannelPreemptionPriority; //搶佔優先級
uint8_t NVIC_IRQChannelSubPriority; //響應優先級
FunctionalState NVIC_IRQChannelCmd; //中斷使能或失能
} NVIC_InitTypeDef;
了解結構體成員功能後,就可以進行配置,例如:
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
(5)開啟定時器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
(6)編寫定時器中斷服務函數
TIM4_IRQHandler
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
...//執行TIM4更新中斷內控制
}
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
固件庫中還有兩個函數是用來讀取狀態標誌位以及清除中斷標誌位,函數分別為TIM_GetFlagStatus和TIM_ClearFlag