搜索
查看: 11824|回复: 11

[已解决] 利用中断的方式接收串口数据会发生溢出错误的问题

[复制链接]

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2020-9-22
发表于 2018-5-25 11:13:16 | 显示全部楼层 |阅读模式
由于手上项目用的STM32L072的芯片,所有只能使用Cube库来写代码,利用软件配置好串口的各项参数后,使用串口中断的方式收发数据,发数据是正常的,但是在接收数据的时候总是会出现溢出错误,找遍了网上的解决办法也没找到问题,希望大神指导一下。

我在main一开始就只配置了时钟和串口,然后HAL_UART_Receive_IT(&huart1,uart1_rx_buf,1)。在回调函数中也同样开启一个字节的接收中断,而每次只能收到一次中断,由于ORE错误,所有进不去回调函数,因此收不到数据,不知道什么原因引起的,还请论坛里的大神指导一番。

下面贴出代码

main

main

push使用的是串口1,发送数据没有问题

串口配置.png
这是我出口的初始化函数

中断入口.png
中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了

溢出错误.png
这是进不去回调的溢出错误




回复

使用道具 举报

该用户从未签到

35

主题

167

帖子

61

蝴蝶豆

金牌会员

最后登录
2021-1-30
发表于 2018-5-25 14:11:44 | 显示全部楼层
1 中断程序(不仅仅是串口)要响应所有中断。不要只响应接收中断,其他错误中断也要处理,否则会频繁进入中断造成假死。
2 STM32串口只有一个硬件BUF,个人认为是硬伤。115200波特率的情况下,大家算下一个字节是多少us?
只要串口中断被卡主住这么长时间不处理,就造成溢出。
3 把中断优先级提高、用DMA、人工优化。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

回复 支持 1 反对 0

使用道具 举报

该用户从未签到

6

主题

233

帖子

82

蝴蝶豆

金牌会员

最后登录
2019-11-12
发表于 2018-5-25 11:52:05 | 显示全部楼层
按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RXNE = 0
ORE.png

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2018-5-25 12:56:53 | 显示全部楼层
串口ore.PNG

可以参照上面分方式清除ORE标志,读取一次串口的DR寄存器,ORE flag就会被清除。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2018-5-25 13:13:41 | 显示全部楼层
  楼主可以参考这个文档,应该对你有帮助。

USART中断方式接收无响应问题的一种情况及其处理方法 (1).pdf

336.94 KB, 下载次数: 218, 下载积分: ST金币 -1

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2020-9-22
 楼主| 发表于 2018-5-25 15:47:26 | 显示全部楼层
andeyqi 发表于 2018-5-25 12:56
可以参照上面分方式清除ORE标志,读取一次串口的DR寄存器,ORE flag就会被清除。
...

但是在USART1_IRQHandler中调用串口HAL_UART_IRQHandler的时候RXNE会自动被清除,也会造成进不去回调。       我发现在USART1_IRQHandler中不管执行什么操作RXNE都会被自动清除,都还没有去读RDR的内容它就自己清零了,到底是为什么呢
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2020-9-22
 楼主| 发表于 2018-5-25 16:17:08 | 显示全部楼层
xiajintaord 发表于 2018-5-25 11:52
按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RX ...

但是都还没去读RDR寄存器它就自动被清了,导致我后面接收不了数据
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

233

帖子

82

蝴蝶豆

金牌会员

最后登录
2019-11-12
发表于 2018-5-25 16:55:48 | 显示全部楼层
Jeasonnnn 发表于 2018-5-25 16:17
但是都还没去读RDR寄存器它就自动被清了,导致我后面接收不了数据

两种方法:
1、把中断优先级提高;
2、用 DMA(推荐)
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2018-5-25 17:17:22 | 显示全部楼层
Jeasonnnn 发表于 2018-5-25 15:47
但是在USART1_IRQHandler中调用串口HAL_UART_IRQHandler的时候RXNE会自动被清除,也会造成进不去回调。   ...

根据描述在应该是确定产生了ORE事件,开启了ORE中断了吗?进入中断时RXNE是为1的,之后变变为0,是这个现象吗?代码中是否开启了别的中断,响应时间比较长的?
回复 支持 反对

使用道具 举报

该用户从未签到

91

主题

4756

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-2-27
发表于 2018-5-26 00:36:09 | 显示全部楼层
提高中断级后看看数组是不是溢出,看看中断代码有没有问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 02:30 , Processed in 1.224392 second(s), 48 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表