Ⅰ、寫在前面
最近有很多朋友問:1.我的USART串口打印出來的數(shù)據(jù)是亂碼?2.我的TIM定時器延時或定時不準確?
常見可能原因:
1.晶振問題:外部晶振不起振、或頻率與配置不匹配。
2.軟件問題:分頻、倍頻、時鐘源選擇等。
總結(jié)來說,主要還在于軟件的問題。因為即使沒有外部晶振,也可以使用內(nèi)部晶振。
其實,軟件的問題是容易得到解決的,只要你了解了STM32時鐘配置里面具體內(nèi)容就知道了。
關(guān)于本文的詳細內(nèi)容請看下面章節(jié)
Ⅱ、本文要點要了解時鐘的配置,就需要知道它在哪里配置,也就是還需要了解軟件執(zhí)行的流程。
1.軟件流程說軟件流程是讓大家知道系統(tǒng)時鐘配置的位置。不管是使用寄存器開發(fā),還是使用庫(標準庫、HAL庫)開發(fā)STM32,工程中基本上都有“startup_stm32fxxxxx.s”這么一個啟動文件。
在線調(diào)試的朋友應該知道,你點一下復位按鈕,軟件會跳轉(zhuǎn)到下圖的位置,其實可以看到復位之后第一個執(zhí)行的函數(shù)就是【SystemInit】。說到這里,應該明白為什么我們在main函數(shù)開始沒有看見時鐘配置相關(guān)的函數(shù)了吧,程序是在復位后立馬配置的時鐘。
使用庫庫(標準庫、HAL庫)開發(fā)STM32的朋友,在工程中都可能會看到“system_stm32fxxx.c”這么一個文件,這個文件里面代碼主要的功能就是配置STM32的系統(tǒng)時鐘。
上面啟動文件中說到的【SystemInit】函數(shù)就是在這個文件里面,【SystemInit】函數(shù)里面就是配置系統(tǒng)時鐘的具體內(nèi)容。配置系統(tǒng)時鐘主要就是時鐘源選擇、分頻、倍頻等。
注意:STM32有多系列芯片,這里【SystemInit】函數(shù)里面代碼的內(nèi)容也因此不同。
3.外部晶振頻率、系統(tǒng)時鐘頻率對于初學者,容易受到影響的就是兩個參數(shù):HSE_VALUE(外部晶振頻率)、SystemCoreClock(系統(tǒng)時鐘)。這個兩個參數(shù)在ST提供的庫中都有一個參考值,一般的開發(fā)板都是按照參考值設(shè)計的晶振,所以不用修改。但如果不同,那么就要修改。位置分別在“stm32fxxx.h”和“system_stm32fxxx.c”文件下面,如下圖(F4系列為例):
時鐘樹是很好反應時鐘時鐘源選擇、分頻、倍頻的一個框圖,要深入理解,請下載相關(guān)參考手冊查看RCC章節(jié)的時鐘樹,下面截取部分系列芯片時鐘樹圖:
驗證時鐘配置是否正確的方法可以通過MCO輸出時鐘,用示波器檢測一下就知道了。我前面提供的軟件工程中有一段代碼(如下圖),主要就是MCO時鐘輸出的代碼。
需要深入掌握STM32系統(tǒng)時鐘配置的內(nèi)容,還需要你自己認真閱讀以下源代碼(建議看一下注釋說明)。官方提供的代碼從命名上都是很容易理解的。