中级会员
 
- 积分
- 303
- 金钱
- 303
- 注册时间
- 2019-11-10
- 在线时间
- 61 小时
|
2金钱
本帖最后由 woshi520laoxie 于 2021-8-1 16:48 编辑
串口DMA接收异常
问题1:空闲中断正常、读取DMA接收数据正常,但是里面的数据不对,一直都是第一次的数据
如果在空闲中断中打一个断点,那么数据也正常,全速运行的时候,数据就不对了。
问题1的尝试:空闲中断的时候加一个延时操作之后再去读取DMA里面的数据,也是不对的。
为何打个断点就对了
1、硬件平台: STM32H743
2、使用串口 DMA收发模式
使用场景:DMA的接收使用空闲中断的方式,当时进入IDLE中断的时候,判断串口接收DMA里面的数据量,如果有数据就把数据提取出来。
空闲中断的代码:
if((__HAL_UART_GET_FLAG(phuart,UART_FLAG_IDLE) != RESET))
{
__IS_NULL(pUsart);
__HAL_UART_CLEAR_IDLEFLAG(phuart);
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) /* 重新启用接收 */
{
Error_Handler();
}
pUsart->RxFlag = 1;
}
}
这个问题一开始的时候就遇到过,之后网上找一些例子,例子看着都大同小异,然后改着改着不知道为什么就正常了,现在加多一个串口又出现这个问题了。
但是不清楚问题的原因。不知道什么因素导致的。
实际测试情况如下:
1、如果我直接把接收到数据的缓存的地址给到发送,那么接下来接收到数据都是正确的(第一个箭头所指)。
2、如果我先把DMA接收到的数据复制一份出来,然后换一个地址进行发送,那么接下来DMA接收到数据就不对了(第二个箭头所指)。
我在论坛找了一个例子,试了一下,一样的效果。我把那个代码贴出来,测试的时候把宏改一下就可以了。
|
最佳答案
查看完整内容[请看2#楼]
H7芯片带有cache,不能直接去读DMA的数据。这个cache很重要,上手H7芯片 一定要看这个。 我当初就被这个坑死了。 或者你可以试试在读取数据之前加上
SCB_InvalidateDCache_by_Addr((uint32_t *)data, data.length); 这个函数
|