目錄
- 一、STM32F103時鐘樹
- 1.1 HSE、HSI、PLL、SYSCLK
- 1.2 LSE、LSI、RTC
- 1.3 重要提示
- 1.4 HCLK、PCLK1、PCLK2
- 1.5 時鐘樹小結
- 二、程式配置(以之前新建的工程為例)
- 三、小結
??寫在前面的話:說到時鐘,相信大家在學習的程序中一定是很迷茫的,看了無數遍學習視頻還是沒能很好的了解,每次學習的第一遍總是會感到困然后就去睡覺了,記得我第一次學習STM32的時鐘系統時也是這樣,剛開始什么都聽不懂,懵懂的知道了什么SYSCLK這些的名詞,但是其中的關系和配置原理不是很清楚,寫本文也是抱著再梳理一遍的想法記錄下來,記得一鍵三連哦~,
一、STM32F103時鐘樹
??首先先放一張STM32參考手冊中的一張時鐘樹,對照著來講,如圖所示:

??首先對圖里出現的幾個名詞做個介紹:
| 名稱 | 含義 |
|---|---|
| HSE | 高速外部時鐘信號 |
| HSI | 高速內部時鐘信號 |
| LSE | 低速外部時鐘信號 |
| LSI | 低速內部時鐘信號 |
| PLL | 鎖相環 |
| SYSCLK | 系統時鐘 |
| AHB | 高性能總線 |
| HCLK 、PCLK1、PCLK2 | 外設時鐘 |
| APB1 | 低速外設 |
| APB2 | 高速外設 |
| RTC | 實時時鐘 |
??為了更加清晰直觀,再放上一張STM32CUBEMX里配置時鐘系統的圖:

??首先先明確一點我們的STM32有HSE、HSI、LSE、LSI、PLL五個時鐘源,接下來會對這五個時鐘源進行介紹,
1.1 HSE、HSI、PLL、SYSCLK
??我們想要配置的時鐘是SYSCLK即系統時鐘,我們一般說的STM32F103時鐘72M就是指這個SYSCLK系統時鐘,從圖里可以看到,配置系統時鐘的時鐘來源主要有三個:

??分別是HSI、HSE、PLLCLK,我們配置系統時鐘的來源可以是外部高速時鐘、內部高速時鐘和鎖相環PLL出來的時鐘信號,我們都知道在MCU沒有超過最高時鐘頻率運行之前,時鐘頻率越高,系統運行更加穩定,故我們配置時鐘時一般都是希望配置的時鐘頻率接近上限,
??在STM32F103芯片里HSI給定了是內部8M的高速時鐘,HSE可以是從4~16M之間自己選擇焊接任意頻率的晶振,而PLL鎖相環是可以將時鐘頻率倍頻提高可以實作穩定且高頻的時鐘信號,我們先來看一下PLL鎖相環的時鐘線:

??PLL鎖相環的輸入可以是經過二分頻的HSI也就是4M的內部時鐘提供的信號,還有外部高速時鐘HSE可以不分頻或者二分頻的信號,一般來說我們都會采用外部的時鐘信號更加的穩定和準確,這里我們單片機外部焊接的是8M的晶振故我們選擇PLL輸入來源是HSE,在PLL內是經過*PLLMul(*9)來實作達到72M的頻率,最后輸出給到SYSCLK,
1.2 LSE、LSI、RTC
??講到這里HSE、HSI、PLL、SYSCLK相信大家都有了認識,接下來還有兩個LSI和LSE有什么作用呢,我們看到STM32參考手冊里有這樣一段話:

??我們的芯片內部低速時鐘LSI是40khz的,用來驅動看門狗或者是RTC時鐘的,外部的低速時鐘是32.768khz可以用來驅動RTC,很遺憾我沒有做過關于RTC的實驗,故對實時時鐘的解釋不是很充分,沒有特殊要求一般不會去用到,如圖所示:

1.3 重要提示
??上面介紹了五個時鐘源,我們在不使用時,任一個時鐘源都可被獨立地啟動或關閉,由此優化系統功耗,比如說我只用了一個HSE和PLL來配置SYSCLK,那么其他的時鐘源可以不需要開啟,以此降低功耗,
1.4 HCLK、PCLK1、PCLK2
??配置完SYSCLK算是完成了時鐘配置的一半,我們接著看時鐘圖后面,如圖所示:

??SYSCLK系統時鐘出來后可以看到會經過一個AHB預分頻器,將分頻后的信號給至HCLK高速外設時鐘,STM32規定最大的時鐘信號是72MHz,和我們配置的SYSCLK一致,一般都是將SYSCLK配置為最高的HCLK時鐘頻率之后預分頻器分頻系數給1,將SYSCLK和HCLK時鐘信號頻率配置最高,以此達到系統高穩定性高性能狀態,HCLK出來的時鐘信號會給至AHB總線、核心存盤器、DMA:

??STM32還設定了兩條外設時鐘線,一條是PCLK1低速時鐘,另一條是PCLK2高速時鐘,PCLK1經過AHB1預分頻器分頻最高可達36M,PCLK2經過AHB2預分頻器分頻最高可達72M,如圖所示:

??在外設中存在著比較特殊的比如定時器,如上圖所示,在APB1/2分頻完成后有對搭載的定時器TIMER進行了分頻那么怎么確定應該是多少呢,可以在STM32參考手冊中找到這樣一段:

??為什么需要這么多外設的時鐘呢,我們都知道在操作STM32外設之前都需要打開對應的外設時鐘,比如我要操作GPIOA01輸出高電平,我需要先打開GPIOA的外設時鐘,才能對引腳進行操作,如下圖所示是STM32F103各個外設時鐘搭載的外設:
??AHB搭載了DMA1/2、SRAM、核心存盤器等都在HCLK提供的時鐘頻率下運行,比如想要用DMA1就需要通過打開AHB下的DMA1時鐘,時鐘頻率就是HCLK,才能使用DMA1,

??APB2搭載了例如GPIOA~G、ADC等

??APB1搭載了通用定時器、USART、CAN等外設

1.5 時鐘樹小結
??一條較為完整的時鐘配置路線大致為:HSE–PLL–SYSCLK–AHB–HCLK–AHB1–PCLK1(/–AHB2–PCLK2),綜上就是STM32配置時鐘樹的大部分內容,相信大家對時鐘樹的理解進一步加深,接下來我們講怎么在標準庫中配置我們的時鐘系統,
二、程式配置(以之前新建的工程為例)
??第一步打開我們的工程檔案定位到startup檔案夾,雙擊打開我們的啟動檔案,如圖所示:

??第二步我們知道STM32程式都是在啟動檔案里開始執行的,所以我們下拉代碼找到程式運行的入口SystemInit,選中SystemInit滑鼠右鍵單擊Go To Definition…或者選中后按下快捷鍵F12進行跳轉,如圖所示:

??第三步 SystemInit函式剛開始是初始化了很多與時鐘相關的暫存器,將RCC時鐘配置重置為默認的重置狀態,往下看會找到一個SetSysClock()的函式,再次跳轉,找到函式主體:

??第四步跳轉后可以看到這里通過判斷識別符號的方式將會執行SetSysClockTo72()函式,我們設定了72M的系統時鐘,可以點擊宏定義識別符號查看,根據需要可以選擇不同的時鐘頻率,如下兩圖:


??第五步再次點擊跳轉SetSysClockTo72()函式,可以看到,我們進入了真正的配置系統時鐘的地方,該函式起到設定“系統時鐘頻率”為72MHz,并配置“HCLK”、“PCLK2”和PCLK1預分壓器的作用,整個系統時鐘配置的程序是先啟動外部晶振等待穩定然后設定好AHB,APB1,APB2,PLL相關的系數再啟動PLL維持穩定后完成時鐘配置,可以通過官方提供的注釋看到,比較關鍵的一段如圖:

??可以看到,HCLK配置為分頻系數為1和SYSCLK頻率相等,PCLK2分頻系數也是1和HCLK頻率相等,PCLK1分頻系數為2是HCLK頻率的二分頻,但是注釋卻打了相等可能是注釋打錯了,

??這里是PLL鎖相環的配置,需要留意的是RCC_CFGR_PLLMULL9這個引數,最后HSE出來的信號會乘上9提供給我們的SYSCLK信號,
??第六步到這里為止所有的分頻系數引數都設定完畢,最后要等待PLL提供穩定的時鐘信號,整個系統完成時鐘配置,如圖所示:

??注:那我們通程序式查詢比如HCLK的時鐘,程式怎么知道HSE是多少呢,我們可以看到在stm32f10x.h里有一個HSE_VALUE的引數,這個引數定義的是我們使用的外部晶振的頻率,這是8M,如圖所示:

三、小結
??這一講我們認識并強化了對系統時鐘的概念和理解,對程式的配置上有了進一步的認識,大家可以在自己研讀一下設定時鐘的程式,這里程式講的比較省略了關注點在時鐘配置上了,下一講會教大家如何運用keil5的DEBUG功能查詢我們設定好的時鐘頻率究竟對不對,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356176.html
標籤:其他
上一篇:第一話·相逢好似初相識——復雜度
