STM32 HAL UART DMA不通的问题解决及注意事项
原文链接 https://blog.csdn.net/hwytree/article/details/121659787
STM32 HAL UART DMA不通的问题解决及注意事项
在运行STM32CUBIDE生成的工程时,UART DMA不工作,其原因是软件生成工程文件的一个准“bug’。
问题起源
在用STM32CUBEIDE(或STM32CUBEMX)生成的工程,采用DMA方式接收或发送都无反应。如下面的UART1的DMA发送代码:
while (1)
{
HAL_UART_Transmit_DMA(&huart1, UART1_RX, 4);
HAL_Delay(1000);
}
在调整了DMA通道,DAM中断以及去掉其它DMA等各种设计部分,然并…没有起作用。
然后对软件自动生成的代码部分进行调整测试,找到了原因。
问题原因
在STM32CUBEIDE配置环境,如果对UART进行第一次配置时,就选择了DMA的配置,则生成的相关代码为:
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
这样的情况,DMA是运行正常的。
而如果,一开始没有配置DMA,则代码是这样的:
MX_GPIO_Init();
MX_USART1_UART_Init();
然后后来想用启用DMA功能,再增加配置DMA,代码是这样的:
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_DMA_Init();
然后这样生成的代码,DMA不工作!
对比DMA正常和不正常的代码,可以发现DMA初始化部分代码需要放在UART初始化代码之前,而STM32CUBEIDE当前的软件版本,在先配置UART后,再增加配置DMA,会将新增加DMA的初始化放在后面, 由于其库的初始化配合顺序问题,就导致DMA不工作。
注意事项
由此案例可知,通过STM32CUBEIDE或STM32CUBEMX配置生成有DMA的代码时,需要注意DMA初始化部分和接口初始化部分的顺序关系,避免出现DMA不工作的情况发生。当然,以后软件版本可能会修正这个”bug"。