stm32 串口乱码的解决
版权声明:本文为博主原创文章。
前几天在中移物联网申请了一个迷你开发板,运行官方提供的程序,感觉板子是正常的。但是自己写的程序能够刷到板子上,但是串口却是乱码。官方和我的额程序都是用的库函数的方式写的。在网上,有人说库函数默认是8兆晶振,但是“option for target”->"target"里将Xtal(MHz)设置为12,也不起作用。
对比发现,官方的库函数,都是在程序文件里的,mdk应该是4.X版的。我用的mdk5.X版的,后来在官网下载了5.21a的版本依然是同样的错误。
我自己的程序的库文件是从 mdk的“Manage Run-Time Environment”界面下的Device -> StdPeriph Drivers 里选择对应文件。
这些由系统提供的文件上都有一个锁,在编辑器里也无法修改。
在官方和我的程序里都加上 printf("3-USART1->BRR \t %d\r\n",USART1->BRR); 语句,发现
在设定波特率为115200下,官方数值为625,而我的程序为521
在设定波特率为9600下,官方数值为7500,我的程序为6250
依此判断,还频率的问题造成的。怎么修正还得研究。
找到 “MDK安装目录\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include\stm32f10x.h”,在120行开始显示:
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
曾经也尝试着自行定义 “#define HSE_VALUE ((uint32_t)12000000)”也不起作用。
后来,无意间发现,系统提供的文件,都是只读属性。去掉只读属性,在mdk里,钥匙图标没有了,可以修改stm32f10x.h文件了。
结论,1、“option for target”->"target"里将Xtal(MHz)的参数仅用于模拟调试,不影响实际板卡的参数设置。系统提供的文件可以被修改。3、在错位的情况下,芯片可能被超频了。但是还能运行(没坏)。
看似上述不多的文字,却耗费了我几周的业余时间做各种验证测试。希望能够帮助有此类问题的朋友。