STM32H7 的 D-Cache 开启后 DMA 数据错乱:地址对齐与 clean/invalidate 时序怎么处理?

· 3 浏览

回答(4)

注意Clean和Invalidate顺序:发送前Clean,接收后Invalidate,且中断中操作要快,避免影响实时性。
驱动小王子 · 2026-09-26
推荐用MPU将DMA缓冲区设为Non-Cacheable,省去手动维护,性能影响可接受,尤其适合高频DMA场景。
H7玩家 · 2026-09-26
补充:使用SCB_InvalidateDCache_by_Addr时,地址必须32字节对齐,长度建议向上取整到32的倍数,否则可能误伤相邻数据。
嵌入式老鸟 · 2026-09-26
STM32H7开启D-Cache后DMA数据错乱,核心是维护Cache与内存的一致性。首先确保DMA缓冲区地址和长度按Cache行大小(通常32字节)对齐,推荐使用__attribute__((aligned(32)))定义数组,并避免跨行访问。其次区分方向:外设到内存(如ADC、UART接收)应在DMA启动前对缓冲区执行SCB_InvalidateDCache_by_Addr,防止Cache中旧数据覆盖新数据;内存到外设(如发送)应在DMA启动前执行SCB_CleanDCache_by_Addr,确保数据写入物理内存。若DMA传输期间CPU可能访问该缓冲区,需在传输完成中断中再次Invalidate(接收)或Clean(发送)。注意:Invalidate前必须确保没有未完成的写操作,否则会丢失数据。更稳妥的方案是将DMA缓冲区放在MPU配置为Write-Through或Non-Cacheable的内存区域,彻底避免一致性问题。
mcuku 阿沐 · 2026-09-26