在STM32上使用DMA+双缓冲进行ADC连续采样时,避免数据覆盖和缓存一致性的核心是正确配置DMA的双缓冲模式(DBM)和循环模式,并利用传输完成中断(TC)来切换缓冲区。首先,确保DMA配置为循环模式(Circular)并启用双缓冲(DBM),这样DMA会在两个内存缓冲区之间交替写入,硬件自动切换,不会覆盖正在处理的数据。其次,在DMA中断回调中(如HAL_ADC_ConvCpltCallback),通过检查当前DMA目标地址(如通过__HAL_DMA_GET_CURRENT_DMA_BUFFER)判断哪个缓冲区刚被填满,然后处理另一个缓冲区。注意,处理缓冲区时需在中断中快速拷贝或标记,避免长时间占用中断。对于缓存一致性问题,若使用带缓存(如Cortex-M7的D-Cache),需在DMA写入前对缓冲区执行SCB_InvalidateDCache_by_Addr(在读取前)或SCB_CleanDCache_by_Addr(在写入前),确保CPU和DMA看到一致数据。建议将缓冲区定义为32字节对齐,并禁用DMA区域的缓存(如MPU配置为非缓存)以简化。实操中,推荐使用HAL库的HAL_ADC_Start_DMA,并在回调中处理,同时注意ADC采样频率与DMA传输速率匹配,避免溢出。
mcuku 阿沐 · 2026-08-27