wuzhibang 发表于 2016-1-19 21:00:34

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

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);
}
}

沐紫 发表于 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
页: [1]
查看完整版本: HAL库中串口DMA发送之后State=HAL_UART_STATE_BUSY_TX不会改变,是B...