1.将发送数据写入队列
2.如果传输标志为0,则启动直接启动传输(更新标志为1);
3.捕捉DMA传输完成中断,在中断中查看是否有数据要发送
4.如果无数据发送,则设置DMA传输标志为0


初始化DMA:

/// UART1发送位于通道4的数据流7
__HAL_RCC_DMA2_CLK_ENABLE();                            /// 使能DMA时钟
hdma1.Instance                 = DMA2_Stream7;          /// Stream7表示UART发送
hdma1.Init.Channel             = DMA_CHANNEL_4;         /// 通道4
hdma1.Init.Direction           = DMA_MEMORY_TO_PERIPH;  /// 方向: 存储器-->外设
hdma1.Init.PeriphInc           = DMA_PINC_DISABLE;
hdma1.Init.MemInc              = DMA_MINC_ENABLE;
hdma1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma1.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
hdma1.Init.Mode                = DMA_NORMAL;
hdma1.Init.Priority            = DMA_PRIORITY_LOW;
hdma1.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma1) != HAL_OK)
{
  
}    
__HAL_LINKDMA(huart, hdmatx, hdma1);   /// 关联usart句柄

DMA发送:

HAL_DMA_Start(huart1.hdmatx,
              (uint32_t)dma_buff, 
              (uint32_t)&huart1.Instance->DR, 
              sp);                         // 开启 DMA 传输
huart1.Instance->CR3 |= USART_CR3_DMAT;    // 使能串口 DMA 发送