Jeasonnnn 发表于 2018-5-25 11:13:16

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

由于手上项目用的STM32L072的芯片,所有只能使用Cube库来写代码,利用软件配置好串口的各项参数后,使用串口中断的方式收发数据,发数据是正常的,但是在接收数据的时候总是会出现溢出错误,找遍了网上的解决办法也没找到问题,希望大神指导一下。

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

下面贴出代码

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


这是我出口的初始化函数


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


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




huangxuejia-292 发表于 2018-5-25 14:11:44

1 中断程序(不仅仅是串口)要响应所有中断。不要只响应接收中断,其他错误中断也要处理,否则会频繁进入中断造成假死。
2 STM32串口只有一个硬件BUF,个人认为是硬伤。115200波特率的情况下,大家算下一个字节是多少us?
只要串口中断被卡主住这么长时间不处理,就造成溢出。
3 把中断优先级提高、用DMA、人工优化。

xiajintaord 发表于 2018-5-25 11:52:05

按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RXNE = 0

andeyqi 发表于 2018-5-25 12:56:53



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

andeyqi 发表于 2018-5-25 13:13:41

楼主可以参考这个文档,应该对你有帮助。

Jeasonnnn 发表于 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的内容它就自己清零了,到底是为什么呢

Jeasonnnn 发表于 2018-5-25 16:17:08

xiajintaord 发表于 2018-5-25 11:52
按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RX ...

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

xiajintaord 发表于 2018-5-25 16:55:48

Jeasonnnn 发表于 2018-5-25 16:17
但是都还没去读RDR寄存器它就自动被清了,导致我后面接收不了数据

两种方法:
1、把中断优先级提高;
2、用 DMA(推荐)

andeyqi 发表于 2018-5-25 17:17:22

Jeasonnnn 发表于 2018-5-25 15:47
但是在USART1_IRQHandler中调用串口HAL_UART_IRQHandler的时候RXNE会自动被清除,也会造成进不去回调。   ...

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

feixiang20 发表于 2018-5-26 00:36:09

提高中断级后看看数组是不是溢出,看看中断代码有没有问题
页: [1] 2
查看完整版本: 利用中断的方式接收串口数据会发生溢出错误的问题