STM32串口通信ORE(overrun error)导致死机

现象就是:我要接收到16个字节到数据后就开始处理数据,但是主机发过来的指令超过了16个字节,就导致我这里死机了,其实我这里不应该死机的,因为波特率才9600,一个字节的时间来处理中断代码完全够用。

怎么掉进坑的呢:因为我在接收中断处理函数里加了发送字符的函数putchar,也就是当我接收到16个字节时,我就在中断函数里给主机回复“ok”这两个字符。这就完蛋了,如果主机发了16个字节不发了,那没问题,如果发了16个字节还在发,就overrun了。悲催。

原来用的是STM32的单片机,HAL库,估计HAL库会出现overrun,但是不会死机,因为在HAL库的串口中断函数里我看有清ORE的功能。但是后来STM32涨价,就换了GD32,用的GD32标准库,然后就进坑了。

下面是STM32 HAL库的void USARTx_IRQHandler(void),对各种错误是有处理的。

在USART的SR(状态寄存器)出现overrun标志后如何清掉呢

先读一下SR寄存器,然后再读一下DR寄存器。

在HAL库里感觉还有一个USART_ICR寄存器,但是手册里没有,在库的USART_TypeDef;里有定义。偏移地址是0x20

在GD32的库里也有一个偏移20的定义

看注解的话,这两个应该是对应的了

HAL库里的__HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);这个清标志就是:

#define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__))

我想找到在GD32里清这个标志的函数,应该就是下面这个了

但是和STM32不同的是,这里是一下清RBNE和ORERR两个标志,HAL库是只清UART_CLEAR_OREF这一个标志

不管了,还是解决问题吧,在串口中断里判断如果发生了ORE错误中断,就清这个中断标志,然后再读下SR和DR,这应该可以了吧。

关键是把中断函数里的putchar()函数给去了。

【当出现问题时,我是看了别的大神的文章才知道ORE这个问题的,在此感谢!】

STM32(GD32)串口通信ORE(overrun error)导致死机相关推荐

  1. GD32串口通信注意事项

    GD32串口通信 虽说GD32与stm32采用同样的ARM® Cortex®-M3内核,而且GD32很大程度上可兼容stm32的程序,但是也存在着一些差异:所以为了使用上减少出错,使用GD32时尽量采 ...

  2. STM32 —— STM32 的串口通信

    STM32 -- STM32 的串口通信 STM32的串口通信接口有两种,分别是:UART(通用异步收发器).USART(通用同步异步收发器).而对于大容量 STM32F10x 系列芯片,分别有 3 ...

  3. Ardunio下实现STM32的串口通信及其与Stduino的区别

    摘要 本文介绍了在Ardunio下配置STM32并进行STM32的串口通信:之后我将介绍一下国人MCU开发平台Stduino与现在所使用的Arduino进行比较. 文章目录 摘要 :man_stude ...

  4. 单片机与PC机的交流———基于STM32的串口通信

    STM32之串口通信程序 前言: 一.串口通信要求 二.串口通信准备 1.硬件准备 2.软件准备 三.下载程序进入STM32 1.下载之前相关配置 2.下载 四.最终效果展示 总结: 前言: 本文主要 ...

  5. K210学习笔记(三) K210与STM32进行串口通信,K210发STM收

    文章目录 前言 一.以/r/n为结尾 二.K210端代码 三.STM32端 3.1 main函数 四.测试结果 4.1当收到1时 4.2当收到2时 4.3 测试视频 总结 前言 前面我们讲了STM32 ...

  6. 嵌入式STM32入门之STM32基础串口通信

    STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...

  7. 【星曈科技】OpenMv笔记——利用OpenMV与STM32进行串口通信

    利用OpenMV与STM32进行串口通信 OpenMV端的程序 # Untitled - By: dell - 周一 7月 19 2021# Blob Detection and uart trans ...

  8. STM32的串口通信UART/TTL

    常用的串口pin STM32的串口是基础通信方式, 每个型号都带多组串口, 一般都使用默认的组, 可以参考芯片的datasheet, 去看pinout and pin definitions, stm ...

  9. javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...

    STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...

最新文章

  1. Java 增强型的for循环 for each
  2. Fastsocket学习笔记之小结篇
  3. ajax 取值 返回map_springboot|前端发ajax请求到后台Controller及常见的坑
  4. 解决MSSQL MMC企业管理器打开报错问题
  5. 科大星云诗社动态20210202
  6. 科大星云诗社动态20210321
  7. 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等
  8. ❤️《JUC并发编程从入门到高级》(建议收藏)❤️
  9. java读取csv文件忽略bom头_PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法...
  10. FreeCAD源码分析: PartDesign模块
  11. 第四百九十一章 战利品
  12. fly.io ruby on rails
  13. 人工智能欠缺对语言和情感的理解和处理能力
  14. 今日学习之SQL基本语法与操作
  15. Rust中的channel
  16. 搜索引擎最经典的书籍——《走进搜索引擎》(梁斌 著)百度网盘免费下载
  17. MySQL命令行导出数据库(sql脚本)
  18. dll文件怎么编辑(dll文件怎么使用)
  19. 城市绿色货运配送体系评价
  20. 09、查询详细信息和删除记录

热门文章

  1. 基于HTML5的3D多人网页游戏实现方案
  2. dota2 linux文件位置,Linux下能玩魔兽世界、打DOTA2了 4K 120Hz很爽
  3. Vue中实现放大镜效果
  4. pipeline+sonar
  5. vscode对比vs:花落谁家
  6. Linux C/C++ 内存泄漏检测工具:Valgrind - 张宴的博客 - Web系统架构与底层研发
  7. 如何查看网站上的icon
  8. C语言/C++基础之悠悠球的爷爷和自由落体运动
  9. 培养孩子各种特长的最佳年龄
  10. easypoi使用list导出word修改字体大小以及字体样式