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

今天再用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)

{

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,再重新编译运行,果然一切顺利;

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

经验分享 程序员 微信小程序 职场和发展