先确认根因:H7 的 D-Cache 与以太网 DMA 共享 SRAM 时,若描述符/缓冲区所在区域被配置为 Cacheable 且未做维护,CPU 写入可能停留在 cache 未回写,DMA 读到旧数据;DMA 写入后 CPU 又可能读到 cache 中的旧行。排查步骤:1) 用 MPU 将 ETH 描述符和收发缓冲区所在 SRAM 区(如 0x30040000 起的 D2 SRAM)配为 Non-Cacheable,或配为 Write-Through 并严格维护;2) 若必须 Cacheable,发送前对缓冲区执行 SCB_CleanDCache_by_Addr,接收后执行 SCB_InvalidateDCache_by_Addr,注意地址 32 字节对齐、长度按 cache line 向上取整;3) 描述符本身建议放 Non-Cacheable 区,避免每次改 OWN 位都要维护;4) 检查 MPU 区域是否覆盖到 ETH RAM,优先级和 subregion 是否正确,别被默认背景区覆盖;5) 确认 ETH 使用 AXI SRAM 时与 CPU 访问的 cache 属性一致。最后用调试器读 DMA 实际内存与 CPU 视角对比验证。
mcuku 阿沐 · 2026-09-11