STM32系統時鐘RCC(基於HAL庫)
基礎認識
為什麼要有時鐘:
時鐘就是微控制器的心臟,其每跳動一次,整個微控制器的電路就會同步動作一次。時鐘的速率決定了兩次動作的間隔時間。速率越快,微控制器在單位時間內所執行的動作將越多。時鐘是微控制器執行的基礎,時鐘訊號推動微控制器內各個部分執行相應的指令。時鐘系統就是CPU的脈搏,決定cpu速率。
為什麼這麼多個時鐘源:
STM32系統是複雜的,高精度、低精度、高速、低速等,且可以對每個時鐘源進行開關操作,可以把不需要使用的關閉掉。這可以讓微控制器適用更多的環境中,把選擇權利交個了開發者,開發者可以從精度、功耗、資源等多方面考慮。
STM32時鐘:
從時鐘源的角度可分為:
l 外部時鐘(E)
l 內部時鐘(I)
從時鐘速率的角度分為:
l 高速時鐘(HS)
l 低速時鐘(LS)
STM32在晶片復位後預設選用的是內部的高速時鐘(HSI)進行工作,如果需要使用外部高速時鐘(HSE)的話需要經過軟體操作相關的暫存器配置。
外部時鐘模式
外部的高速和低速時鐘均有這三個可選專案,圖中是CubeMX提供的外部時鐘選擇:
可選型別為
l Disable(關閉,不使用外部時鐘)
l BYPASS Clock Source(旁路時鐘源)
l Crystal/Ceramic Resonator(外部晶體/陶瓷諧振器)
外部晶體/陶瓷諧振器模式
該模式較為常見,這可以為系統時鐘提供較為精確的時鐘源。該時鐘源是由外部無源晶體與MCU內部時鐘驅動電路共同配合形成,有一定的啟動時間,精度較高。為了減少時鐘輸出的失真和縮短啟動穩定時間,晶體/陶瓷諧振器和負載電容必須儘可能地靠近振盪器引腳。負載電容值必須根據所選擇的晶體來具體調整。
整體上講,陶瓷晶體和石英晶體的主要區別就在於精度和溫度穩定性上。石英晶體比陶瓷晶體精度要高,溫度穩定性要好。
旁路時鐘源模式
該模式下必須提供外部時鐘。外部時鐘訊號(50%佔空比的方波、正弦波或三角波)必須連到SOC_IN引腳,此時OSC_OUT引腳對外呈高阻態。
所謂旁路模式,是指無需上面提到的使用外部晶體時所需的晶片內部時鐘驅動元件,直接從外界匯入時鐘訊號。
旁路時鐘源的典型應用--有源晶振
有源晶振一般是四腳封裝,電源、地線、振盪輸出和一個控制端【或者懸空端】。相比無源晶體,有源晶振本身就是個完整的振盪器件,只需要供給適當的電源就能輸出時鐘,無須額外的振盪驅動匹配電路。其時鐘輸出不依賴於外部器件振盪電路,相對更不容易受外部線路不穩定性的影響。自然其價格往往要高於無源晶體,不過其輸出電平幅度往往不能像無源晶體那樣隨著應用電路的變化而變化。
STM32系統時鐘框圖
系統時鐘源總共有4個:
l HSI RC:內部高速RC振盪器,相比於外部精度較低。通常約為8MHZ。通常作為系統的備用時鐘源(CSS控制)
l LSI RC:內部低速RC振盪器,相比於外部精度較低。通常約為40KHZ。通常作為看門狗時鐘源。
l HSE:外部高速時鐘,精度高,可接外部晶體/陶瓷諧振器或旁路時鐘源。範圍為4MHZ-16MHZ。通常通過PLL倍頻作為系統時鐘源。
l LSE:外部低速時鐘,精度高,可接外部晶體/陶瓷諧振器或旁路時鐘源。通常為32.768KHZ。通常作為RTC時鐘源。
其它:
l 其中SYSCLK是系統時鐘,對於每個晶片都有規定最大的系統時鐘是多少,超過則會出現錯誤。晶片的很多外設都是基於該時鐘的。
l CSS為時鐘監視系統,一旦HSE失效則自動切換至系統時鐘(SYSCLK)為內部高速RC振盪器時鐘(HSI)。
l MCO是時鐘輸出引腳,對應微控制器的一個GPIO口,可以選擇輸出SYSCLK、HSI、HSE、PLLCLK/2的其中一個。
l 時鐘可以進行獨立的開啟和關閉
在STM32F103C8T6晶片中:
PC14和PC15是外部低速時鐘的輸入腳
PD0和PD1是外部高速時鐘的輸入腳
PA8是時鐘輸出引腳,輸出的時鐘可程式設計選擇
通常外部高速和低速時鐘輸入腳在不使用的情況下也儘量不要作為普通獨立IO使用
STM32F103C8T6的時鐘配置圖:
l LSE外部低速時鐘的頻率為32.768KHZ,給系統的RTC做為時鐘源
l LSI內部低速時鐘的頻率為40KHZ,給系統的獨立看門狗作為時鐘源
l HIS內部高速時鐘暫時沒有用到,頻率為8MHZ,但是值得注意的是“CSS Enabled”與“Enable CSS”的區別,前者表示開啟了。
l “CSS Enabled”表示開啟了時鐘監視系統,一旦HSE失效則自動切換至系統時鐘(SYSCLK)為內部高速RC振盪器時鐘(HSI)
l HSE選擇的是8MHZ,可以選擇的範圍為4-16MHZ
l 系統時鐘(SYSCLK)為72MHZ。時鐘來源是HSE經過PLL倍頻
l MCO時鐘輸出選擇的是PLLCLK/2,按照時鐘選擇可以理解為是SYSCLK/2,即72MHZ/2=36MHZ
&n