HAL库DMA使用异常问题

问题描述:

1.串口接收一旦溢出就会丢数据。
串口接收满了,稍等几秒再重新启动DMA接收函数HAL_UART_Receive_DMA()时,就会丢失数据,而且此时串口接收空闲中断启动正常,打印出来会发现全是’\0’。如果接满后马上启动就没此问题。

2.串口DMA接收与发送不能单独停止。
如果串口同时进行DMA发送和DMA接收,在DMA接收到一半我要终止DMA时,只能调用HAL_UART_DMAStop()把接收DMA和发送DMA都停止,不能单独停止DMA接收。

原因分析:

当你将接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。

解决方案:

官方示例是deinit后再重新初始化串口,或者使用read接口直接将数据寄存器中的数据读走后,后面的数据才能正常进入,从而正常产生DMA请求,这个DMA请求是指硬件请求。
亲测解决方法:将HAL_UART_DMAStop()替换成HAL_UART_AbortReceive(),此函数是只关闭DMA接收的函数。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值