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