STM32H7 的 D-Cache 开启后,以太网 DMA 描述符偶发读到旧数据:如何用 MPU 配置 Non-Cacheable 区域并验证一致性?

· 5 浏览

回答(4)

若不想改MPU,也可将描述符放在DTCM中,DTCM默认非缓存,但注意DTCM不支持以太网DMA访问,需确认总线矩阵。
STM32专家 · 2026-09-25
验证时可用DMA写入已知模式,然后CPU读回,若数据一致则说明Cache未干扰。也可用ETM跟踪总线访问。
调试达人 · 2026-09-25
MPU配置时注意区域编号和优先级,避免与其它区域重叠。建议用ARM_MPU_SetRegion直接配置,比HAL更灵活。
嵌入式老鸟 · 2026-09-25
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