GD32错误调试篇:串口通讯乱码/stm32移植到GD32后串口通讯乱码等问题

 本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发

       向上代码兼容GD32F450ZGT6中使用

       后续项目主要在下面该专栏中发布:

https://blog.csdn.net/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482

       感兴趣的点个关注收藏一下吧!

       电机驱动开发可以跳转:

GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-CSDN博客

       BMS电源系统开发可以跳转:暂未放链接

介绍

今天我们又来对一期问题进行解答,太久没更新了,因为一直在忙着公司的出差,本次对串口通讯中出现的发送乱码问题进行解释。

首先需要排除的问题:

本篇文章,是针对于在串口常规配置都正确的情况下,依旧出现乱码的时候的教程

常规配置中可能导致串口发送出现乱码的问题:
 

1.检查波特率是否一致

2.检查串口数据格式是否正确

3.检查串口配置是否正确(引脚配置+串口配置+初始化)

4.检查是否在Main中对串口/延时函数/GPIO初始化

5.检查printf是否重定向

在排除以上常规问题后出现的串口乱码问题或者是从stm32移植到GD32中出现的乱码问题例如:

解决办法

1.乱码肯定是波特率出现问题

既然出现了乱码问题,在常规配置没有问题的情况下,我们就要去考虑,出现乱码问题的本质原因是什么呢?肯定是波特率始终对不上,但是明明我们设置的波特率比如9600,我们配置的时候写的就是9600呀?

这里就会有一个设计到串口时钟怎么去分频得到波特率的问题了

在STM32微控制器中,串行通信接口(如USART)的波特率是由串口时钟(USART_CLK)和USART_BRR寄存器中的设置共同决定的。USART_CLK通常来自于APB2或APB1总线时钟,这取决于USART的具体实例。例如,USART1通常连接到APB2总线上,而USART2至USART6则连接到APB1总线上。

stm32HAL库中配置例如:

// 设置USART时钟为84 MHz
__HAL_RCC_USARTx_CLK_ENABLE();// 初始化USART配置结构体
huartx.Instance = USARTx;
huartx.Init.BaudRate = 115200;
huartx.Init.WordLength = UART_WORDLENGTH_8B;
huartx.Init.StopBits = UART_STOPBITS_1;
huartx.Init.Parity = UART_PARITY_NONE;
huartx.Init.Mode = UART_MODE_TX_RX;
huartx.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huartx.Init.OverSampling = UART_OVERSAMPLING_16;// 初始化USART
HAL_UART_Init(&huartx);

2.如果是从stm32移植到GD32

在GD32系列微控制器中,串行通信接口(如USART)的波特率计算原理与STM32非常相似。GD32的USART模块同样通过分频其时钟源来产生所需的波特率。时钟源可以是APB2总线时钟,具体取决于所使用的USART模块。

但是GD32的主频拿标准的F1或者F303来说是108MHZ,比起stm32的主频72MHZ想比快上不少,那么可能一个配置不当就会产生波特率的问题。

那么说了这么多,我们该怎么去解决问题呢?

前面我们已经找到了问题是出现在波特率上面,那么自然而然,我们就需要去更改时钟晶振相关的配置了:
 

在GD32F450或者GD32F407中,我们能够找到外部晶振的宏定义,决定了外部输入晶振的大小,我之前出现乱码的原因是因为:之前这里内部是写的是25MHZ的晶振,但是我实际上焊接在板子外面的外部晶振却是8MHZ的晶振,那么我们就需要去修改宏定义的值了,如下图:

修改完毕以后就可以发现,串口发送到电脑端的数据又恢复正常了。

除了这里以外,在总时钟168MHZ的选取上,GD32内部也是提供了不同的选择:
 

该图是通过内部的16MHZ晶振以达到我们需要的200MHZ:

该图是启用外部时钟的8MHZ以达到我们需要的168MHZ的晶振:

注意事项

这里需要注意一个关联问题:在上图中我们能发现:同样是外部晶振输入,GD32预留了8MHZ、16MHZ、25MHZ的输入接口,那么我们在修改完宏定义后,记得在这里也进行相应的修改,不然就得不偿失了

上面讲的这些宏定义存在于:

这两个文件中!

王炸解决办法

如果对于精度不那么重要的场合,可以选择内部自带的芯片晶振去启动芯片,这样就可以解决绝大多数的乱码问题啦!

最后成果:

多串口正常发送数据

单串口正常发送数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

【JS】上传文件显示文件的为空,显示的文件参数内容只有uid

上传的文件参数file里面只包含uid,没有其他信息 例子解决办法 例子 例如使用elment ui的el-upload组件上传文件,会导致上传的文件参数file里面只包含uid,没有其他信息,如图: 正确应为如下图: 解决办法 …

云上战场:ToDesk云电脑、青椒云、顺网云全面对决

前言 记得端午放假期间,我已经在旅游的路上了,老板突然发短信,让我给他画个图,我手上的战斗机已经是十年前的老古董了(平常一直用的公司电脑,也没想过要换),压根满足不了老板的任务要求,不得已&…

WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 客户端WPF // 检查应用更新 //1、获取最新文件列表 // var files fileService.GetUpgradeFiles(); // 2、文件判断,新增的直接下载;更新的直接下载;删除的直接删除 // 客户端本地需要一个记录…

SpringMVC系列三: Postman(接口测试工具)

接口测试工具 💞Postman(接口测试工具)Postman介绍Postman是什么Postman相关资源Postman安装Postman快速入门Postman完成Controller层测试其它说明 💞课后作业 上一讲, 我们学习的是SpringMVC系列二: 请求方式介绍 现在打开springmvc项目 &#x1f49e…

2024年十大数据集成工具和软件应用场景解析

详细阐述了十大数据集成工具及其优缺点: 数据集成的挑战 在当今的商业环境中,企业常常面临着数据分散、系统孤立的难题。传统的数据集成方式,就像一张复杂的蜘蛛网,难以理顺,令人头痛不已。 数据孤岛: 各个业务系统独立…

window.history()方法总结

window.history()方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! window.history是JavaScript中的一个内置对象,代表浏览器的历史记录。该…

【博士每天一篇文献-算法】Memory aware synapses_ Learning what (not) to forget

阅读时间:2023-12-13 1 介绍 年份:2018 作者:Rahaf Aljundi,丰田汽车欧洲公司研究员;阿卜杜拉国王科技大学(KAUST)助理教授;Marcus Rohrbach德国达姆施塔特工业大学多模式可靠人工智能教授 会议: Proceedings of the European c…

系统学习PLC

1.OB组织块 程序循环 PC ob1执行一次 ob123也执行一次 是 statup是程序启动的是第一个周期先执行starup(0b100)然后在执行ob1和0b123.这二个循环,周期执行这二个循环。1000是1s 2.DB块 建立指定数据块可以直接建立自己喜欢的类型 3.FB与…

轻量级 ioc/aop 框架 loveqq 1.0 发布,完全替换掉若依底层 spring 及其 starter

loveqq-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动。 本次更新: 正式更名为:loveqq-famework 新增:loveqq-boot-starter-mybatis 新增:loveqq-boot-start…

网络安全--安全设备(一)Dos

安全设备--Dos 一、Dos 是什么二、DDos是什么三、Dos&DDos的区别四、产品防御Dos&DDos方式五、常见的DDoS攻击类型包括但不限于以下几种: 一、Dos 是什么 Dos(拒绝服务攻击,Denial-of-Service),是一种试图通过压倒网络或服务器来阻止合法用户访…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件( Higher-Order Components,简称HOC)是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分,而是基于 Reac…

如何优化频繁的v-if造成的页面卡顿

如何优化频繁的v-if造成的页面卡顿,只能用v-if 优化 1.将频繁的v-if转化为v-show:v-show与v-if有所不同。v-show会一直存在,只是CSS属性display被动态控制,而v-if则会根据条件在DOM中添加或移除元素。如果v-if出现频繁&#xff0c…

为何云原生是未来?企业IT架构的颠覆与重构(上)

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是云原生 2、云原生的背景和起源 背景 起源 关…

Android 查询及获取应用程序 Package 及 Acticity 名称的方法

一、通过命令查询和获取应用的Package及Acticity (一)通过命令查询应用包名及安装信息 以下是常用命令: 命令形式作用adb shell pm list packages查询系统中所有应用的包名adb shell pm list packages -s查询系统应用包名adb shell pm lis…

vue实现点击元素跳转至另一个网站

在 Vue 中,要实现点击一个元素并触发函数跳转到另一个网站的功能,你可以直接在元素的点击事件处理程序中调用 window.location.href 来设置新的 URL。但如果你确实需要在点击事件中先执行一些逻辑(例如发送请求、修改状态等)&…

19、架构-虚拟化容器

概述 本文讲解虚拟化容器技术的发展及其在现代计算架构中的应用。内容分为三个主要部分:容器的崛起、以容器构建系统、以应用为中心的封装。以下是对每个知识点的详细描述。 1、 容器的崛起 容器技术的快速发展和广泛应用为软件开发和运维带来了巨大的变革。以下…

前端性能优化篇之webpack如何提⾼的打包速度、如何减少打包体积、如何⽤来优化前端性能、如何提⾼构建速度?

目录 如何提⾼webpack的打包速度?1. 使用最新版本的Webpack和相关插件:2. 合理配置Loader:3. 使用HappyPack或thread-loader:4. 使用DllPlugin预编译依赖模块:5. 使用Tree Shaking:6. 使用缓存:7. Code Sp…

MySQL 函数

1、CURDATE():返回当前的日期。 2、查询当前年月 SELECT DATE_FORMAT(CURDATE(),%Y-%m) AS year_month 3、当前日期添加 1 个月 INTERVAL 1 MONTH 4、查询近6个月的月份 SELECT DATE_FORMAT(CURDATE(),%Y-%m)AS year_month UNION SELECT DATE_FORMAT((CURDAT…

【网络安全学习】使用Kali做信息收集 -03- <综合侦察>

综合侦察涉及从多个来源收集和分析目标的信息,以了解其背景、特征、潜在漏洞和风险。 下面介绍一些在Kali中常用的综合侦察工具。 1.Dmitry 它是一个命令行工具,可以使用不同的选项来收集目标的各种信息。 Dmitry可以与whois服务和Netcraft服务结合使…