定時器中斷實現步驟及實例筆記

定時器中斷實現步驟

  1. 使能定時器時鐘。 RCC_APB1PeriphClockCmd();

  2. 初始化定時器,配置ARR,PSC。 TIM_TimeBaseInit();

  3. 開啓定時器中斷,配置NVIC。 void TIM_ITConfig(); NVIC_Init();

  4. 使能定時器。 TIM_Cmd();

  5. 編寫中斷服務函數。 TIMx_IRQHandler();
    定時器3初始化函數及中斷服務函數(含上述步驟1-5)

    void TIM3_Int_Init(u16 arr,u16 psc)
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    //使能APB1時鐘 對應步驟1
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    //初始化定時器 對應步驟2
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    //開啓定時器中斷並設置中斷優先級等 對應步驟3
    TIM_ITConfig(TIM3, TIM_IT_Update ,ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //使能定時器 對應步驟4
    TIM_Cmd(TIM3, ENABLE);
    }

void TIM3_IRQHandler(void)
{
//獲取定時器3的狀態值(判斷是否爲更新中斷)
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
//清除定時器3的中斷標誌
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
LED1=!LED1; //翻轉LED燈1
}
}

int main(void) //效果展示主函數
{
delay_init(); //延時初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //初始化中斷優先級分組
LED_Init(); //初始化LED
TIM3_Int_Init(4999,7199); //初始化定時器3
while(1) { LED0=!LED0; delay_ms(200);} //使LED0與LED1展示對比效果
}
注:LED函數參見正點原子程序源碼 “位操作跑馬燈”
定時器的參數計算
在這裏插入圖片描述
上圖爲系統時鐘框圖,由此可知APB1的預分頻係數可以有1、2、4、8、16共五種選擇,而其下掛的定時器時鐘在APB預分頻係數爲1時乘1,否則乘2,即APB1時鐘爲36MHz(systemInit系統初始化函數中默認的)或者72MHz時,TIM2,3,4的時鐘爲72MHz,APB1時鐘爲其他頻率時,TIM2,3,4的時鐘頻率爲APB1時鐘頻率的2倍。
定時器溢出時間的計算:
Tout(溢出時間)=(ARR+1)(PSC+1)/Tclk
Tclk = APB1時鐘倍頻後的頻率(72000000)
PSC = TIMx的預分頻係數(默認設置爲72000-1比較好計算,但正點原子實驗設置爲7200-1)
ARR = TIMx的重裝載值
(PSC+1)/Tclk計算的結果爲定時器寄存器的當前值更新一次的時間(計數週期),ARR+1即爲要計數的次數,最後可以得出定時的時間。
可以將上述函數的參數傳遞進行如下更改(僅含有修改的部分):
void TIM3_Int_Init(u16 arr) //輸出參數爲要定時的毫秒數
{
TIM_TimeBaseStructure.TIM_Period = arr-1;
TIM_TimeBaseStructure.TIM_Prescaler =71999;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
}
TIM3_Int_Init(500);

文中函數和部分內容摘自正點原子stm32資料與官方庫函數

自學新手,個人總結,如有出入,請多指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章