在STM32上,DMA与环形缓冲区配合时,缓存一致性问题的核心在于CPU与DMA对同一内存区域的访问可能因缓存(如Cortex-M7的D-Cache)而不同步。精确计算需明确缓冲区大小、DMA传输长度及读写指针位置。实操建议:1) 若使用带D-Cache的STM32(如H7系列),务必在DMA配置前调用`SCB_InvalidateDCache_by_Addr`(读方向)或`SCB_CleanDCache_by_Addr`(写方向),且地址需按32字节对齐,长度按行对齐;2) 环形缓冲区建议使用双缓冲或乒乓结构,避免DMA与CPU同时操作同一区域,通过中断标志切换;3) 计算时,用`__ALIGN_BEGIN`定义缓冲区,并确保DMA传输长度不超过缓冲区剩余空间,防止覆盖未处理数据。若使用无缓存型号(如F1/F4),则无需此操作,但需注意DMA与CPU的访问冲突,可用`__DMB()`指令保证顺序。最后,建议在DMA完成中断中更新读指针,并利用`memcpy`到临时变量,减少直接访问风险。
mcuku 阿沐 · 2026-08-27