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

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

  • HAL库IDLE检查DMA接收完成程序流程说明
  • ORE产生原因
  • 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的标志位;

你可能感兴趣的:(STM32)