你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库中串口DMA发送之后State=HAL_UART_STATE_BUSY_TX不会改变,是B...

[复制链接]
czhang123 提问时间:2016-1-19 21:00 /
HAL库中串口DMA发送之后,huart->State=HAL_UART_STATE_BUSY_TX,但是DMA中断中没有将HAL_UART_STATE_BUSY_TX写回HAL_UART_STATE_READY的语句,以至于再次调用HAL_UART_Transmit_DMA()函数时,发送部分的代码被跳过,从而无法正常发送。
而HAL_UART_Receive_DMA()接收函数在接收完成的回调函数UART_DMAReceiveCplt()中有清除HAL_UART_STATE_BUSY_RX的语句,所以,DMA接收可以正常进行。
我觉得这是HAL库的一个BUG,不知道我的理解是否正确.
以下是  UART_DMAReceiveCplt()和UART_DMATransmitCplt()函数。

static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)  
{
  UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
  /* DMA Normal mode*/
  if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
  {
    huart->RxXferCount = 0;

    /* Disable the DMA transfer for the receiver request by setting the DMAR bit
       in the UART CR3 register */
    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

    /* Check if a transmit process is ongoing or not */
    if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
    {
      huart->State = HAL_UART_STATE_BUSY_TX;
    }
    else
    {
      huart->State = HAL_UART_STATE_READY;
    }
  }
  HAL_UART_RxCpltCallback(huart);
}



static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)     
{
  UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
  /* DMA Normal mode*/
  if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
  {
    huart->TxXferCount = 0;

    /* Disable the DMA transfer for transmit request by setting the DMAT bit
       in the UART CR3 register */
    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

    /* Enable the UART Transmit Complete Interrupt */   
    __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
  }
  /* DMA Circular mode */
  else
  {
    HAL_UART_TxCpltCallback(huart);
  }
}

收藏 评论3 发布时间:2016-1-19 21:00

举报

3个回答
沐紫 回答时间:2016-1-20 15:56:27
麻烦大家帮他看看
缘来&似梦 回答时间:2016-10-11 17:30:42
拇指  你咋不帮忙看看呢
linbinquan 回答时间:2016-10-13 16:34:58
            (+++) Configure the USARTx interrupt priority.
            (+++) Enable the NVIC USART IRQ handle.
开启usart中断,dma发送完毕后会    /* Enable the UART Transmit Complete Interrupt */
在uasrt中断里面会重置 huart->State = HAL_UART_STATE_READY

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版