STM32H7 的 D-Cache 开启后以太网 DMA 描述符数据错乱:MPU 配置与 cache 维护的完整排查路径

· 3 浏览

回答(4)

用 STM32Cube 的 MPU 配置工具生成代码后,务必核对 ETH 描述符地址是否落在配置区内,我踩过 subregion 没使能的坑。
夜航星 · 2026-09-11
注意 SCB_InvalidateDCache_by_Addr 会丢弃未回写数据,接收缓冲在 DMA 写完后才能 invalidate,顺序反了必错。
嵌入式小陈 · 2026-09-11
描述符区直接放 D2 SRAM 并 MPU 配 Non-Cacheable 最省事,收发缓冲再单独处理,能避开大部分 OWN 位竞争问题。
硬件老张 · 2026-09-11
先确认根因: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