開啟時鐘-->配置 時鐘源-->配置 時基單元-->配置 中斷輸出-->配置 NVIC-->啟動 定時器
程式
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/*配置時鐘*/
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
//CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
TIM_TimeBaseInitStruct.TIM_Period=7200*5-1;//2000 Hz
TIM_TimeBaseInitStruct.TIM_Prescaler=2000*3-1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
//為更新預分頻器和重複計數器的值,該函式會直接進入一次中斷
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除標誌位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//使能中斷,當計數達到設定值時,觸發中斷處理程式。
/*配置中斷*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE);//啟動定時器,定時器開始計數。
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
/*中斷程式碼*/
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
要點/問題
定時頻率的設定
TIM_TimeBaseInitStruct.TIM_Prescaler//預分頻值PSC
TIM_TimeBaseInitStruct.TIM_Period//重灌載值ARR
公式:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
CK_CNT_OV
:定時器的溢位頻率或計數週期的頻率,單位為 Hz。CK_PSC
:輸入時脈頻率(例如,72 MHz(72 000 000 Hz))。PSC
:預分頻器的值,分頻係數為PSC + 1
。ARR
:自動重灌載值,定時器計數到ARR + 1
次時觸發溢位或更新事件。
解釋 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE)
- 作用
- 當定時器
TIM2
發生更新事件(例如計數器從ARR
計數回到 0,即溢位)時,觸發中斷。 - 使用
ENABLE
引數,啟用這個更新中斷,使定時器溢位時產生中斷請求。 - 在定時器中斷服務函式(
TIM2_IRQHandler
)中可以處理這個中斷。
TIM_IT_Update
:表示選擇的中斷型別是更新中斷(也就是定時器溢位時的中斷)。
定時器在初始化時會直接執行中斷函式
- 原因
TIM_TimeBaseInit
定義中的一條
及 為更新預分頻器和重複計數器的值,該函式會直接進入一次中斷/* Generate an update event to reload the Prescaler and the Repetition counter values immediately */ // 生成更新事件 以立即重新載入 預分頻器和重複計數器 的值 TIMx->EGR = TIM_PSCReloadMode_Immediate;
- 解決
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除標誌位
TIM_ClearFlag 和 TIM_ClearITPendingBit 的區別
TIM_ClearFlag(TIM2, TIM_FLAG_Update)
:用於清除定時器的更新事件標誌位,更新事件可能是由定時器溢位、更新觸發等原因引起的。這個標誌位可以用於查詢更新事件的發生,而不依賴中斷。TIM_ClearITPendingBit(TIM2, TIM_IT_Update)
:用於清除定時器的中斷掛起標誌位。當中斷使能時,更新事件發生後定時器會觸發中斷,並且中斷掛起標誌位會被置位。呼叫該函式可以清除該中斷掛起標誌位。