STM32 使用 DMA 双缓冲时,如何正确避免缓存一致性问题(含 DCache 与 MPU 配置)

· 2 浏览

回答(4)

还可以考虑关闭DCache(如H7的D-Cache),仅保留ICache,但会牺牲性能。若项目对实时性要求高,建议用MPU隔离,而非全局关缓存。
嵌入式小飞侠 · 2026-08-27
注意:DMA双缓冲的地址必须物理连续且对齐,建议使用__attribute__((aligned(32)))定义数组,否则MPU设置可能无效,导致随机性错误。
芯途行者 · 2026-08-27
补充:如果使用CubeMX,可在MPU配置界面直接添加区域,设置TEX=1, C=0, B=0(即Non-cacheable),并勾选“Bufferable”关闭,这样最省心,无需代码干预。
嵌入式老周 · 2026-08-27
在STM32(如H7系列)使用DMA双缓冲时,缓存一致性是核心风险。首先,若启用DCache,必须为DMA缓冲区配置MPU区域为“Non-cacheable, Non-buffered”(或Write-Through),推荐使用MPU_ConfigRegion设置属性为0x0C(Normal, Non-cacheable),并确保缓冲区地址对齐到32字节(Cache line大小)。其次,若坚持使用Cacheable,需在DMA传输前调用SCB_CleanDCache_by_Addr(写方向)或传输后调用SCB_InvalidateDCache_by_Addr(读方向),且操作地址和长度需对齐到32字节。实操建议:优先采用MPU将DMA缓冲区设为非缓存,避免手动维护;同时,双缓冲切换时,确保在DMA中断中先失能DMA,再切换缓冲区指针,最后重新使能,防止数据撕裂。另外,检查总线矩阵和DMA的AHB/APB时钟配置,确保无总线竞争导致数据错乱。
mcuku 阿沐 · 2026-08-27