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);
}
}
麻烦大家帮他看看:) 拇指你咋不帮忙看看呢 (+++) 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]