STM32通用定時器配置


一、STM32通用定時器原理                        

    STM32 系列的CPU,有多達8個定時器,其中TIM1TIM8是能夠產生三對PWM互補輸出的高級定時器,常用於三相電機的驅動,它們的時鍾由APB2的輸出產生。其它6個為普通定時器,時鍾由APB1的輸出產生。

下圖是STM32參考手冊上時鍾分配圖中,有關定時器時鍾部分的截圖:

從圖中可以看出,定時器的時鍾不是直接來自APB1APB2,而是來自於輸入為APB1APB2的一個倍頻器,圖中的藍色部分。

下面以通用定時器2的時鍾說明這個倍頻器的作用:當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鍾頻率等於APB1的頻率;當APB1的預分頻系數為其它數值(即預分頻系數為24816)時,這個倍頻器起作用,定時器的時鍾頻率等於APB1的頻率兩倍。

可能有同學還是有點不理解,OK,我們舉一個例子說明。假定AHB=36MHz,因為APB1允許的最大頻率為36MHz,所以APB1的預分頻系數可以取任意數值;

當預分頻系數=1時,APB1=36MHzTIM2~7的時鍾頻率=36MHz(倍頻器不起作用)

當預分頻系數=2時,APB1=18MHz,在倍頻器的作用下,TIM2~7的時鍾頻率=36MHz

有人會問,既然需要TIM2~7的時鍾頻率=36MHz,為什么不直接取APB1的預分頻系數=1?答案是:APB1不但要為TIM2~7提供時鍾,而且還要為其它外設提供時鍾;設置這個倍頻器可以在保證其它外設使用較低時鍾頻率時。

Stm32外設用戶手冊,如圖:

再舉個例子:當AHB=72MHz時,APB1的預分頻系數必須大於2,因為APB1的最大頻率只能為36MHz。如果APB1的預分頻系數=2,則因為這個倍頻器,TIM2~7仍然能夠得到72MHz的時鍾頻率。能夠使用更高的時鍾頻率,無疑提高了定時器的分辨率,這也正是設計這個倍頻器的初衷。

              

TIMER_cfg(); //定時器的配置


       //開啟定時器2


 TIM_Cmd(TIM2,ENABLE);


voidTimer_Config(void)


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 


    TIM_DeInit(TIM2);


    TIM_TimeBaseStructure.TIM_Period=2000-1;  //自動重裝載寄存器的值


    TIM_TimeBaseStructure.TIM_Prescaler=(36000-1);         //時鍾預分頻數


    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;  //采樣分頻


     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);


    TIM_ClearFlag(TIM2,TIM_FLAG_Update);               //清除溢出中斷標志


    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);


     TIM_Cmd(TIM2,ENABLE);                              /開啟時鍾




我們每個語句都來解釋一下。首先我們想使用定時器,就必須使能定時器的時鍾,這就是函數RCC_APB1PeriphClockCmd();,通過它開啟 RCC_APB1Periph_TIM2

TIM_DeInit(TIM2);該函數主要用於復位TIM2定時器,使之進入初始狀態。

然后我們對自動重裝載寄存器賦值,TIM_Period的大小實際上表示的是需要經過TIM_Period次計數后才會發生一次更新或中斷。接下來需要設置時鍾預分頻數TIM_Prescaler,這里有一個公式,我們舉例來說明:例如時鍾頻率=72MHZ/(時鍾預分頻+1)。說明當前設置的這個TIM_Prescaler,直接決定定時器的時鍾頻率。通俗點說,就是一秒鍾能計數多少次。比如算出來的時鍾頻率是2000,也就是

一秒鍾會計數2000次,而此時如果TIM_Period設置為4000,即4000次計數后就會中斷一次。由於時鍾頻率是一秒鍾計數2000次,因此只要2秒鍾,就會中斷一次。

再往后的代碼,還有一個需要注意的,TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;就是我們一般采用向上計數模式,即每次計數就會加1,直到寄存器溢出發生中斷為止。最后別忘了,需要使能定時器!!

發生中斷時間=(TIM_Prescaler+1)* (TIM_Period+1)/FLK

 用上述公式可算出:發生中斷時間 (2000-1+1*36000-1+1)/72000000=1

步驟五:編寫中斷服務程序。同樣需要注意的,一進入中斷服務程序,第一步要做的,就是清除掉中斷標志位。由於我們使用的是向上溢出模式,因此使用

的函數應該是:TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);



每跳一下0.1ms



















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM