【问题解决】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 */
经过重新编译,可以正常打印串口信息。问题解决!
如果问题仍未解决,可考虑时钟树的配置问题。