STM32F407外部晶體改為25M後檢測不到晶片的解決辦法

2022-05-25     大方老師單片機

原標題:STM32F407外部晶體改為25M後檢測不到晶片的解決辦法

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=25000000PLL_M=25,修改程序中的

stm32f4xx.h122行:

#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz *

system_stm32f4xx.c316行:

#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加入。

文章來源: https://twgreatdaily.com/zh-cn/e356c2d2905ee0e2b25189f5405a7e2b.html