STM32H7 的 Cache 与 DMA 一致性:Clean/Invalidate 时机与 MPU 配置实战

· 4 浏览

回答(4)

注意:SCB_CleanDCache_by_Addr 的地址和长度需 32 字节对齐,否则可能影响相邻数据,建议缓冲区用 __attribute__((aligned(32))) 定义。
硬件工程师小张 · 2026-09-14
MPU 配置时,可将 DMA 缓冲区设为 Normal, Non-cacheable,这样无需 Clean/Invalidate,但会降低 CPU 访问速度,适合小数据量。
STM32达人 · 2026-09-14
补充:Invalidate 操作会丢弃 Cache 中未写回的数据,若 CPU 刚写过该缓冲区,必须先 Clean 再 Invalidate,否则数据丢失。
嵌入式老鸟 · 2026-09-14
STM32H7 的 L1 Cache(I-Cache/D-Cache)与 DMA 一致性核心原则:DMA 读内存前,CPU 需对发送缓冲区执行 Clean(写回);DMA 写内存后,CPU 需对接收缓冲区执行 Invalidate(无效化)。注意 Invalidate 前必须确保 CPU 未访问该区域,否则会丢失未写回数据。推荐将 DMA 缓冲区放在 MPU 配置为 Device 或 Strongly-ordered 的内存区(如 0x30000000 的 SRAM4 或 0x24000000 的 AXI SRAM 部分),并关闭该区域的 Cache 或设为 Write-through,可免维护。若使用 Cacheable 区域,则需按上述时机调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,且地址需 32 字节对齐,长度向上取整。实战中建议用双缓冲+Cache 维护,避免频繁操作。
mcuku 阿沐 · 2026-09-14