分享

STM32 HAL库 串口DMA 发送失败的问题

 怪叔叔的书城 2022-02-18

今天再用HAL库做简单的串口DMA发送时突然出现了一个小问题,感觉有点意思,以此记录;

一开始时再主程序中直接测试串口功能的, 如下发送:

HAL_UART_Transmit_DMA(&huart2, (uint8_t *)'AT+NAME=helloworld', strlen('AT+NAME=helloworld');

发送顺利,串口另一端的设备应答一切顺利,既然测试正常,就开始进行功能开发;于是再启动设备的时候准备 MCU 的UNIQUE ID修改一下名称,于是有了如下的 方法:

#define _NAME 'AT+NAME='

void SetName(void)

{undefined

        uint8_t str[48] = {0};

        sprintf((char *)str, '%sSimulator-%02X-%02X-%02X', _NAME, *((uint32_t *)0x1FFF7590), \
        *((uint32_t *)0x1FFF7594), *((uint32_t *)0x1FFF7598));

        HAL_UART_Transmit_DMA(&huart2, (uint8_t *)str, strlen(str));

}

于是奇怪的事情发生了,HAL_UART_Transmit_DMA调用一切正常,串口设备竟然没有回应,刚才测试的时候还是好的呢?

换上测试代码,重新测试,一切OK, 反复来回切换,确定了上面的代码有问题;于是跟踪了进去,发现HAL_UART_Transmit_DMA 接收的参数内容都正常, 一步步下来,突然发现了这么一句代码:

这就让我猜测 DMA发送应该是一种异步模式;跟踪进去感觉可能性就更明显了,这应该是跟DMA发送机制相关,明显我欠缺了一些基础,既然判定了原因,于是直接将局部变量 uint8_t str[48] = {0}; 设置为static,再重新编译运行,果然一切顺利;

一个小小的问题,反应了硬件与软件的结合,感觉有点意思,以此为记;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多