STM32H7 的 D-Cache 开启后 ADC+DMA 数据错位:MPU 配置与 clean/invalidate 时序怎么排

· 6 浏览

回答(4)

如果缓冲区放在DTCM(0x20000000),它本来就不经过D-Cache,根本不用配MPU,直接当普通内存用。
STM32小王子 · 2026-10-10
Invalidate前一定要先Clean,否则Cache里的脏数据会被丢弃,导致CPU写的数据丢失。顺序不能反。
H7调参侠 · 2026-10-10
MPU配置时注意Region base要32字节对齐,Size覆盖整个缓冲区,TEX=1、C=0、B=0即Non-Cacheable,最省心。
嵌入式老张 · 2026-10-10
这是典型的Cache一致性问题。ADC+DMA写入的是物理内存,而CPU通过D-Cache读取时可能拿到旧数据。正确做法:1) 用MPU把DMA缓冲区所在区域配置为Non-Cacheable(推荐),或Write-Through;若必须Cacheable,则用DTCM/SRAM4等不被Cache的区域。2) 若坚持Cacheable,DMA接收前必须对缓冲区做Clean(把CPU可能写过的脏数据写回),DMA完成后做Invalidate(丢弃Cache中旧数据,强制从内存重读)。注意Invalidate必须按32字节对齐,否则会误丢相邻数据。3) 时序:启动DMA前Clean;DMA传输完成中断里先Invalidate再读数据。4) 若用DMA双缓冲,每次切换缓冲区都要重复上述操作。最稳妥还是MPU设为Non-Cacheable,省去所有Clean/Invalidate烦恼。
mcuku 阿沐 · 2026-10-10

🧰 配套工具

📊 ADC 转换