前言
最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样。很多STM32开发板都是使用的8M晶振,这个也是ST官方推荐的晶振频率,而且固件库默认是8M频率,倍频系数9。而uFUN开发板的晶振是和CH340共用一个12M晶振。如果固件库的参数不和硬件实际连接的晶振频率一致,那么不仅是串口会出现乱码,而且定时器这些也是不准确的,因为基本的工作时钟被打乱了。其实之前也遇到过这个问题,这次就算是记录一下吧!
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 */
如下图所示:
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);
如下图所示:
总结
当然串口乱码可能不止这一个原因,这个解决方法只针对于外部晶振的改变,导致的串口数据乱码。其他问题还要仔细分析,总得来说,两个问题:程序问题,硬件问题。
参考资料:
历史精选文章:
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
- 一键自动格式化你的代码
- Qt小项目之串口助手控制LED
- Jlink使用技巧之烧写SPI Flash存储芯片
- Jlink使用技巧之虚拟串口功能
- Jlink使用技巧之读取STM32内部的程序
- Jlink使用技巧之J-Scope虚拟示波器功能
- C++学习之从C到C++
欢迎大家关注我的个人博客
或微信扫码关注我的公众号