
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); } } |
(+++) Enable the NVIC USART IRQ handle.
开启usart中断,dma发送完毕后会 /* Enable the UART Transmit Complete Interrupt */
在uasrt中断里面会重置 huart->State = HAL_UART_STATE_READY
评分
查看全部评分