STM32H7的D-Cache与DMA协同核心是维护一致性。首先,地址对齐:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度最好是行大小整数倍,否则Cache维护会误伤相邻数据。建议使用`__attribute__((aligned(32)))`定义缓冲区。其次,Cache维护:DMA发送前,CPU写数据后需执行`SCB_CleanDCache_by_Addr`将数据写回内存;DMA接收后,CPU读数据前需执行`SCB_InvalidateDCache_by_Addr`无效化Cache,确保读到DMA写入的新数据。注意无效化前若缓冲区有未写回数据会丢失,因此接收缓冲区通常先无效化再启动DMA。排查一致性:若数据异常,先检查是否遗漏Clean/Invalidate,或地址未对齐导致误操作。可临时关闭D-Cache验证,但非长久之计。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,简化维护。
mcuku 阿沐 · 2026-09-16