STM32定時器相關計算與應用

2021-10-02 15:38:13 字數 3506 閱讀 4635

對於 sysclk(系統時鐘)、 hclk(由 ahb 預分頻器直接輸出得到)、 pclk2(外設時鐘,由 apb2 預分頻器輸出得到)、 pclk1(外設時鐘,由 apb1 預分頻器輸出得到)這四個時鐘的配置一般是: pclk2 = hclk= sysclk=pllclk = 72mhz, pclk1=hclk/2 = 36mhz。這個時鐘配置也是庫函式的標準配置,我們用的最多的就是這個。

apb1 匯流排時鐘 pclk1 由 hclk 經過低速 apb 預分頻器得到,分頻因子可以是:[1,2,4,8,16],hclk1 屬於低速的匯流排時鐘,最高為 36mhz,片上低速的外設就掛載到這條匯流排上,當我們設定為 2 分頻時,即 pclk1 = hclk/2 = 36mhz。

apb2匯流排時鐘 pclk2由 hclk經過高速 apb2預分頻器得到,分頻因子可以是:[1,2,4,8,16],hclk2屬於高速的匯流排時鐘,最高72mhz,片上高速的外設就掛載到這條匯流排上。當我們設定為 1 分頻時,即 pclk2 = hclk =72mhz。

從時鐘樹上我們可以看出,定時器的時鐘不是直接來自apb1或apb2,而是來自於輸入為apb1或apb2的乙個倍頻器,而這個倍頻器的倍頻值受apbx時鐘相對ahb的分頻係數控制的,分頻係數為1則倍頻器不起作用,其他[2,4,8,16]則 x2

apbx的預分頻係數在庫函式「system_stm32f10x.c」檔案中設定,一般情況下不做修改,如下圖:

所以,在庫函式中 apb1預設預分頻的係數是 2,即pclk1=36mhz,觸發倍頻器x2,定時器時鐘timxclk=36x2=72mhz,也就是說定時器2、3、4、5、6、7的時鐘源也是72mhz,當然,如果apb1的時鐘分頻係數不是2而是4,也就是pclk1為18mhz的時候,此時定時器2、3、4、5、6、7的時鐘應為18mx2=36mhz。同樣,如果apb2的時鐘分係數4 ,也就是pclk2為18mhz的時候,此時定時器1、8的時鐘應為18mhzx2=36mhz。如果8分頻:timxclk=72mhz/8x2=18mhz;16分頻:timxclk=72mhz/16x2=9mhz。

而apb2預設預分頻的係數是 1,即 pclk2=72mhz,倍頻器不起作用,則timxclk頻率不變,定時器時鐘timxclk=72mhz,也就是說定時器1、8的時鐘源是72mhz,當然,如果apb2的時鐘分頻係數不是1而是2 ,也就是pclk2為36mhz的時候,此時定時器1、8的時鐘應為36mhzx2=72m,同樣,如果apb2的時鐘分頻係數4,也就是pclk2為18mhz的時候,此時定時器1、8的時鐘應為18mhzx2=36mhz。如果8分頻:timxclk=72mhz/8x2=18mhz;16分頻:timxclk=72mhz/16x2=9mhz。

綜上可知,apb1的時鐘頻率是36mhz,apb2的時鐘頻率是72mhz,這些是在庫函式初始化的時候就已經設定了的,使用庫函式一般不做修改,而如果自己操作暫存器就不一定了,即可以按自己的需求配置。當我們明白了以上這點,我們就可以很容易的區分兩個預分頻的概念:設定apb預分頻係數與設定定時器預分頻係數。

apb預分頻:ahb分頻得到apbx,使用庫函式的話,一般採用預設配置,不做修改,即apb1的時鐘頻率是36mhz,apb2的時鐘頻率是72mhz,但需要注意的是輸入到定時器的時鐘頻率都是72mhz。

定時器預分頻:定時器時鐘源timxclk經該預分頻器才是定時器計數時鐘ck_cnt,它設定 psc 暫存器的值。計算公式為: 計數器時鐘頻率 (fck_cnt) 等於fck_psc / (psc[15:0] + 1),可實現 1 至 65536 分頻。

]其中:

t :定時器溢位中斷時間

f :定時器工作頻率

timxclk :定時器時鐘頻率(若是晶振為8mhz的,一般為72mhz)

tim_period :定時器自動重裝載值 (範圍為0~65535)

tim_prescaler :定時器預分頻係數(範圍為0~65535)

timxclk為時鐘頻率,1/timxclk為時鐘週期,

(tim_prescaler+1)/timxclk為機器週期,乘以(tim_period+1)即可得出定時器週期。

定時器週期 = 機器週期 * 自動重新裝載值:

t=

[(tim_prescaler+1)

/timxclk]

x(tim_period+

1)

例子:

timxclk=72mhz,tim_period=1000-1,tim_prescaler=72-1.

則定時器中斷時間為:[(72-1+1)/(72x10^6)]*(1000-1+1) =1ms

t=

[(tim_prescaler+1)

*(tim_period+1)

]/timxclk

f=timxclk/

[(tim_prescaler+1)

*(tim_period+1)

]

p=

[ccrx_val/

(tim_period+1)

]*100%

其中:

t : pwm訊號的週期

timxclk :定時器時鐘頻率(若是晶振為8mhz的,一般為72mhz)

tim_period :定時器自動重裝載值 (範圍為0~65535)

tim_prescaler :定時器預分頻係數(範圍為0~65535)

ccrx_val : 通道x電平跳變值

p :占空比

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

STM32 定時器 TIM 定時如何計算?

stm32定時器定時計算通過計數溢位計算,也就是說計數溢位就觸發中斷 計算公式 timeout prescaler 1 period 1 timeclockfren 解釋下公式引數意義 timeout 定時器溢位時間 單位為us 多少觸發 進入 一次tim中斷。prescaler 分頻tim時鐘的預...

STM32定時器時間的計算

tim2 tim5的時鐘不是直接來自於apb1,而是來自於輸入為apb1的乙個倍頻器。這個倍頻器的作用是 當apb1的預分頻係數為1時,這個倍頻器不起作用,當apb1的預分頻係數為其他數值時 即預分頻係數為2 4 8或16 這個倍頻器起作用,定時器的時鐘頻率等於apb1的頻率的2倍。分頻係數就是對定...