STM32应用笔记--通过DMA发送串口数据
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 发送