本次編寫的教程主要是針對STM32F04x系列的單片機,對于STM32單片機的時鐘,想必使用過STM32的人都比較清楚,STM32它是基于 Cortex?-Mx系列內核的微處理器,芯片內部集成了豐富的外設。同時也集成了內部的時鐘源。也就是說芯片不需要外接晶振就可以運行。但是大多數的使用情況都是使用了芯片外部的晶振,包括官方的標準固件庫也都是默認使用外部晶振,但是有些特殊情況下,不需要使用外部晶振,這樣可以節省一個晶振和兩個諧振電容,最主要的是可以節省PCB板子的面積。但如果使用內部晶振,就得要編寫程序,更改相關寄存器的值,切換至內部晶振才可以。對于芯片時鐘源切換這樣的事情,對高手來說是很簡單,對于新手來說就有些搞不清了,因此本教程敘述一下STM32F04x系列單片機時鐘源切換的流程。
既然是切換單片機的時鐘源,就不能不了解下芯片內部的時鐘結構,幾乎所有的STM32芯片,官方在手冊中都會描述一下芯片內部的時鐘結構。STM32F04x也不列外,下面是STM32F04x系列單片機的時鐘樹:(摘自官方手冊)
圖中序號說明:
①:外部時鐘源的輸入端。這個時鐘源是系統時鐘,可用的時鐘源頻率范圍是(4~32)MHz。
②:外部實時時鐘的時鐘源輸入端。這個時鐘源是計時使用,所以它的頻率是固定在32.768KHz。
③:芯片內部時鐘輸出端。可以控制相關的寄存器,選擇內部的時鐘信號從這個端口對外輸出。
④:內部高速48MHz的時鐘源。該頻率不需要倍頻就可以直接給芯片的提供48MHz的系統時鐘信號。
⑤:內部低速8MHz的時鐘源。該頻率可以倍頻或不倍頻給系統提供時鐘信號。(但是STM32F04x芯片最高頻率是48MHz)
⑥:PLL倍頻模塊。該模塊可以選擇內部8M或外部時鐘為輸入,經倍頻后給芯片系統提供時鐘信號。
⑦:SW系統時鐘源選擇器。通過控制寄存器來選擇相關的時鐘源為芯片系統使用。
本次要切換的時鐘源是①HSE外部時鐘源和⑤內部8M時鐘源。不知大家是否留意過,市面上出售的各種STM32的開發板其外部的時鐘基本都是8MHz的,這是為什么呢?主要原因是讓初學者更快的上手。大家可以結合上圖的時鐘樹和官方的固件庫就可以得知,芯片內部的時鐘源頻率是8MHz,而官方的固件庫中配置系統時鐘源的時候,定義的相關變量和函數等,也都是用8MHz為基礎進行定義的。這樣一來,初學者就可以暫時不需要很清楚的了解時鐘結構的情況下,快速進行開發。節省了很多的時間,同時也降低了上手的難度。如果一開始就讓初學者要清楚的去了解芯片的時鐘結構,這樣對于能力強的人是無所謂的。但是對新手來說不是一個好的開始,也有可能會打擊學習的信心。
看完芯片的時鐘樹后,在看看官方的固件庫是怎么實現系統時鐘信號的配置:
STM32的芯片在啟動的時候,都是先從啟動文件開始執行的,而上圖中的程序就是在啟動文件中調用的,從上面的程序中可以看出,芯片在啟動的時候使用了(默認)內部的8MHz時鐘。之后是清除與時鐘相關的一切設置,最后調用了一個系統時鐘設置函數,該函數的源代碼如下:
上圖的函數就是在芯片復位完與時鐘相關寄存器后,進行配置系統時鐘源時調用的函數,該函數主要是進行了五個操作,分別是①啟用外部時鐘源,②設置PLL的輸入時鐘源于PLL的倍頻系數,③設置FLASH預取指與延遲周期,④設置系統時鐘分頻系數和外設總線時鐘分頻系數,⑤設置PLL模塊輸出頻率為系統時鐘源。這是官方默認的設置,從這里就可以看出,如果外部使用了8MHz的晶振時,PLL模塊倍頻6倍。則系統的時鐘頻率是8*6=48MHz。如果我們不想使用外部的晶振,則只能在這里進行編程設置相關寄存器的數值,達到我們的目的。具體的程序如下:
上圖是程序的設置過程是:
①開啟內部8MHz時鐘(這一步也可以不寫,因為芯片上電后默認開啟了內部8MHz時鐘)。
②等待內部時鐘穩定。
③配置FLASH預取指與等待周期。
④設置HPRE與PPRE的分頻系數。(一般情況下這兩個總線是不分頻的,除非對功耗有要求則需要分頻)
⑤設置PLL的輸入源和PLL模塊的倍頻系數。
(在設置PLL模塊時,必須先清除對該模塊的相關設置位,因為只有在PLL模塊關閉的情況下才能寫入相關的控制信息)
⑥等待PLL模塊輸出穩定。
⑦設置PLL模塊為系統時鐘。
⑧等待設置PLL模塊為系統時鐘完成。
按照上述過程配置完相關寄存器后,芯片的系統時鐘就設置為內部的8MHz。經過PLL模塊倍頻*6后,系統的最高頻率是8*6=48MHz。
在配置芯片的內部時鐘時,要注意的是:官方的固件庫中默認是使用外部晶振,并在時鐘配置函數SetSysClock中進行了外部時鐘穩定等待,假如外部時鐘啟動失敗的時候,默認是沒有相關函數去處理。所以,如果你的PCB板子上并沒有焊接外部的晶振時,切換時鐘的函數就寫在官方固件庫system_stm32f0xx文件中的SetSysClock函數中,這樣一來啟動過程中就直接將內部時鐘初始化為芯片的系統時鐘。
上一篇:STM32的IO口灌入電流和輸出驅動電流最大是多少?
下一篇:實戰經驗 | 移植 SBSFU 到 STM32G070 的過程
推薦閱讀最新更新時間:2025-04-29 01:28





設計資源 培訓 開發板 精華推薦
- S32K118-Q048通用評估板
- DC2588A-B,基于 LTC2387-16、16 位、15Msps 高速 SAR ADC 的演示板
- 經典850功放板
- AD8546ARMZ-R7比較器配置B的典型應用電路
- 使用 NXP Semiconductors 的 PCIMX25VM 的參考設計
- esp32cam-dloader
- ZXGD3101EV1,評估板演示 MOSFET 的同步整流和驅動
- LT1359 的典型應用 - 四路 25MHz、600V/us 運算放大器
- MIC5357 的典型應用:高性能、低噪聲雙 500mA ULDO
- 使用 NXP Semiconductors 的 MPXY8300A 的參考設計