STM32串口打印输出乱码的解决办法

前言

最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样。很多STM32开发板都是使用的8M晶振,这个也是ST官方推荐的晶振频率,而且固件库默认是8M频率,倍频系数9。而uFUN开发板的晶振是和CH340共用一个12M晶振。如果固件库的参数不和硬件实际连接的晶振频率一致,那么不仅是串口会出现乱码,而且定时器这些也是不准确的,因为基本的工作时钟被打乱了。其实之前也遇到过这个问题,这次就算是记录一下吧!

STM32串口打印输出乱码的解决办法_第1张图片

1.修改stm32f10x.h文件中的晶振频率

打开工程中的stm32f10x.h文件,Ctrl+G快捷键定位到119行,把宏定义

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

外部晶振频率8M修改为12M

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

如下图所示:

STM32串口打印输出乱码的解决办法_第2张图片

2.修改system_stm32f10x.c文件中的倍频系数

打开工程中的system_stm32f10x.c文件,Ctrl+G快捷键定位到1056行,把宏定义

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

倍频系数由9修改为6,因为STM32F103主频最高到72MHz,外部晶振改为12M后,所以倍频系数改为6

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);

如下图所示:

STM32串口打印输出乱码的解决办法_第3张图片

总结

当然串口乱码可能不止这一个原因,这个解决方法只针对于外部晶振的改变,导致的串口数据乱码。其他问题还要仔细分析,总得来说,两个问题:程序问题,硬件问题。

参考资料:

  • STM32串口通信乱码详细处理方法

历史精选文章:

  • 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
  • 一键自动格式化你的代码
  • Qt小项目之串口助手控制LED
  • Jlink使用技巧之烧写SPI Flash存储芯片
  • Jlink使用技巧之虚拟串口功能
  • Jlink使用技巧之读取STM32内部的程序
  • Jlink使用技巧之J-Scope虚拟示波器功能
  • C++学习之从C到C++

欢迎大家关注我的个人博客

或微信扫码关注我的公众号

你可能感兴趣的:(电子电路,单片机,C语言,STM32,Jlink,Keil,串口,uFUN开发板评测系列,STM32,串口)