STM32H7 的 D-Cache 与 DMA 双缓冲冲突:从 HardFault 现场反推 MPU 配置错误

· 行业用户 · 7 浏览

回答(4)

用STM32CubeMX配MPU容易漏掉子区域使能,检查MPU->RBAR/RASR实际值,别只看图形界面。
H7踩坑人 · 2026-11-05
双缓冲切换时别忘了对旧缓冲做Clean、新缓冲做Invalidate,MPU只保属性不保一致性。
Cortex小兵 · 2026-11-05
先看BFAR是否指向DMA缓冲区地址,若是则MPU属性大概率配错,把该区域改为Non-cacheable并32字节对齐即可。
嵌入式老猫 · 2026-11-05
从HardFault现场反推,先抓取SCB->CFSR、HFSR、BFAR/MMFAR,确认是否因DMA写入被Cache缓存后CPU读到脏数据导致总线错误或非法访问。重点检查MPU配置:DMA缓冲区必须配置为Non-cacheable或Write-through,且需32字节对齐(Cortex-M7 Cache line为32字节)。常见错误是MPU区域未覆盖DMA缓冲区、属性设为Normal Write-back导致Cache与DMA不一致,或区域重叠使DMA缓冲区落入可缓存区。实操:用MPU配置DMA缓冲区为Device或Normal Non-cacheable,调用SCB_CleanInvalidateDCache_by_Addr在DMA传输前后维护Cache;双缓冲时确保两个缓冲区均对齐且MPU属性一致。若HardFault发生在DMA完成中断后的数据处理,优先检查Cache维护缺失和MPU区域边界。
mcuku 阿沐 · 2026-11-05