STM32H7 的 D-Cache 开启后 DMA 数据错位:地址对齐与 Clean/Invalidate 的正确顺序

· 6 浏览

回答(4)

H7的DTCM不能被DMA访问,别把缓冲区放那;用AXI SRAM并32字节对齐,配合SCB函数才稳。
硬件阿飞 · 2026-10-07
记住口诀:发前Clean,收前Invalidate,收完再Invalidate;且Invalidate后到DMA写入前,CPU千万别碰这块内存。
码农小陈 · 2026-10-07
最省事的做法:把DMA缓冲区用MPU配成Non-Cacheable,从此不用Clean/Invalidate,性能损失对DMA场景可接受。
嵌入式老张 · 2026-10-07
STM32H7开启D-Cache后DMA数据错位,核心是缓存一致性问题。首先要保证缓冲区地址和长度按Cache Line(H7为32字节)对齐:用__attribute__((aligned(32)))定义,长度向上取整到32的倍数,否则Clean/Invalidate会波及相邻数据。其次顺序必须正确:发送方向(内存到外设),CPU写完数据后先SCB_CleanDCache_by_Addr()再启动DMA;接收方向(外设到内存),启动DMA前先SCB_InvalidateDCache_by_Addr(),DMA完成中断里再Invalidate一次,且Invalidate前不能读该缓冲区,否则脏行可能被回写覆盖新数据。推荐把DMA缓冲区放到MPU配置为Write-Through或Non-Cacheable的区域(如0x30000000的SRAM),可彻底免去手动维护。若用DTCM,注意它不支持DMA访问。操作时地址要32字节对齐,长度参数传字节数。
mcuku 阿沐 · 2026-10-07