打印
[应用相关]

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

[复制链接]
1157|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口通信遇到串口调试助手能够接收到数据但出现乱码现象,开始一直以为是串口配置和程序代码问题,因为是第一次上电在线调试STM32板子,后面主要查串口波特率配置和收发函数程序段,如下图:

使用特权

评论回复
沙发
yutingwei|  楼主 | 2021-7-30 22:49 | 只看该作者
波特率设置成115200没问题,试着降低波特率改成9600和4800但问题依旧没有解决,紧接着如下处理:

使用特权

评论回复
板凳
yutingwei|  楼主 | 2021-7-30 22:58 | 只看该作者
将重定向函数注释,单独写串口发送字节和字符串函数,依旧失败。最后锁定到系统时钟配置上,由于手上的STM32开发板改用了12M的晶振,根据单片机时钟树的理解和解读,一般采用外部时钟HSE,系统时钟配置成72M,8*9=72,,12*6=72,对于 SYSCLK、HCLK、PCLK2、PCLK1 这四个时钟的配置一般是:PCLK2 = HCLK = SYSCLK=PLLCLK = 72M,PCLK1=HCLK/2= 36M。UART1挂载在APB2总线,而PCLK2 = HCLK = SYSCLK=PLLCLK = 72M,

使用特权

评论回复
地板
yutingwei|  楼主 | 2021-7-30 23:00 | 只看该作者
因此在system_stm32f10x.c文件中的setsysclockto72()函数中,(system_stm32f10x.c文件实现了 STM32的时钟配置,操作的是片上的 RCC这个外设统在上电之后,首选会执行由汇编编写的启动文件,启动文件中的复位函数中调用systemInit 函数就在这个文件里面定义。systemInit 函数默认调用setsysclockto72()配置系统时钟,系统的时钟就被初始化成 72M。)这样便将系统时钟配置成了72M,否则为12*9=108M。但测试运行仍然接收到乱码。

使用特权

评论回复
5
yutingwei|  楼主 | 2021-7-30 23:02 | 只看该作者
继续找问题所在,查看 在stm32f10x.h里,有下面这段代码,

使用特权

评论回复
6
yutingwei|  楼主 | 2021-7-30 23:04 | 只看该作者
原因是库使用默认8MHz晶振,可以通过宏使用25MHz或12M晶振。具体定义在stm32f10x.h文件中,HSE_VALUE,一开始定义成了8000000,改成12000000搞定,串口通信显示正常。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

381

帖子

0

粉丝