STM32H7的D-Cache开启后,以太网DMA描述符必须配置为Non-Cacheable,否则CPU与DMA可能看到不一致的数据。推荐用MPU将描述符所在内存区(如0x30000000开始的SRAM)设为Non-Cacheable。步骤:1) 使能MPU并配置一个区域,基地址为描述符数组起始地址,大小覆盖所有描述符(如2KB),属性设为Normal, Non-Cacheable, Non-Shareable, 禁止指令访问。2) 在ETH初始化前调用HAL_MPU_Config()并启用MPU。3) 验证:用SCB_InvalidateDCache_by_Addr()无效化描述符区域,然后读取描述符状态,若与DMA写入一致则成功;也可用调试器查看内存,对比Cache开启前后。注意:描述符和缓冲区最好分开配置,缓冲区若也Non-Cacheable则无需手动维护Cache,否则需在DMA传输前后调用Clean/Invalidate。
mcuku 阿沐 · 2026-09-25