STM32 HAL库IDLE检查DMA接收完成程序中ORE问题

HAL库IDLE检查DMA接收完成程序流程说明

1.配置串口,配置DMA接收通道(我只用DMA接收),memInc一定要使能;
2.配置完之后编写中断回调函数,idle回调函数完全需要自己写,因为HAL库中完全没有这部分;
3.编写开启DMA接收的函数,函数中用HAL_UART_Receive_DMA开始DMA的接收,然后用__HAL_UART_ENABLE_IT这个函数开启串口的IDLE中断;这里需要注意的一点就是HAL_UART_Receive_DMA函数内部打开了DMA的tc ht 和te的中断,同时tc对应的中断函数就是HAL_UART_RxCpltCallback,所以注意对对应的串口,编写相应的接收完成函数(说明一点,个人理解,这里的接收完成应该是你设置的dma长度接收完成,而IDLE检测的接收完成,是说明一条数据发送的完成,这是区别
4.按照前三步就可以完成程序的接收了,但我在接收的过程中遇到了ORE的问题;

ORE产生原因

阅读手册,ORE产生的原因是DR中的数据还没有被读出来,就有新的数据到来导致数据溢出,产生ORE;而在本例中,ORE产生的原因是,在IDLE的处理过程中,会关掉DMA的接收,处理完数据之后,再打开DMA接收,在数据处理的过程中,如果又有数据到来,那么就无法处理这部分的数据(因为我们没设置rxne的中断,所以收到数据无法读取,那么就清不掉rxne的状态位,那么再来数据,就会产生ORE,这时候你就会问了,那么dma接收的时候,RXNE的状态位是怎么清楚的呢?这也是我的问题,查手册你就可以看到,RXNE可以通过读取DR寄存器来消除,哈哈,明白了吧)。

ORE消除办法(未验证)

1.将HAL_UART_Receive_DMA函数中使能ORE中断的代码去掉,也就是不要ORE中断了(感觉不是个好办法);
2.缩短dma关闭的时间,在idle中断中,只是将dma的数据copy到缓存区,然后就打开dma,降低数据无法处理的时间,减少ORE产生的可能性;
3.在串口的中断函数判断ORE并清除,同时也清除RXNE的标志位;

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值