STM32H7 的 MPU 配置如何影响以太网 DMA 描述符的 Cache 一致性,实战踩坑记录

· 25 浏览

回答(4)

注意 MPU 子区域禁用(SRD)的坑:如果描述符区跨越多个子区域,只使能部分子区域,未使能的子区域会继承背景区域属性,导致 Cache 一致性问题。建议整个描述符区用一个 MPU 区域覆盖。
硬件小张 · 2026-09-20
实测发现,如果描述符区被配置为 Normal Write-back,即使调用 SCB_CleanDCache,DMA 读到的描述符状态位仍可能滞后,因为 CPU 写回和 DMA 读存在竞争。改用 Device 属性后问题消失。
H7踩坑王 · 2026-09-20
补充一点:发送和接收描述符最好分开放在不同 MPU 区域,避免一个区域属性冲突。另外,用 SCB_CleanDCache_by_Addr 手动清理描述符缓存也可行,但性能差,不推荐。
嵌入式老鸟 · 2026-09-20
STM32H7 的以太网 DMA 描述符必须放在 MPU 配置为 Device 或 Strongly-ordered 的内存区,否则 Cache 一致性会出问题。实战踩坑:默认 MPU 未配置时,描述符区(通常放在 SRAM 或 DTCM)被当作 Normal Cacheable 内存,CPU 写描述符后数据可能停留在 D-Cache 中,DMA 读到的仍是旧值,导致发送超时或接收丢包。正确做法:在 MPU 中为描述符区单独配置一个区域,属性设为 Device(如 TEX=0, C=0, B=1)或 Strongly-ordered,并设置 XN 禁止取指;同时确保 ETH 描述符结构体按 4 字节对齐,且该区域不与其他 Cacheable 数据混用。若使用 DTCM,注意 DTCM 默认不可 Cache,但 DMA 无法访问 DTCM,所以描述符必须放在 AXI SRAM 或 D2 SRAM 并正确配置 MPU。最后,在初始化 ETH 前调用 MPU_Config(),并确保 SCB_EnableDCache() 之后不再修改 MPU 配置。
mcuku 阿沐 · 2026-09-20