1. 程式人生 > >當手頭上沒有示波器,如何通過程式碼測試stm32外部晶振是否工作

當手頭上沒有示波器,如何通過程式碼測試stm32外部晶振是否工作

1.首先檢視stm32手冊,可以知道有一個時鐘控制暫存器(RCC_CR),在該暫存器中,第16位和第0位和25位和24位分別為:
HSEON:外部高速時鐘使能 (External high-speed clock enable)
HSION:內部高速時鐘使能 (Internal high-speed clock enable)
PLLRDY:PLL時鐘就緒標誌 (PLL clock ready flag)
PLLON:PLL使能 (PLL enable)

如下圖:
第16位

第0位

第25位和第24位

  1. 因此,當在串列埠以%x的形式列印RCC_CR暫存器的值的時候,輸出的內容為0x3035283(也有可能為0x3035183)時,,此時第0位和第16位都為1,第25位和第24位也都為1,因此使用了外部晶振作為時鐘源(因為stm32開始上電初始化時,需要內部8M晶振工作來進行初始化)。

  2. 當註釋掉system_stm32f10x.c中的SystemInit()函式中的SetSysClock()函式,系統將預設使用內部時鐘,此時讀出RCC_CR暫存器的值為0x5283(或者0x5183),此時第16位、25位、24位都為0,第0位為1。

  • 但是筆者之前在專案開發時,遇到了一個測試值,輸出的內容為0x15283。這時,第0位和第16位都為1,但是第25位和24位都為0

經過查閱stm32手冊,發現stm32內部有時鐘安全系統,如下圖所示:

時鐘安全系統

  • 內容大概就是,當使用HSE振盪器(外部晶振)作為輸入時鐘時,當發生時鐘故障時,PPL輸入時鐘將會被關閉,切換到內部的HSI振盪器(內部晶振),因此RCC_CR暫存器中25位和24位都為0,此時stm32使用內部晶振作為時鐘源

經過筆者的排查,發現確實是外部的晶振損壞了,當換上新的晶振後,工作正常。
因此,當開發專案時,測試發現RCC_CR暫存器中外部PLL時鐘的位都為0時,如果外部電路測試沒問題的話, 基本上就是外部晶振的問題了。