STM32的時鐘配置隨筆

2022-08-27 08:06:09 字數 2855 閱讀 2995

從技術文件上得到stm32時鐘源有三種, hsi 振盪器時鐘 、hse 振盪器時鐘 、主 pll時鐘,由於每個時鐘的工作特性的差異,若想將系統時鐘設定為最高頻時需使用pll將基礎時鐘源進行倍頻。

由於使用外部晶振倍頻精確度會比內部**時鐘高很多,所以一般都是使用外部晶振,這跟我們使用庫開發是一樣的原理,所以一般的配置關鍵點大概如下圖紅框所示:

1、第一步首先要將外部hse時鐘開啟,等待**穩定後再進行下一步操作。

2、配置pll暫存器引數。

3、切換系統時鐘源。

第一步實現:

依據:

開啟hse時鐘源主要是控制cr暫存器的16位,然後開啟後硬體會自動將第17位置位,如果未成功則等待,當然在這個地方可以加入時間等待,如果超時說明開啟失敗,進行其他方法設定。

實現:

第二步實現:

依據:

在這裡技術文件上說明了各個引數的設定範圍:

2 ≤ pllq  ≤ 15 、 pllp = 2、4、6 或 8、 192 ≤ plln ≤ 432 、 2 ≤ pllm ≤  63

由於我想將stm32設定成最高頻168m,於是根據以上引數範圍以及計算方法,選擇一組設定引數如下:

pll_m = 8,pll_n  = 336,pll_p  =  1  (2分頻),pllq  =  7;

引數確定便可以直接設定,這些位只能在 pll 已禁止時寫入。

實現:在這裡記錄一下自己的小心得,以前配置暫存器都是將要配置的數先算出來,耽誤時間,今天在看技術文件時突然發現直接用移位即可,且為提高**的可讀性,最好是選用或運算單個設定每個設定點。這樣看起來就舒服多了。

第三步實現:

依據:

這個時候就需要將系統時鐘切換過來了,主要是設定sw開關,然後再設定ahb、apb1、apb2、等時鐘,在上時鐘樹上可看出。

還是操作對應的位,在這裡又發現乙個小技巧,原來stm32系統標頭檔案已經做好這些設定的巨集定義,直接使用即可,而且從可讀性來說大大加強,如下圖所示。最後將設定好的時鐘通過mco1輸出,檢測。

實現:

然後就完美輸出,在這裡我不是很理解為什麼要新增這句,以前用msp430的時候好像也沒這個設定,而且我發現光設定cpu等待週期還不行,還得設定前面兩個引數,不然設定的時鐘偏差很大。

實際設定函式如下所示:

1

void systemclockinit(void)2

67 rcc->cr &= ~rcc_cr_pllon;

8 rcc->pllcfgr = 0x00000000;9

//pll_m = 8,pll_n = 336,pll_p = 1 (2分頻)

10 rcc->pllcfgr |= 8

<< 0

;

11 rcc->pllcfgr |= 336

<< 6

;

12 rcc->pllcfgr |= 1

<< 16

; 13

14 rcc->pllcfgr |= 7

<< 24; //

配置pllq為48m

15 rcc->cr |=rcc_cr_pllon;

1617

while(!(rcc->cr &rcc_cr_pllrdy)){}

1819 flash->acr = flash_acr_icen | flash_acr_dcen | flash_acr_latency_5ws;

2021 rcc->cfgr |= rcc_cfgr_hpre_div1; //

不分頻使ahb時鐘為168m

22 rcc->cfgr |= rcc_cfgr_ppre2_div2; //

apb2 = 84m

23 rcc->cfgr |= rcc_cfgr_ppre1_div4; //

apb1 = 42m

2425 rcc->cfgr |=rcc_cfgr_sws_pll;

26 rcc->cfgr |=rcc_cfgr_sw_pll;

2728 rcc->cfgr |= 3

<< 21; //

pll輸出

29 rcc->cfgr |= 4

<< 24; //

2分頻

3031 }

最後兩分頻的波形顯示如下:

到此配置就結束了,留有乙個問題,那就是stm32時鐘配置為啥要配置那個cpu等待週期,也就是這條語句:

STM32時鐘配置

大家都知道在使用微控制器時,時鐘速度決定於外部晶振或內部rc振盪電路的頻率,是不可以改變的。而arm的出現打破了這一傳統的法則,可以通過軟體隨意改變時鐘速度。這一出現讓我們的設計更加靈活,但是也給我們的設計增加了複雜性。為了讓使用者能夠更簡單的使用這一功能,stm32的庫函式已經為我們設計的更加簡單...

STM32系統時鐘

1 參考資料 stm32f1開發指南 庫函式版本 4.3小節 時鐘系統 stm32中文參考手冊v10 第六章 復位和時鐘控制 rcc 2 時鐘系統知識總結 1 stm32有5個時鐘源 hsi hse lsi lse pll hsi是高速內部時鐘,rc振盪器,頻率為8mhz,精度不高 hse是高速外部...

stm32系統時鐘

hsi 約等於8mhz rc振盪器產生的時鐘 hse 外部時鐘 css 如果檢測到外部時鐘的損壞,自動切換到hsi 系統時鐘和rtc時鐘 均有三個 systick定時器 簡單的定時器,常用來做延時和心跳時鐘 24位的倒計時定時器 ctrl暫存器 其實滴答定時器很簡單,就是設定初值,然後延遲,最後就是...