为何STM32CubeIDE中初始化调用顺序会影响UART DMA功能正常运行?
问题解答
问题1:初始化顺序错误是操作问题还是CubeMX本身的bug
默认配置下该问题属于对应版本STM32CubeMX的已知bug,不属于你的操作或配置疏漏,你可以做简单自查确认:如果没有在CubeMX的「Project Manager」→「Advanced Settings」页手动调整过初始化函数的调用顺序,就可以完全确认是CubeMX的生成逻辑问题。
你使用的CubeIDE 1.7.0内置的CubeMX版本针对STM32H7系列的外设+DMA初始化依赖逻辑存在缺陷,会错误将DMA初始化放在关联外设初始化之后生成,同类问题也会出现在SPI、ADC等需要用到DMA的外设配置中。
问题2:初始化调用顺序影响功能的原因
STM32 HAL库的外设初始化逻辑决定了DMA必须先于关联外设完成初始化:
- 当你在CubeMX中开启UART的DMA接收/发送功能后,
HAL_UART_Init()函数内部会自动尝试关联对应DMA通道的句柄,完成DMA请求和外设的映射绑定 - 若先调用
MX_USARTx_UART_Init()、后调用MX_DMA_Init():UART初始化时DMA的句柄、控制寄存器、地址配置全部为默认的0值,绑定的是无效的DMA配置,后续调用HAL_UART_Receive_DMA()时,DMA传输无法正确将接收到的数据写入指定缓存区,你读取到的缓存值自然全为0 - 若先调用
MX_DMA_Init()、后调用MX_USARTx_UART_Init():DMA通道的所有配置已经生效,UART初始化时可以正确完成和DMA通道的绑定,后续DMA传输逻辑可以正常运行
规避方案
- 临时方案:每次CubeMX生成代码后,手动调整
main()函数中初始化函数的顺序,保证所有DMA初始化调用都在关联的外设初始化调用之前 - 永久方案:升级到最新版本的STM32CubeIDE,新版本的CubeMX已经修复了该类初始化顺序生成的缺陷
内容的提问来源于stack exchange,提问作者adlibber
相关产品推荐
相关产品推荐

