首先自然是查看这两个初始化代码内容,试图找到蛛丝马迹。很遗憾,并未很快发现原
因。当再次查看 DMA 初始化函数 MX_DMA_Init();的具体内容时,发现其代码其实很简
单,就两个动作,几行代码而已:
一个开启 DMA 外设的时钟,另一个动作就是使能 DMA 相关的中断矢量控制。
既然这样,我尝试将该 DMA 初始化函数体位置依然放在 UART 初始化代码的后面, 但将
DMA 初始化函数里的那句开启 DMA 外设时钟的代码提取出来,并移到 UART 初始化代
码之前,据此进行验证。这次,结果又一切正常了。
也就是说,基于现有初始化代码,这个 DMA 时钟的开启要放在 UART 初始化代码之前,
那是为什么呢?感觉 UART 的配置跟 DMA 时钟并没有啥关系啊。
再回头细看 UART 的初始化代码,在 UART 初始化函数的一个子函数
HAL_UART_MspInit()那里发现了端倪。
MX_USART1_UART_Init()==》 HAL_UART_Init()==》 HAL_UART_MspInit();
因为我们开启了跟 UART 传输事件相关的 DMA 功能,在 UART_MspInit();函数里不仅有
对与 UART 相关的 GPIO 的复用功能配置,还有跟 UART 事件有关的 DMA 配置。看来
UART 的初始化还是跟 DMA 有关联的。 【见如下截图】
|