蘑
菇
助手
MCU助手 · 单片机工具箱
登录
注册
🏠
首页
🧰
工具
📖
文库
❓
问答
✍️
提问
🏠
首页
/
问答
/
问题
STM32H7 的 Cache 与 DMA 一致性:MPU 配置和 Clean/Invalidate 的实战避坑
STM32 ·
于洁测硬件
· 90 浏览
回答(4)
用SCB_InvalidateDCache_by_Addr时,地址和长度必须32字节对齐,否则会误伤相邻数据。
Cache踩坑人
· 2026-09-19
Clean和Invalidate顺序不能反:发送前Clean,接收后Invalidate,否则数据会丢。
STM32小王子
· 2026-09-19
MPU配置Non-Cacheable最省心,但注意TEX=1,C=0,B=0或TEX=0,C=0,B=1,别配成Write-Back。
嵌入式老鸟
· 2026-09-19
★ 精华
STM32H7的Cache与DMA一致性核心是:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。实战避坑:1) 将DMA缓冲区放在MPU配置为Non-Cacheable或Write-Through的内存区(如0x30000000),一劳永逸避免一致性问题,但会牺牲性能。2) 若必须用Cacheable内存,发送前对缓冲区执行Clean(写回),接收后执行Invalidate(无效化),注意顺序:先Clean再启动DMA发送;接收完成后再Invalidate。3) 严禁对同一缓冲区同时Clean和Invalidate,且Invalidate前确保CPU未访问该区域,否则可能丢失未写回数据。4) 使用SCB_CleanDCache_by_Addr等函数时地址需32字节对齐,长度向上取整。5) 中断中避免频繁Clean/Invalidate,可改用双缓冲或MPU配置。推荐优先用MPU将DMA区设为Non-Cacheable,简单可靠。
田甜单片机教学
· 2026-09-19
提交回答
📚 相关文库
ESP32 UART不定长帧接收:DMA+空闲中断与零拷贝环形缓冲设计
STM32 HAL库ADC多通道DMA扫描模式:采样时序配置与数据错位排查实战
STM32 HAL库中__weak函数被用户重定义后链接顺序导致的静默失效排查
STM32 HAL库中HAL_Delay在中断上下文里失效的根因与三种替代延时方案
STM32 HAL库中__weak函数重写后中断仍进默认死循环的链接脚本排查
❓ 更多问答
STM32F103C8T6跑485半双工老丢帧,快被搞疯了
示波器抓SPI波形全是毛刺,24位ADC读数跳得离谱,快被逼疯了
STM32H743跑RTOS跑着跑着就死机,有没有大佬遇到过
NB-IoT模组半夜批量掉网,电表项目要验收了,急死了
STM32H7的DMA双缓冲模式在串口不定长接收中的配置与半传输中断踩坑记录