作者:王超
首发:电子电路开发学习
前言
最近在试用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);
如下图所示:
总结
当然串口乱码可能不止这一个原因,这个解决方法只针对于外部晶振的改变,导致的串口数据乱码。其他问题还要仔细分析,总得来说,两个问题:程序问题,硬件问题。
参考资料:
推荐阅读
欢迎关注公众号:电子电路开发学习,id:mcu149。
更多电子电路、单片机、嵌入式、物联网等技术文章欢迎关注电子电路开发学习专栏。