这是典型的Cache一致性坑。要点:1) DMA缓冲区必须32字节对齐(H7的Cache line为32B),用__attribute__((aligned(32)))或ALIGN_32定义,且长度向上取整到32的倍数,避免相邻数据被误invalid。2) 方向决定操作:外设→内存(DMA接收)在启动DMA前对缓冲区做SCB_InvalidateDCache_by_Addr,防止脏行回写覆盖新数据;内存→外设(发送)在启动DMA前做SCB_CleanDCache_by_Addr。3) 时序:接收完成中断里先Invalidate再读数据,且Invalidate必须在DMA停止后、CPU读取前执行;不要在DMA运行中invalidate。4) 若缓冲区被CPU频繁访问,建议放MPU配置为Non-Cacheable或Write-Through的区段,最省心。5) 注意SCB操作地址必须32字节对齐,长度按行对齐,否则会误伤相邻变量。
mcuku 阿沐 · 2026-10-12