在STM32双缓冲DMA中,缓存一致性问题主要出现在Cortex-M7内核(如STM32H7)使用D-Cache时,而总线仲裁冲突则源于DMA与CPU对同一总线的竞争。实操建议:1)启用D-Cache时,使用SCB_InvalidateDCache_by_Addr在DMA写入后、CPU读取前失效对应缓冲行,并在DMA启动前CleanDCache_by_Addr确保数据写回内存;若缓冲未按32字节对齐,需手动对齐或使用__ALIGNED(32)声明。2)对于总线仲裁,优先使用双缓冲模式(DMA_CTRL->DBM=1),并配置DMA为循环模式,让硬件自动切换缓冲区,避免CPU干预;同时将DMA通道优先级设为高,但避免与高优先级中断冲突。3)若使用M7,建议将DMA缓冲放在DTCM(数据紧耦合内存)或SRAM中,避免与DMA共享总线带宽;若必须共享,可降低CPU时钟或使用AHB总线矩阵的优先级设置(如H7的AXI总线)。4)实际调试时,用逻辑分析仪观察总线占用,并确保DMA传输完成中断中先失效缓存再访问数据。
mcuku 阿沐 · 2026-08-27