STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口通信遇到串口调试助手能够接收到数据但出现乱码现象。
开始一直以为是串口配置和程序代码问题,因为是第一次上电在线调试STM32板子,后面主要查串口波特率配置和收发函数程序段,如下图:

波特率设置成115200没问题,试着降低波特率改成9600和4800但问题依旧没有解决,紧接着如下处理:

将重定向函数注释,单独写串口发送字节和字符串函数,依旧失败。最后锁定到系统时钟配置上,由于手上的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,

因此在system_stm32f10x.c文件中的setsysclockto72()函数中,(system_stm32f10x.c文件实现了 STM32的时钟配置,操作的是片上的 RCC这个外设统在上电之后,首选会执行由汇编编写的启动文件,启动文件中的复位函数中调用systemInit 函数就在这个文件里面定义。systemInit 函数默认调用setsysclockto72()配置系统时钟,系统的时钟就被初始化成 72M。)这样便将系统时钟配置成了72M,否则为12*9=108M。但测试运行仍然接收到乱码。
继续找问题所在,查看 在stm32f10x.h里,有下面这段代码

原因是库使用默认8MHz晶振,可以通过宏使用25MHz或12M晶振。具体定义在stm32f10x.h文件中,HSE_VALUE,一开始定义成了8000000,改成12000000搞定,串口通信显示正常。
版权声明:本文为CSDN博主「aizaiyueye」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aizaiyueye/article/details/79049816
编辑:jq
-
单片机
+关注
关注
6074文章
45340浏览量
663519 -
STM32
+关注
关注
2305文章
11120浏览量
371146 -
串口通信
+关注
关注
34文章
1657浏览量
57635 -
函数
+关注
关注
3文章
4406浏览量
66837
原文标题:STM32串口通信乱码详细处理方法
文章出处:【微信号:mcugeek,微信公众号:MCU开发加油站】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
关于stm32f4zgt6和mspm0g3507串口通信问题
STM32串口发送数据,USART_FLAG_TC无法置位怎么解决?
STM32L431偶发串口乱码的原因?怎么解决?
使用Labview做一个485串口电子秤程序
用Labview写一个电子称的485串口程序

知道STM32串口通信乱码要怎么处理吗
评论