关于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;
        }
      }

补充:

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32中,使用DMA(Direct Memory Access,直接存储器访问)方式进行串口发送的步骤如下: 1. 首先,需要进行串口DMA的初始化配置。配置串口的参数,包括波特率、数据位、校验位等,并使能串口DMA发送功能。 2. 然后,需要进行DMA的初始化配置。选择一个可用的DMA通道,并设置传输的数据长度、源地址和目的地址。 3. 接下来,将待发送数据写入到指定的内存区域中。 4. 启动DMA传输,并等待传输完成的中断或标志位。 5. 传输完成后,可以进行相应的处理,例如清除标志位或执行其他操作。 总结起来,串口DMA发送的流程包括串口DMA的初始化配置、写入数据到内存、启动DMA传输,并等待传输完成。 引用提供了一个简单的步骤,其中包括了串口DMA的初始化、发送数据和接收数据的步骤。引用提供了关于STM32 DMA配置的相关信息,包括DMA控制器和通道的数量。 请注意,以上是一个简化的概述,具体的实现细节可能因使用的STM32系列和开发环境而有所不同。详细的配置和代码实现需要参考相应的STM32芯片手册和开发工具的文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32 串口采用DMA方式收发](https://blog.csdn.net/zhengyanan815/article/details/105726219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值