利用中断的方式接收串口数据会发生溢出错误的问题
由于手上项目用的STM32L072的芯片,所有只能使用Cube库来写代码,利用软件配置好串口的各项参数后,使用串口中断的方式收发数据,发数据是正常的,但是在接收数据的时候总是会出现溢出错误,找遍了网上的解决办法也没找到问题,希望大神指导一下。我在main一开始就只配置了时钟和串口,然后HAL_UART_Receive_IT(&huart1,uart1_rx_buf,1)。在回调函数中也同样开启一个字节的接收中断,而每次只能收到一次中断,由于ORE错误,所有进不去回调函数,因此收不到数据,不知道什么原因引起的,还请论坛里的大神指导一番。
下面贴出代码
push使用的是串口1,发送数据没有问题
这是我出口的初始化函数
中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了
这是进不去回调的溢出错误
1 中断程序(不仅仅是串口)要响应所有中断。不要只响应接收中断,其他错误中断也要处理,否则会频繁进入中断造成假死。
2 STM32串口只有一个硬件BUF,个人认为是硬伤。115200波特率的情况下,大家算下一个字节是多少us?
只要串口中断被卡主住这么长时间不处理,就造成溢出。
3 把中断优先级提高、用DMA、人工优化。 按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RXNE = 0
可以参照上面分方式清除ORE标志,读取一次串口的DR寄存器,ORE flag就会被清除。
楼主可以参考这个文档,应该对你有帮助。
andeyqi 发表于 2018-5-25 12:56
可以参照上面分方式清除ORE标志,读取一次串口的DR寄存器,ORE flag就会被清除。
...
但是在USART1_IRQHandler中调用串口HAL_UART_IRQHandler的时候RXNE会自动被清除,也会造成进不去回调。 我发现在USART1_IRQHandler中不管执行什么操作RXNE都会被自动清除,都还没有去读RDR的内容它就自己清零了,到底是为什么呢 xiajintaord 发表于 2018-5-25 11:52
按你的说法 “中断入口,每次从这里跳进去的时候,串口的RXNE标志就被清了”
应该是下图中第二种情况了 RX ...
但是都还没去读RDR寄存器它就自动被清了,导致我后面接收不了数据 Jeasonnnn 发表于 2018-5-25 16:17
但是都还没去读RDR寄存器它就自动被清了,导致我后面接收不了数据
两种方法:
1、把中断优先级提高;
2、用 DMA(推荐) Jeasonnnn 发表于 2018-5-25 15:47
但是在USART1_IRQHandler中调用串口HAL_UART_IRQHandler的时候RXNE会自动被清除,也会造成进不去回调。 ...
根据描述在应该是确定产生了ORE事件,开启了ORE中断了吗?进入中断时RXNE是为1的,之后变变为0,是这个现象吗?代码中是否开启了别的中断,响应时间比较长的? 提高中断级后看看数组是不是溢出,看看中断代码有没有问题
页:
[1]
2