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-hans/e356c2d2905ee0e2b25189f5405a7e2b.html