STM32F10X的時鐘樹及時鐘初始化

2021-07-10 17:30:01 字數 2468 閱讀 4413

對於初學者而言,時鐘是乙個很重要很深的概念,對於stm32晶元來講,為了實現低功耗,設計了乙個功能完善但是卻很複雜的時鐘系統,使得外圍功能的時鐘可配置,相對應的,微控制器的時鐘基本上固定的幾種,簡單配置後就能使用,而stm32的外圍功能不僅要配置,還需要在最開始就要設定這些外設時鐘,只有使能這些外設時鐘後,這些外設才能夠使用。

stm32的時鐘樹,如下圖所示:

stm32有一下4個時鐘源:

(1)高速外部時鐘(hse):以外部晶振作時鐘源,晶振頻率可取範圍為4~16mhz,我們一般採用8mhz的晶振,開發板上的8mhz時鐘就是指的這個。

(2)高速內部時鐘(hsi): 由內部rc振盪器產生,頻率為8mhz,但不穩定。

(3)低速外部時鐘(lse):以外部晶振作時鐘源,主要提供給實時時鐘模組,所以一般採用32.768khz。stm32f103cbt6開發板上用的是32.768khz規格的晶振。

(4)低速內部時鐘(lsi):由內部rc振盪器產生,也主要提供給實時時鐘模組,頻率大約為40khz。

接下來以最常用的高速外部時鐘(hse)為例進行分析:

1)      從左端的osc_out和osc_in開始,這兩個引腳分別接到外部晶振的兩端。

2)      8mhz的時鐘遇到了第乙個分頻器pllxtpre(hse divider for pll entry),在這個分頻器中,可以通過暫存器配置,選擇它的輸出。它的輸出時鐘可以是對輸入時鐘的二分頻或不分頻。本例子中,我們選擇不分頻,所以經過pllxtpre後,還是8mhz的時鐘。

3)      8mhz的時鐘遇到開關pllsrc(pll entry clock source),我們可以選擇其輸出,輸出為外部高速時鐘(hse)或是內部高速時鐘(hsi)。這裡選擇輸出為hse,接著遇到鎖相環pll,具有倍頻作用,在這裡我們可以輸入倍頻因子pllmul(pll multiplication factor),要是想超頻,就得在這個暫存器上做手腳。經過pll的時鐘稱為pllclk。倍頻因子我們設定為9倍頻,也就是說,經過pll之後,我們的時鐘從原來8mhz的 hse變為72mhz的pllclk。

4)      緊接著又遇到了乙個開關sw,經過這個開關之後就是stm32的系統時鐘(sysclk)了。通過這個開關,可以切換sysclk的時鐘源,可以選擇為hsi、pllclk、hse。我們選擇為pllclk時鐘,所以sysclk就為72mhz了。

5)      pllclk在輸入到sw前,還流向了usb預分頻器,這個分頻器輸出為usb外設的時鐘(usbclk)。

6)      回到sysclk,sysclk經過ahb預分頻器,分頻後再輸入到其它外設。如輸出到稱為hclk、fclk的時鐘,還直接輸出到sdio外設的sdioclk時鐘、儲存器控制器fsmc的fsmcclk時鐘,和作為apb1、apb2的預分頻器的輸入端。本例子設定ahb預分頻器不分頻,即輸出的頻率為72mhz。

從時鐘樹的分析,看到經過一系列的倍頻、分頻後得到了幾個與我們開發密切相關的時鐘。

sysclk:系統時鐘,stm32大部分器件的時鐘**。主要由ahb預分頻器分配到各個部件。

hclk:由ahb預分頻器直接輸出得到,它是高速匯流排ahb的時鐘訊號,提供給儲存器,dma及cortex核心,是cortex核心執行的時鐘,cpu主頻就是這個訊號,它的大小與stm32運算速度,資料訪問速度密切相關。

fclk:同樣由ahb預分頻器輸出得到,是核心的「自由執行時鐘」。「自由」表現在它不來自時鐘 hclk,因此在hclk時鐘停止時 fclk 也繼續執行。它的存在,可以保證在處理器休眠時,也能夠取樣和到中斷和跟蹤休眠事件 ,它與hclk互相同步。

pclk1:外設時鐘,由apb1預分頻器輸出得到,最大頻率為36mhz,提供給掛載在apb1匯流排上的外設。

pclk2:外設時鐘,由apb2預分頻器輸出得到,最大頻率可為72mhz,提供給掛載在apb2匯流排上的外設。

為什麼stm32的時鐘系統如此複雜,有倍頻、分頻及一系列的外設時鐘的開關。需要倍頻是考慮到電磁相容性,如外部直接提供乙個72mhz的晶振,太高的振盪頻率可能會給製作電路板帶來一定的難度。分頻是因為stm32既有高速外設又有低速外設,各種外設的工作頻率不盡相同,如同pc機上的南北橋,把高速的和低速的裝置分開來管理。最後,每個外設都配備了外設時鐘的開關,當我們不使用某個外設時,可以把這個外設時鐘關閉,從而降低stm32的整體功耗。所以,當我們使用外設時,一定要記得先開啟外設的時鐘。

對於stm32的預設啟動檔案"startup_stm32f10x_hd.s",對於時鐘的初始化函式,追蹤到最後,會跳轉到如下的程式:

static void setsysclock(void)

檢視巨集定義,發現,會設定系統時鐘為72mhz,這也不難理解,先把系統時鐘倍頻到最大,然後外圍時鐘就可以分頻到需要的了,這樣就能發揮cpu的最大效能。

STM32F10x晶元RTC實時時鐘

系統復位後,對後備暫存器和 rtc的訪問被禁止,這是為了防止對後備區域 bkp 的意外寫操作。執行以下操作將使能對後備暫存器和 rtc的訪問 l設定暫存器 rcc apb1enr 的pwren 和bkpen 位,使能電源和後備介面時鐘 呼叫 rcc apb1periphclockcmd rcc ap...

STM32F10x系列 中斷

概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...

STM32F10X入門 流水燈

2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...