時鐘樹
時鐘樹就是STM32中用來產生和配置時鐘,并且把配置好的時鐘發送到各個外設的系統,時鐘是所有外設運行的基礎,所以時鐘也是最先需要配置的東西,在程序中主函數之前還會執行一個SystemClock_Config()函數,這個函數就是用來配置時鐘數的。芯片公司一般會配置這個時鐘樹的SystemClock_Config()函數。當不被使用時,任一個時鐘源都可被獨立地啟動或關閉,由此優化系統功耗。在時鐘樹上可以配置時鐘來源,各外設時鐘源是否開啟。
????????從SYSCLK系統時鐘,劃一根線,左邊的都是時鐘的產生電路,右邊的都是時鐘的分配電路時鐘產生電路,有4個時鐘源。
時鐘源
HSE
外部時鐘源(HSE旁路) ,它的頻率最高可達25MHz。用戶可通過設置在時鐘控制寄存器中的HSEBYP和HSEON位來選擇這一模式。外部時鐘信號(50%占空比的方波、正弦波或三角波)必須連到SOC_IN引腳,同時保證OSC_OUT引腳懸空。
外部晶體/陶瓷諧振器(HSE晶體)
4~16Mz外部振蕩器可為系統提供更為精確的主時鐘。在時鐘控制寄存器RCC_CR中的HSERDY位用來指示高速外部振蕩器是否穩定。在啟動時,直到這一位被硬件置’1’,時鐘才被釋放出來。如果在時鐘中斷寄存器RCC_CIR中允許產生中斷,將會產生相應中斷。HSE晶體可以通過設置時鐘控制寄存器里RCC_CR中的HSEON位被啟動和關閉。
HSI
HSI RC振蕩器能夠在不需要任何外部器件的條件下提供系統時鐘。它的啟動時間比HSE晶體振蕩器短。然而,即使在校準之后它的時鐘頻率精度仍較差。
制造工藝決定了不同芯片的RC振蕩器頻率會不同,這就是為什么每個芯片的HSI時鐘頻率在出廠前已經被ST校準到1%(25°C)的原因。系統復位時,工廠校準值被裝載到時鐘控制寄存器的HSICAL[7:0]位。
如果用戶的應用基于不同的電壓或環境溫度,這將會影響RC振蕩器的精度。可以通過時鐘控制寄存器里的HSITRIM[4:0]位來調整HSI頻率。
時鐘控制寄存器中的HSIRDY位用來指示HSI RC振蕩器是否穩定。在時鐘啟動過程中,直到這一位被硬件置’1’,HSI RC輸出時鐘才被釋放。HSI RC可由時鐘控制寄存器中的HSION位來啟動和關閉。
如果內部晶振起不來,那么芯片就起不來。如果HSE晶體振蕩器失效,HSI時鐘會被作為備用時鐘源。
PLL
用來倍頻。
LSE時鐘
LSE晶體是一個32.768kHz的低速外部晶體或陶瓷諧振器。
LSE晶體通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉。
在備份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶體振蕩是否穩定。在啟動階段,直到這個位被硬件置’1’后,LSE時鐘信號才被釋放出來。如果在時鐘中斷寄存器里被允許,可產生中斷申請。
外部時鐘源(LSE旁路)
在這個模式里必須提供一個32.768kHz頻率的外部時鐘源。你可以通過設置在備份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位來選擇這個模式。具有50%占空比的外部時鐘信號(方波、正弦波或三角波)必須連到OSC32_IN引腳,同時保證OSC32_OUT引腳懸空。
LSI時鐘
LSI RC擔當一個低功耗時鐘源的角色,它可以在停機和待機模式下保持運行,為獨立看門狗和自動喚醒單元提供時鐘。LSI時鐘頻率大約40kHz(在30kHz和60kHz之間)。
LSI RC可以通過控制/狀態寄存器(RCC_CSR)里的LSION位來啟動或關閉。
在控制/狀態寄存器(RCC_CSR)里的LSIRDY位指示低速內部振蕩器是否穩定。在啟動階段,直到這個位被硬件設置為’1’后,此時鐘才被釋放。如果在時鐘中斷寄存器(RCC_CIR)里被允許,將產生LSI中斷申請。
只有大容量和互聯型產品可以進行LSI校準
如果需要使用低功耗時鐘源,那么建議選擇LSE。
時鐘配置過程
????????SystemClock_Config()函數時鐘配置過程:首先啟動內部時鐘,選擇內部8MHz為系統時鐘,暫時以內部8MHz的時鐘運行,然后再啟動外部時鐘,配置外部時鐘,進入PLL鎖相環進行倍頻,8MHz倍頻9倍,得到72MHz,等到鎖相環輸出穩定后,選擇鎖相環輸出為系統時鐘,這樣就可以把系統時鐘8MHz切換為72MHz,這是ST配置的流程。
????????也可以自己分析SystemInit函數,這樣分析之后,可以解決實際應用的一個問題,那就是如果外部晶振出問題了,可能會導致一個現象,就是會發現,程序的時鐘慢了大概10倍,比如用定時器定一個1s的時間,結果過了大概10s才會進中斷,這個問題就出在這里,如果外部晶振出問題了,系統時鐘就無法切換到72MHz,那就會以內部的8MHz運行,8MHz相比較72M,大概慢了10倍。
時鐘安全系統(CSS)
CSS是時鐘安全系統,它也是負責切換時鐘的,它可以監測外部時鐘的運行狀態,一旦外部時鐘失效,就會自動把外部時鐘切換回內部時鐘,保證系統時鐘的運行,防止程序卡死造成事故。
高級定時器中也有CSS的身影,在剎車輸入這里,一旦CSS檢測到外部時鐘失效,通過或門立刻反映到輸出比較,讓輸出控制的電機立刻停止,防止意外。