STM32F407 时钟频率不匹配导致系统瘫痪

  • Post author:
  • Post category:其他



问题描述:


因项目需求使用STM32F407系类,之前只使用过STM32F103系列,纯属小白一只。

使用的是原子哥的例程,板子是某宝淘的,价格实在便宜才下手的。

前期准备工作全部到位,使用J-Link烧写程序,程序一烧写进去,

J-Link正常状态

J-Link就消失了,本来LED灯还在闪烁烧写进去后就不闪了,越想越奇怪。一开始怀疑是程序版本问题,这次使用的HAL库开发版本,又去找了一个不带HAL库开发的版本进行测试。效果是一样的,而且每次程序烧写经去后J-Link还失效了,痛苦啊。

J-Link不正常状态


让J-Link恢复正常使用:


先需要解决J-Link让它恢复正常,怎么让J-Link可以正常使用。

程序问题导致整个片子死机,拔电源无法恢复,说明之前的程序还在里面作祟,只能把程序删除干净。

mcuisp软件下载:链接:

http://www.mcuisp.com/chinese%20mcuisp%20web/ruanjianxiazai-chinese.htm

.

***需要注意:***J-link的BOOT0是需要接地的,系统的存储器BOOT1需要接高电平。

Boot0-Boot1

删除内部程序后J-Link恢复正常。

STM32的启动模式详解:

链接:

https://blog.csdn.net/c12345423/article/details/52809527

.


发现问题并解决问题:


在板子上找了半天发现晶振是25Mhz的,原子哥板子上的晶振都是8Mhz的,估计晶振频率不对导致的整块板子瘫痪的。把程序上面的参数修改一下:

这个是库版本的,下面展示一些

内联代码片

stm32f4xx.h文件

#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 //HSE外部晶振
#endif /* HSE_VALUE */

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      25

需要修改 HSE_VALUE及PLL_M这两个参数。

STM32F407 RCC时钟

HSE(外部高速晶振),板子焊接8Mhz的晶振,那么HSE = 8Mhz,若焊接25Mhz,则HSE = 25Mhz。

HSI(内部高速晶振),芯片自带晶振,由芯片型号决定,STM32F407的HSI为16Mhz。

PLL(锁相环倍频),将HSE或HSI的频率放大,最大可以放大168Mhz。

STM32F407的时钟配置详见:

链接:

https://blog.csdn.net/husterxmh/article/details/52372403

.

下面是HAL库版本的修改:

main.c 初始化

// Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
Stm32_Clock_Init(336,25,2,7);  	//设置时钟,168Mhz

stm32f4xx_hal_conf.h

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


STM32F407的晶振计算公式:


PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N

SYSCLK=PLL_VCO/PLL_P

USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ

PLL_M:PLL VCO的输入时钟,范围1~2M

PLL_N:PLL VCO output clock between 192 and 432 MHz

PLL_P:PLL VCO 分频数,must be {2, 4, 6, or 8},此分频作为SYSCLK

PLLQ:OTG FS, SDIO and RNG的分频数,between 4 and 15 并且,如果使用USB OTG FS,那么此分频评论<=48MHZ



版权声明:本文为m0_38113669原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。