CubeMX Stm32 DMA circular(DMA 循环模式)的一个错误
CubeMX Version 6.4.0
问题
在使用定时器触发 ADC-DMA 时,发现 DMA 在在配置为循环模式后仍然只会被触发一次。
排查
在跟踪DMA寄存器时发现,HAL在初始化DMA时并没有将DMA正确初始化为循环模式,DMA Channel4 的配置寄存器CCR4的循环模式标志<bit CIRC>
在初始化后仍未0,CubeMX的配置貌似并没有被正确应用。
根据Debug跟踪到 HAL_DMA_Init
,发现该函数中设置CCR寄存器的语句 hdma->Instance->CCR = tmp;
根本就没起作用(该句被执行后CCR仍然为0),貌似这里有寄存器配置优先级问题。
根据该线索找到ST官方的说法。
原文:
Amel NASRI (Employee)
8 months ago
Hi @MMüll.5 (Customer) ,
Please check the order of the calls for HAL_ADC_Init() and HAL_DMA_Init().
In the generated code, make sure that HAL_DMA_Init() is called first, then HAL_ADC_Init().
-Amel
大概意思是应该最先初始化 DMA,然后再初始化ADC。
解决
解决很简单,只需将DMA初始化提前即可,在CubeMX中如下配置:
其它
- 我并没有找到关于这里是否有寄存器配置优先级的细节问题文档。
- 该问题在stmf32030和stm32f100上均遇到过。
- 该问题貌似跟adc无关,在我使用 timer + spi + dma 时仍然遇到过。