STM32(GD32)串口通信ORE(overrun error)导致死机
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)导致死机相关推荐
- GD32串口通信注意事项
GD32串口通信 虽说GD32与stm32采用同样的ARM® Cortex®-M3内核,而且GD32很大程度上可兼容stm32的程序,但是也存在着一些差异:所以为了使用上减少出错,使用GD32时尽量采 ...
- STM32 —— STM32 的串口通信
STM32 -- STM32 的串口通信 STM32的串口通信接口有两种,分别是:UART(通用异步收发器).USART(通用同步异步收发器).而对于大容量 STM32F10x 系列芯片,分别有 3 ...
- Ardunio下实现STM32的串口通信及其与Stduino的区别
摘要 本文介绍了在Ardunio下配置STM32并进行STM32的串口通信:之后我将介绍一下国人MCU开发平台Stduino与现在所使用的Arduino进行比较. 文章目录 摘要 :man_stude ...
- 单片机与PC机的交流———基于STM32的串口通信
STM32之串口通信程序 前言: 一.串口通信要求 二.串口通信准备 1.硬件准备 2.软件准备 三.下载程序进入STM32 1.下载之前相关配置 2.下载 四.最终效果展示 总结: 前言: 本文主要 ...
- K210学习笔记(三) K210与STM32进行串口通信,K210发STM收
文章目录 前言 一.以/r/n为结尾 二.K210端代码 三.STM32端 3.1 main函数 四.测试结果 4.1当收到1时 4.2当收到2时 4.3 测试视频 总结 前言 前面我们讲了STM32 ...
- 嵌入式STM32入门之STM32基础串口通信
STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...
- 【星曈科技】OpenMv笔记——利用OpenMV与STM32进行串口通信
利用OpenMV与STM32进行串口通信 OpenMV端的程序 # Untitled - By: dell - 周一 7月 19 2021# Blob Detection and uart trans ...
- STM32的串口通信UART/TTL
常用的串口pin STM32的串口是基础通信方式, 每个型号都带多组串口, 一般都使用默认的组, 可以参考芯片的datasheet, 去看pinout and pin definitions, stm ...
- javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...
最新文章
- Java 增强型的for循环 for each
- Fastsocket学习笔记之小结篇
- ajax 取值 返回map_springboot|前端发ajax请求到后台Controller及常见的坑
- 解决MSSQL MMC企业管理器打开报错问题
- 科大星云诗社动态20210202
- 科大星云诗社动态20210321
- 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等
- ❤️《JUC并发编程从入门到高级》(建议收藏)❤️
- java读取csv文件忽略bom头_PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法...
- FreeCAD源码分析: PartDesign模块
- 第四百九十一章 战利品
- fly.io ruby on rails
- 人工智能欠缺对语言和情感的理解和处理能力
- 今日学习之SQL基本语法与操作
- Rust中的channel
- 搜索引擎最经典的书籍——《走进搜索引擎》(梁斌 著)百度网盘免费下载
- MySQL命令行导出数据库(sql脚本)
- dll文件怎么编辑(dll文件怎么使用)
- 城市绿色货运配送体系评价
- 09、查询详细信息和删除记录