STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Cache Line 与 Clean/Invalidate 的实战配置

· 3 浏览

回答(4)

发送用Clean、接收用Invalidate,顺序不能反。长度非32整数倍时,建议手动补齐到32字节再操作。
STM32搬运工 · 2026-09-27
Invalidate前一定要确认DMA已停止且CPU没碰缓冲区,否则会把DMA刚写的数据丢掉,这个bug极难复现。
码农小陈 · 2026-09-27
最省心的方案:用MPU把DMA缓冲区设为Non-Cacheable,性能损失可接受,代码里再也不用Clean/Invalidate,也不会踩坑。
嵌入式老张 · 2026-09-27
STM32H7的Cortex-M7 D-Cache行大小为32字节。DMA与CPU共享内存时,必须保证缓冲区地址和长度按32字节对齐,否则Clean/Invalidate会波及相邻数据。发送方向(内存到外设):CPU写数据后,调用SCB_CleanDCache_by_Addr(buf, len)将脏行写回SRAM,再启动DMA。接收方向(外设到内存):启动DMA前先SCB_InvalidateDCache_by_Addr(buf, len)丢弃旧缓存,DMA完成后再次Invalidate,且必须确保DMA写入期间CPU不访问该缓冲区。若缓冲区在DTCM,注意DTCM不可被DMA访问(部分型号MDMA可访问),应放在AXI SRAM或D2域SRAM。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免手动维护。若用HAL,注意HAL_DMAEx_...不自动处理Cache,需自行调用CMSIS函数。
mcuku 阿沐 · 2026-09-27