Bootstrap

关于STM32串口DMA只能发送一次数据的问题

原因:

可能是忘记关闭DMA导致串口、下一次DMA无法正常工作

解决办法:

在传输完成之后,关闭DMA,这里是调用串口DMA关闭函数,形参为串口初始化结构体地址,我这里是串口2。

HAL_UART_DMAStop(&huart2);    //关闭寄存器——>外设的串口DMA

完美优化:

传输完成标志位

TCX标志位,例如:发送通道为7,即TC7

DAM外设通道表

 例如,我使用的是串口2DMA的TX发送模式,即通道为USART2_TX,为通道7

代码解决

调用的是__HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__);宏定义来获取标志位。

第一个形参为串口初始化结构体,第二个形参为通道完成标志位,这里我使用的是通道7,即TC7

    if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7))//获取传输完成标志
    {
        __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7);//清楚传输完成标志位
        HAL_UART_DMAStop(&huart2);                      //关闭DMA传输
    }

简单的一种使用办法:

      while(1)
      {
        if((__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7)))
        {
          __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TC7);
          HAL_UART_DMAStop(&huart2); 
          break;
        }
      }

补充:

如果仍然无法解决的话,再检查一下时钟是否使能,串口中断是否设置。

;