第三章 串口通信乱码的问题以及stm32时钟源的设置

串口通信乱码的问题

继上次调好CAN通信之后,在做蓝牙和232通讯的过程中发现传回来的数始终是乱码,折磨了一段时间,在排除了串口协议设置本身的问题之后,最后得出结论:移植板子的过程中一定要弄清楚单片机时钟的关系

波特率的问题归根到底是时钟的问题

首先考虑到:stm32f407和stm32f427的区别最主要是系统时钟不一样(前者是168Mhz,后者是180MHZ,所以在移植的时候也把重心放到了此处,只是当时仅仅改了一个声明,并没有考虑到硬件

原理图硬件的重要性

32时钟的配置一般在system_stm32f4xx.c文件和stm32f4xx.h文件中表现。

首先在system_stm32f4xx.c的开头导入了stm32f4xx.h,而在stm32f4xx.h文件中定义了满足你芯片型号的晶振变量。对应代码片段为:

①高速外部晶振HSE的选择:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5G9eyin-1642315023799)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116140559004.png)]

其中画红线部分是你使用单片机的选型,不同的选型对应的是不同的HSE(蓝色划线部分),比如我现在使用的是stm32f427,而在这之前我使用的是正点原子的芯片,从原理图上看,正点原子用的外部晶振是8Mhz。(如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XYUjGje-1642314970758)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141027485.png)]

而我目前用的stm32427芯片原理图上看是12MHZ(如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqOyuRQf-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116140958211.png)]

所以此时,我们需要把文件里定义的HSE晶振频率改为你所用单片机原理图OSC_IN和OSC_OUT对应的晶振(单位为MHZ的那个),修改如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJ4gQDQp-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141234489.png)]

** 注意

如果你在编译器的环境变量中定义了HSE(HSE_VALUE)值,那么你应该修改环境变量里的那个HSE值,比如我现在用的是IAR编译器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LLABwakr-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141512673.png)]

有些定义HSE的代码是直接写在system_stm32f4xx.c文件中的,那么就在.c文件中改。

修改system_stm32f4xx.c对应的系数PLL_M PLL_N PLL_P PLL_Q

回到一开始的问题,407和427的主要区别在于二者系统时钟即SystemCoreClock不一样,你会在.c文件中看到不同型号单片机的系统时钟赋值,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1EL89AK-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116142041125.png)]

但赋值本质上只是给了一个数而已,单片机是一个硬件,真正的SystemCoreClock是通过硬件上的晶振所决定的(可以使用高速外部时钟源HSE,也可以使用高速内部时钟源HSI),这里我们一直使用的是HSE。

那么由硬件决定的HSE是如何计算得到系统时钟的呢?

在system_stm32f4xx.c文件中给出了以下公式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAsa5alL-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116142759952.png)]

PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),
 根据手册,这个值被建议在 1~2MHz,间接可以算出M范围
PLL_VCO output clock = (PLL_VCO input clock) * PLL_N
 根据手册,这个值被建议在 192~432MHz,间接可以算出M范围
System Clock = (PLL_VCO output clock)/PLL_P 
 根据手册,系统时钟应小于等于120M,间接可以算出P范围
 OTHER Clock = (PLL_VCO output clock)/PLL_Q ,
这个系数用来配置SD卡读写,USB等功能,应小于等于48M,间接可以算出Q范围

所以具体的赋值是根据以上公式得来的,最终得出的System Clock即为你单片机的系统时钟。而你的目的就是要让System Clock等于你想要的值(比如我的是180MHZ)

以下是不同单片机型号的时钟配置:包括stm32f40_41系列、stm32f42_43系列.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRjb8wUB-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143214567.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLOrdutf-1642314970761)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143233559.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RI72wTt-1642314970761)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143252064.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gysVok5U-1642314970762)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143303363.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7WUnTlf-1642314970762)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143314706.png)]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32蓝牙串口通信中出现乱码的原因可能有几个。首先,确保发送和接收的数据格式相同。如果发送方使用ASCII字符集,接收方也必须使用相同的字符集。如果发送方使用十六进制模式发送数据,接收方也必须以相同的方式接收数据。如果数据格式不匹配,就会导致接收到的数据出现乱码。\[3\] 其次,检查蓝牙模块的连接方式和引脚连接是否正确。根据引用\[1\]中的描述,手机与STM32蓝牙通信时,蓝牙模块的RXD应该连接到STM32的PA9引脚,TXD应该连接到PA10引脚。确保连接正确可以避免因引脚连接错误而导致的乱码问题。 另外,还需要注意蓝牙模块的配置和通信协议。根据引用\[2\]中的描述,蓝牙HC05是主从一体的蓝牙串口模块,当建立连接后,两个设备共享同一个串口通道。确保蓝牙模块的配置正确,并且发送和接收的数据都按照相应的通信协议进行处理,可以避免乱码问题的发生。 综上所述,要解决STM32蓝牙串口通信中的乱码问题,需要确保发送和接收的数据格式相同,检查蓝牙模块的连接方式和引脚连接是否正确,并且正确配置蓝牙模块和通信协议。 #### 引用[.reference_title] - *1* *3* [第三讲:STM32串口蓝牙通信可能会犯的错误](https://blog.csdn.net/Miraitowain/article/details/130092382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Stm32 基于蓝牙的串口通信 详细篇](https://blog.csdn.net/qq_42177385/article/details/96502182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值