硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1123|回复: 3
收起左侧

[技术讨论] HAL库串口DMA发送、接收不定长数据,有分享也有疑问

[复制链接]

8

主题

32

回帖

56

积分

初级会员

初级程序员

积分
56
QQ
发表于 2022-12-27 17:46:48 | 显示全部楼层 |阅读模式
下图1,2,3是发送函数,发送完成和接收
单独设置DMA串口接收不定长数据,没问题;设置DMA发送和DMA空闲接收就会导致发送正常,但是接收数据为0.  我还修改了一个发送时单独停掉接收DMA,因为发送和接收都停止了 就会导致数据发不出去了。有没有经历过这种情况的大佬们指点一下,谢谢!
HAL_StatusTypeDef HAL_UART_DMA_StopRx(UART_HandleTypeDef *huart)
{
  /* The Lock is not implemented on this API to allow the user application
     to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback():
     when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
     and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback()
     */
#if 0
  /* Disable the UART Tx/Rx DMA requests */
  huart->Instance->CR3 &= ~USART_CR3_DMAR;
  /* Abort the UART DMA rx Stream */
  if(huart->hdmarx != NULL)
  {
    HAL_DMA_Abort(huart->hdmarx);
  }
    if(huart->gState == HAL_UART_STATE_BUSY_TX_RX)
        huart->gState = HAL_UART_STATE_BUSY_TX;
    else
        huart->gState = HAL_UART_STATE_READY;
  return HAL_OK;
#endif

  /* Stop UART DMA Rx request if ongoing */
  uint32_t dmarequest = 0x00U;
  dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
  if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest)
  {
    ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

    /* Abort the UART DMA Rx stream */
    if (huart->hdmarx != NULL)
    {
      HAL_DMA_Abort(huart->hdmarx);
    }
      ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));

      /* At end of Tx process, restore huart->gState to Ready */
      huart->gState = HAL_UART_STATE_READY;
  }
  return HAL_OK;

}


发送

发送

发送完成

发送完成

接收

接收
回复

使用道具 举报

8

主题

32

回帖

56

积分

初级会员

初级程序员

积分
56
QQ
 楼主| 发表于 2022-12-27 18:02:51 | 显示全部楼层
DMA发送时不能只停止接收需要都都停止 ,然后就可以实现DMA发送和DMA空闲中断不定长接收了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-12-27 18:04:46 | 显示全部楼层
这个设计不好,把HAL库都给改了。为什么不使用现成的DMA Idle Timeout空闲函数。

另外论坛也有很多可以参考的,都比较好使

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
https://www.armbbs.cn/forum.php?mod=viewthread&tid=93714

STM32V6之串口HAL库串口空闲中断接收不定长字节代码实现
https://www.armbbs.cn/forum.php?mod=viewthread&tid=101377
回复

使用道具 举报

8

主题

32

回帖

56

积分

初级会员

初级程序员

积分
56
QQ
 楼主| 发表于 2022-12-28 10:26:55 | 显示全部楼层
eric2013 发表于 2022-12-27 18:04
这个设计不好,把HAL库都给改了。为什么不使用现成的DMA Idle Timeout空闲函数。

另外论坛也有很多可以 ...

我昨天后面测试发现了修改了HAL库还是会出错,然后我还是使用的收发全都停了再另外的进程中重新启动发送和接收,也谢谢硬汉给的参考资料,我回去继续优化。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 07:26 , Processed in 0.164830 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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