【问题解决】STM32F4串口打印乱码问题

首先声明,使用的芯片为STM32F407ZET6、使用标准库。

问题简述:使用串口作为调试用时,发现串口调试助手接收到的数据显示乱码,更改单片机、调试助手的波特率后还为解决。但发现一个有趣的问题,串口调试助手下发的数据再由单片机上传是无错误的。串口调试助手的问题可以排除,故问题出在了单片机一侧。

解决思路:既然串口调试助手、波特率的问题都排除掉了,进而就怀疑到了单片机的时钟上。

经过排查,发现我的板子上使用的是8MHz的晶振,而F4的标准库默认为25MHz晶振。


stm32f4xx.h 文件中,我找到如下定义:

具体位置大概在120行

/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */     
#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
  
#endif /* HSE_VALUE */

In the following line adjust the value of External High Speed oscillator (HSE)   used in your application(在下一行中,调整应用中使用的外部高速振荡器(HSE)的值)

这就是外部晶振的默认频率定义。因为没有定义 HSE_VALUE ,故被定义为 (uint32_t)25000000


解决办法:只需将 HSE_VALUE 定义为 (uint32_t)8000000 即可。

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

经过重新编译,可以正常打印串口信息。问题解决!


如果问题仍未解决,可考虑时钟树的配置问题。