中级会员
 
- 积分
- 303
- 金钱
- 303
- 注册时间
- 2019-11-10
- 在线时间
- 61 小时
|
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、
2、读取接收异常的时候,发送是正常的,如图2,发送并不会进入到发送异常。
疑问:一般可能导致的情况是哪种呢?或者有没有异常的处理办法。
|
|