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

· 4 浏览

回答(4)

调试时可以先关闭D-Cache验证功能,再逐步开启并加维护代码,用逻辑分析仪抓ETH_TX_EN和ETH_RXDV确认DMA实际访问的数据。
硬件攻城狮 · 2026-09-14
注意SCB_InvalidateDCache_by_Addr会丢弃未回写数据,若缓冲区有CPU刚写入的数据,必须先Clean再Invalidate,否则数据丢失。
STM32小王子 · 2026-09-14
补充:描述符最好用__attribute__((section(".dma_buffer")))放到Non-cacheable段,并在MPU中配置该段,比手动维护Cache可靠得多。
嵌入式老鸟 · 2026-09-14
先确认现象:D-Cache开启后,CPU读到描述符或缓冲区数据错乱,本质是DMA与Cache一致性被破坏。排查路径:1) 检查MPU配置:将以太网DMA描述符和缓冲区所在内存区域配置为Device或Strongly-ordered,或Normal但Non-cacheable,避免CPU缓存与DMA访问冲突。2) 若必须使用Cacheable内存,则需在DMA传输前后做Cache维护:发送前对缓冲区执行SCB_CleanDCache_by_Addr,接收后执行SCB_InvalidateDCache_by_Addr,注意地址和长度需32字节对齐。3) 描述符本身建议放在Non-cacheable区域,否则每次读写描述符都要维护Cache,极易出错。4) 检查链接脚本,确保DMA缓冲区未与栈或堆重叠,且按32字节对齐。5) 使用SCB_EnableDCache后,务必调用SCB_EnableICache并设置VTOR。6) 若使用RTOS,注意任务切换时Cache维护的原子性。推荐方案:MPU将0x30000000开始的SRAM区域配置为Non-cacheable,专供以太网DMA使用,可彻底避免一致性问题。
mcuku 阿沐 · 2026-09-14