先确认现象: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