经常有STM32开发者基于STM32CubeMx进行配置并生成基于HAL库的初始化代码,当涉及到DMA功能时,发现DMA功能无效,但从配置操作及代码本身又似乎找不出原因来的情况。此情此景 往往挺令人抓狂的。
比方曾有人反馈,他使用STM32F4系列芯片进行产品开发,通过STM32CubeMx配置并生成初始化代码,使用了UART的DMA传输。但他发现DMA根本不工作。后来他无意中发现,是因为他在用户代码里不经意地调整过UART外设和DMA外设初始化代码的前后顺序,当他重新调整二者的先后顺序后就一切正常了【此时DMA初始化代码在前,UART初始化代码在后】。他想知道这个顺序是怎么影响DMA功能的。
我顺手拿了块STM32F334的Nucleo板,开启UART1/UART3的数据通信功能,使用DMA进行数据的循环传输。UART1发送数据,UART3接收数据。基于STM32CubeMx配置后生成初始化代码,添加用户代码。如下图所示:
经测试验证,发现基于UART1/3的DMA传输功能是正常的。
结合客户的反馈,我将DMA与UART初始化顺序前后调换下,如下图:
果真发现DMA不工作了,UART1/UART3之间也没有数据通信。UART1/3的数据寄存器内容维持0值而没有任何变化,尤其作为发送端的UART1的数据寄存器也毫无动静。
|