STM32F407外部晶體改為25M後檢測不到晶片的解決辦法
\\\插播一條:
自己在今年整理一套單片機單片機相關論文800余篇
論文製作思維導圖
原理圖+源代碼+開題報告+正文+外文資料
想要的同學私信找我。
分享一個之前遇到的STM32F4晶體頻率問題,導致單片機死機的解決辦法。使用一款新的F4開發板,直接使用的正點原子STM32F407工程模板代碼,管腳配置正確,下載到外部晶體為25MHz的開發板之後,LED不閃爍,串口無輸出,單片機直接死機,調試器檢測不到晶片。
問題分析
之前寫過一篇文章:STM32串口列印輸出亂碼的解決辦法,那個F103亂碼是因為外部晶體頻率12M,而程序中8M對應不上,導致的串口亂碼和定時器定時不準確,但是單片機並沒有死機,程序還可以正常下載,解決辦法也很簡單,只需要修改程序中的外部高速時鐘頻率(HSE_VALUE)和倍頻係數(RCC_CFGR_PLLMULL6)即可,而現在F407的這個情況貌似和之前F103的那個問題一樣,也是晶體頻率配置的問題,但是這個是直接死機了,單片機並沒有工作。現在的開發板晶體頻率是25M,而正點原子開發板的晶體頻率是8M,應該就是這個問題導致的。在《正點原子F407開發指南》中新建工程模板章節,官方固件庫中默認的晶體頻率是25MHz,為了適配板子的8M晶體,修改了如下兩個參數:
stm32f4xx.h文件
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
system_stm32f4xx.c文件
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 8
所以解決辦法很簡單,只需要修改程序中的晶體頻率和倍頻係數即可。
解決辦法
知道了問題的來源,解決就非常簡單了,只需要修改以上兩個宏定義的值就可以。
這裡涉及到STM32F4主時鐘的計算,主 PLL時鐘的時鐘源要先經過一個分頻係數為 M的分頻器,然後經過倍頻係數為 N的倍頻器出來之後的時候還需要經過一個分頻係數為P(第一個輸出 PLLP)或者Q(第二個輸出 PLLQ)的分頻器分頻之後,最後才生成最終的主 PLL時鐘。計算公式:
PLL=HSE_VALUE*N/(M*P)
8M晶體計算:
PLL=HSE_VALUE*N/(M*P)=8M*336/(8*2)=168MHz
25M晶體計算:
PLL=HSE_VALUE*N/(M*P)=25M*336/(25*2)=168MHz
所以25M晶體對應的HSE_VALUE=25000000,PLL_M=25,修改程序中的
stm32f4xx.h文件122行:
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz *
system_stm32f4xx.c文件316行:
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 25
修改完成後,重新編譯工程,正常的話,應該還是調試器檢測不到晶片,無法進行程序下載,所以為了挽救死機的晶片重新下載程序。我們需要在下載程序之前,先按住復位鍵不鬆開,然後點擊下載按鈕,等1秒鐘,再鬆開復位按鍵,這樣就可以下載進去了,程序正常運行,Amazing!
【文章福利】:小編整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件裡面,有需要的可以自行添加哦!~點擊綠色通訊軟體搜索airuimcu加入。