OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6372|回复: 3

串口空闲中断中处理DMA数据,当数据发送过快HAL_UART_Receive_DMA()出现异常

[复制链接]

22

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2019-11-10
在线时间
61 小时
发表于 2021-8-2 15:30:55 | 显示全部楼层 |阅读模式
2金钱
问题1:串口DMA 使用空闲中断进行数据的接收处理,如果接收数据过快的时候会出现异常
异常为: 每次接收都是错误的,且不会恢复
if (HAL_OK  != HAL_UART_Receive_DMA(phuart,(uint8_t *)pdata,len) )
{}

实际测试速度慢的时候不会出现这个异常,当数据过快的时候异常就出现了。
1、硬件平台:  STM32H743
2、使用串口 DMA收发模式
3、使用串口调试助手进行数据发送,板卡将数据进行回传。
4、异常的时候发送间隔(30ms的情况下一般1分钟左右出现异常。速度越快越容易异常,一般我希望1ms发送一次数据包)

使用场景:DMA的接收使用空闲中断的方式,当时进入IDLE中断的时候,判断串口接收DMA里面的数据量,如果有数据就把数据提取出来。但是数据过快的时候就会导致HAL_UART_Receive_DMA接口函数一直返回错误。

贴部分代码:
pUsart->RxLen =  pUsart->buf_len - __HAL_DMA_GET_COUNTER(&gRxDMA_Handler[ch]);
if (pUsart->RxLen > 0)
{
        HAL_UART_DMAStop(phuart);
        if (HAL_UART_Receive_DMA(phuart,(uint8_t *)pUsart->RxDmaBuffer,pUsart->buf_len) != HAL_OK)   /* 重新启用接收 */
       {
                USARTError_Handler(-4);//异常
        }
}
异常详细描述:
1、如果异常的时候,接收到数据,还能进入空闲中断,神奇的是,判断接收到的数据长度都是2,如图1
这个时候,DMA发送还是可以发送出数据的,且发送数据的长度是对的。
图1、
2021-08-02_152224.png
2、读取接收异常的时候,发送是正常的,如图2,发送并不会进入到发送异常。
2021-08-02_152735.png

疑问:一般可能导致的情况是哪种呢?或者有没有异常的处理办法。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2019-11-10
在线时间
61 小时
 楼主| 发表于 2021-8-2 15:30:56 | 显示全部楼层
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-8-2 15:44:55 | 显示全部楼层
帮顶  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-8-3 02:33:00 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表