前面讲到的UART接收执行过程:
- 启动UART的DMA接收(这里面还定义了DMA回调函数):HAL_UART_Receive_DMA
- 接收完成后,请求DMA中断(判断中断的类型):HAL_DMA_IRQHandler
- 调用DMA接收完成回调函数(同时关闭了DMA接收):UART_DMAReceiveCplt
- 调用UART接收回调函数(处理数据,启动DMA接收):HAL_UART_RxCpltCallback
UART的DMA发送和接收的过程类似,部分细节不同,DMA的发送执行过程如下:
- 启动UART的DMA发送(其中定义了发送的回调函数):HAL_UART_Transmit_DMA
- 发送完成,请求DMA中断(判断中断的类型):HAL_DMA_IRQHandler
- 调用DMA发送完成回调函数:UART_DMATransmitCplt
到这一步还是一样的,执行到 UART_DMATransmitCplt里面时,开始不一样了。看一下UART_DMATransmitCplt说了啥:
static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
/* DMA Normal mode*/ //看这里1
if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U)
{
huart->TxXferCount = 0x00U;
/* 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 */
SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
}
/* DMA Circular mode */ //看这里2
else
{
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/*Call registered Tx complete callback*/
huart->TxCpltCallback(huart);
#else
/*Call legacy weak Tx complete callback*/
HAL_UART_TxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
}
}
程序不长,看着好像和UART_DMARe