[其他ST产品] 如何多次使用HAL_REACH_RECEVE_DMA

[复制链接]
 楼主| lvluoo 发表于 2025-6-13 10:00 | 显示全部楼层 |阅读模式
我修改的项目ESTA_TwoBoards_ComDMA(为nucleo-144 H743 ZI 2)与DMA接收和DMA发送循环只有第一次接收到的数据是好的。
将PC6与PC7连接,以便回环测试。
以下代码:
do{

memset( aRxBuffer, 0x00, sizeof(aRxBuffer));
if(HAL_UART_Receive_DMA(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
   Error_Handler();
  }
if(HAL_UART_Transmit_DMA(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
{
Error_Handler();
}
while( HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
{
BSP_LED_Toggle(LED1);
HAL_Delay(100);
}
testCompare = memcmp(aRxBuffer,aTxBuffer, sizeof(aRxBuffer));
}
while( 1 );
只有第一次aRxBuffer包含aTxBuffer的内容。
用逻辑分析仪可以看到传输数据是好的。
还看到触发了中断回调函数HAL_RxCpltCallback(),但aRxBuffer中没有数据。
第二次接收数据需要特殊技巧吗?

公羊子丹 发表于 2025-7-31 15:43 | 显示全部楼层
看你循环里每次都 memset 清空了接收缓冲区,但中断回调可能还在用,会不会冲突导致数据丢了?
周半梅 发表于 2025-7-31 15:48 | 显示全部楼层
第二次没接收到数据,多半是因为你在 HAL_RxCpltCallback 里没有重新启动 DMA,HAL 不会自动再收一轮。
帛灿灿 发表于 2025-7-31 15:49 | 显示全部楼层
建议在 HAL_UART_RxCpltCallback 回调函数里调用 HAL_UART_Receive_DMA 再次开启下一次接收试试。
童雨竹 发表于 2025-7-31 15:50 | 显示全部楼层
UART DMA 是一次性的,调用一次只收一次,想循环收必须手动重新启动,不然只能收一次。
万图 发表于 2025-7-31 15:51 | 显示全部楼层
如果你是环回测试,用 DMA + Idle 中断更合适,不然同步不好控制,容易出现后面 DMA 不触发的问题。
Wordsworth 发表于 2025-7-31 15:52 | 显示全部楼层
HAL_UART_GetState 等待的是状态READY,但其实DMA收完后可能还没写好数据,延迟可能不够。
Bblythe 发表于 2025-7-31 15:52 | 显示全部楼层
我之前做串口DMA循环收发是加了信号量,收发配合RTOS控制流程,不能完全靠while(1)循环压。
Pulitzer 发表于 2025-7-31 15:53 | 显示全部楼层
回调能进但 buffer 是空的,这说明 DMA 正常工作但内存被提前清了,怀疑是 memset 用得太早。
Uriah 发表于 2025-7-31 15:54 | 显示全部楼层
可以试试看开启 __HAL_UART_CLEAR_IDLEFLAG() 配合 IDLE中断方式做循环接收,更稳妥。
Clyde011 发表于 2025-7-31 15:55 | 显示全部楼层
如果你开的是 cache,别忘了调用 SCB_InvalidateDCache_by_Addr() 来同步 DMA 和 CPU 访问,否则看起来就是 buffer 没写。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部