单片机反汇编 2024-03-01 23:12 采纳率: 15.4%
浏览 191

STM32 HAL DMA串口发送失败

STM32G070 单片机,HAL库 DMA串口发送失败

使用的是串口接收中断一个字节一个字节接收


void UpdateDisplay_long(uint16_t addr1,int32_t number1)
{
    uint8_t TempBuff[]={0xA5,0x5A,0x07,0x82,0x01,0x10,0x00,0x00,0x00,0x00};
 
    
    TempBuff[0x04]=addr1>>8;
    TempBuff[0x05]=addr1;
    
    TempBuff[0x06]=number1>>24;
    TempBuff[0x07]=number1>>16;
    TempBuff[0x08]=number1>>8;
    TempBuff[0x09]=number1;
    
    
    // 串口发送 这样可以 但是这样发送CPU在这里耗费很多时间
    //HAL_UART_Transmit(&huart3,TempBuff,sizeof(TempBuff),0XFFFF);
    
    // DMA发送 不成功,想着节约CPU时间
    HAL_UART_Transmit_DMA(&huart3, (uint8_t *)TempBuff, sizeof(TempBuff));//使用DMA发送数据
    
 
    
}

img

  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-03-01 23:13
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    针对你描述的问题,你使用了STM32G070单片机,并且在使用HAL库中的DMA功能发送串口数据时遇到了发送失败的问题。你已经尝试了使用DMA发送数据,但是未成功,并且希望通过DMA发送数据来节约CPU时间。
    针对这个问题,我会提出以下解决思路和解决方案:

    问题分析

    1. DMA发送失败可能是由于DMA配置不正确导致的,需要仔细检查DMA配置。
    2. 另外,你提到使用了串口接收中断一个字节一个字节接收,这可能会影响DMA发送的性能,需要确认是否存在冲突或者资源竞争的情况。

      解决思路

    3. 确认DMA配置:检查DMA配置是否正确,包括DMA通道、传输方向、数据大小等参数是否设置正确。
    4. 确保串口接收中断与DMA发送不冲突:确保串口接收中断和DMA发送不会同时操作相同的资源,避免资源竞争导致发送失败。

      解决方案

      DMA配置检查

      cCopy code
      // 检查DMA通道是否正确配置
      // 检查传输方向是否正确配置为内存到外设
      // 检查数据大小是否设置正确
      // 检查数据传输模式是否正确配置为循环传输或者一次传输,根据需求选择
      // 检查DMA中断是否使能,如果需要DMA传输完成中断,则需要使能相应的中断
      // 确认DMA缓冲区地址设置是否正确
      

      解决资源竞争问题

      cCopy code
      // 确保串口接收中断和DMA发送不会同时操作相同的资源,可以通过优先级设置或者加锁机制来避免冲突
      // 在串口接收中断中避免长时间占用CPU,可以在接收中断中尽快完成处理并尽快退出
      
      通过以上的解决方案,你可以检查DMA配置是否正确,并且确保串口接收中断与DMA发送不冲突,从而解决发送失败的问题。如果你需要进一步的帮助或者有其他问题,请随时提出。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日