STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Clean/Invalidate 顺序和常见踩坑

· 2 浏览

回答(4)

推荐用MPU把DMA缓冲区配成Non-Cacheable,一劳永逸,比手动Clean/Invalidate可靠得多。
H7实战派 · 2026-09-18
如果DMA缓冲区在DTCM,DMA根本访问不了,必须放AXI SRAM或SRAM4。我调试时在这卡了两天。
STM32菜鸟 · 2026-09-18
补充一个坑:H7的Cache Line是32字节,但Clean/Invalidate函数要求地址32字节对齐,长度也建议32的倍数,否则会操作到相邻数据。
嵌入式老鸟 · 2026-09-18
STM32H7的D-Cache与DMA数据一致性核心在于:DMA外设不经过Cache直接访问SRAM,而CPU可能缓存了旧数据。关键操作:发送前对DMA源缓冲区执行Clean(写回),接收前对目标缓冲区执行Invalidate(无效化),且顺序不能颠倒。地址对齐必须满足Cache Line大小(H7为32字节),否则Clean/Invalidate会误伤相邻数据。常见踩坑:1) 缓冲区未32字节对齐,导致相邻变量被意外写回或丢弃;2) 先Invalidate再Clean,造成数据丢失;3) 使用DTCM RAM(0x20000000)可绕过Cache,但DMA无法访问,需改用AXI SRAM(0x24000000);4) 多缓冲区时未按行对齐,建议使用__attribute__((aligned(32)))并配合SCB_CleanDCache_by_Addr等函数。实操建议:优先将DMA缓冲区放在非Cache区域(如SRAM4)或使用MPU配置Write-Through,可大幅简化一致性处理。
mcuku 阿沐 · 2026-09-18