0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GD32 串口接受异常的几个原因

聚沃科技 2024-01-18 09:57 次阅读

前面我们介绍过GD32 485发送时出现异常的最常见原因,有小伙伴反馈想要知道GD32 串口接受异常的可能原因,今天我们就来安排。

一、波特率异常导致收发出错

我们知道,串口是异步通讯接口,通讯双方或者多方都需要工作在相同波特率下,如果波特率不对,则发送和接收都会异常。通常引起波特率异常的原因有以下几种:

外部晶振频率设置错误

GD32 固件库中,波特率的运算是需要去获取挂载这个串口的内部总线的频率

wKgaomWohQ-ALJt8AAEBK-4Gcd0028.png

而获取总线频率的的函数中需要用到HXTAL_VALUE这个值,即外部晶振的实际频率。

wKgZomWohRWAZtpRAADPb5Tu77g076.png

GD32库中这个值默认是8M或25M,而有的小伙伴在用其他频率的晶振时,虽然根据实际频率修改了配置主频的函数,但没将HXTAL_VALUE这个值修改为实际值,就会导致配置出来的波特率和预想不符,从而导致波特率异常。

wKgaomWohRqAZ4gSAABZzLvczos644.png

晶振频偏

如果外部和内部晶振出现频偏,也会导致波特率频偏,这个很好理解,那么频偏多少会出现异常呢?根据实际测试和经验,晶振出现2%的频偏,就会导致串口异常。如果使用的外部晶振,可以直接测量晶振的波形:

wKgZomWohSCAYjJXAAQ-2Eq8nvo695.png

如果是用的内部晶振,可以通过PA8口输出内部晶振频率,再测量PA8口波形即可(如何使用PA8输出内部频率,后面也会出教程哦)。至于为什么超过2%就出现异常,小伙伴们可以自己思考下哦。

wKgaomWohSWAcFpkAABb_TAWJEw682.png

二、接受过载

当串口接收线上数据量较大,而软件由于一些原因比如需要处理更高优先级的任务时,就可能会发生数据寄存器和移位寄存器中的数据都还没有被读走的情况下,又接收到新的数据,此时串口发生接收过载。

wKgZomWohSqAKUvqAAFUuSfI-Po847.png

串口状态寄存器中的ORERR位将会置“1”,新的数据也将不会被接收到MCU中,从而导致数据丢失。

wKgZomWohTWARiHlAAG-wm1GULY778.png

该问题的解决办法:

(1)使用中断进行数据接收,且适当提高中断优先级,同时需要打开接收过载中断,当发送过载时表示有数据丢失,可以对这一帧数据做算法处理;

(2)使用DMA接受数据,因为DMA不需要CPU参与,故一般情况下不会出现接收过载。

三、接收的数据起始位不标准

我们知道,串口每个byte的数据都有一个起始位,占一个bit时间,如果由于一些原因导致对方发过来的数据起始位过短的话,MCU就无法识别到这个起始位,从而这个byte的数据就不会被接收。小编就见过因为加了隔离芯片导致起始位变短,而传输的第一个数据bit位变长,虽然这个byte的数据时间是符合波特率的,但由于起始位不标准,也将导致接收异常。

wKgaomWohT2AX46UAAB-xvefIss875.png

实际上这个问题只会在GD部分芯片上出现,比如GD32F405/407/450,这是因为这几颗芯片串口起始位的检测比较严苛,而GD32有的型号做了起始位检测优化,比如GD32F30x、F425/427/470系列,就不会出现这样的问题。

四、干扰

串口的发送和接收,实际上就是一串波形,当波形收到干扰时,也会出现通信异常。这种情况下,小伙伴们就要去通过硬件的方式去过滤到干扰源就可以解决问题了。

以上,就是小编总结的几点串口接收异常的可能原因,小伙伴们有知道其他原因的,欢迎在评论区交流哦。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620826
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74511
  • GD32
    +关注

    关注

    7

    文章

    333

    浏览量

    23740
收藏 人收藏

    评论

    相关推荐

    GD32 串口接受异常几个原因

    单片机mcu
    聚沃科技
    发布于 :2024年01月19日 10:42:07

    GD32和STM32有哪些不同的地方

    一、前言GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的,不过GD32毕竟是不同的
    发表于 08-09 07:03

    什么是GD32

    一、前言什么GD32GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的,不过
    发表于 08-12 07:46

    GD32的外部中断介绍

    中断介绍◼ 高效的中断处理;◼ 支持异常抢占和咬尾中断;◼ 将系统从省电模式唤醒;◼ 3 种触发类型:上升沿触发,下降沿触发和任意沿触发;◼ 软件中断或事件触发;◼ 可配置的触发源。简单介绍下它的一些必备知识,后面我们能用得到的。首先就是GD32的中断线这个图很清楚的表示
    发表于 08-16 08:36

    GD32可以替换STM32吗

    什么是GD32GD32与STM32的区别在哪?GD32可以替换STM32吗?
    发表于 10-20 07:03

    GD32 DMA串口通讯DEMO的相关资料推荐

    GD32 DMA串口通讯GD32 USART0 DMA发送与接收不定长数据GD32E230简介GD32E230采用DMA进行
    发表于 12-10 06:26

    浅析stm32f103&gd32的u***虚拟串口+打印类printer组合设备

    stm32f103&gd32的u***虚拟串口+打印类printer组合设备@TOCstm32f103&gd32的u***虚拟串口,打印类printer组合设备由于
    发表于 01-26 06:27

    GD32系列总结

    GD32系列总结 - 时钟树总结及CubeMX生成代码写在前面时钟树HSE振荡器时钟(高速外部时钟信号)HSE用户外部时钟(旁路模式)HSE外部晶体/陶瓷谐振器HSI振荡器时钟PLL时钟LSE时钟
    发表于 02-11 07:11

    GD32串口回环的设置解析

    GD32串口IO该怎样去设置呢?GD32串口接收该怎样去设置呢?
    发表于 02-28 06:33

    GD32和STM32的区别

    一、前言GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以GD32和STM32有很多地方都是一样的,不过GD32毕竟是不同的
    发表于 11-18 20:51 46次下载
    <b class='flag-5'>GD32</b>和STM32的区别

    GD32 DMA串口通讯DEMO

    GD32 DMA串口通讯GD32 USART0 DMA发送与接收不定长数据GD32E230简介GD32E230采用DMA进行
    发表于 11-26 19:36 71次下载
    <b class='flag-5'>GD32</b> DMA<b class='flag-5'>串口</b>通讯DEMO

    gd32和stm32哪个好?

    gd32和stm32哪个好? GD32和STM32是两种常见的微控制器系列,是开发者们常用的开发板核心。尽管它们相似之处很多,但它们也存在着差异,本文将深入探讨GD32和STM32,分享它们的优缺点
    的头像 发表于 08-16 11:32 1031次阅读

    GD32和STM32有何区别?GD32如何替换STM32呢?

    GD32和STM32有何区别?GD32如何替换STM32呢? GD32和STM32是两种不同的微控制器系列,一般被用于嵌入式系统开发。GD32是中国华大基因(Gigadevice)公司
    的头像 发表于 11-22 18:18 3311次阅读

    GD32 485发送异常最常见原因

    相信有小伙伴们遇到过这样的问题,在使用GD32进行串口485发送的时候,明明发送了特定长度的数据,但从机就是不响应,现在就让我们来解析下最常见的一个原因
    的头像 发表于 01-16 09:39 433次阅读
    <b class='flag-5'>GD32</b> 485发送<b class='flag-5'>异常</b>最常见<b class='flag-5'>原因</b>

    GD32 MCU ISP失败的原因

    玩过GD32的小伙伴们都知道,GD32 MCU支持ISP,即在系统编程,前面的常见问题也给大家讲过什么是ISP,什么是IAP?那有没有小伙伴遇到过ISP失败的情况,失败的原因是什么呢?
    的头像 发表于 02-28 09:23 393次阅读
    <b class='flag-5'>GD32</b> MCU ISP失败的<b class='flag-5'>原因</b>