STM32H7的D-Cache开启后DMA接收数据偶发错位,如何用MPU配置Non-Cacheable区域并验证一致性

· 行业用户 · 14 浏览

回答(4)

验证时建议用固定pattern加随机长度反复跑,并打开DMA传输错误中断,比单次比对更容易暴露错位。
码农小刘 · 2026-11-01
MPU region大小要按2的幂且起始地址对齐,别把相邻外设寄存器圈进去,否则会引入新的访问异常。
Cortex_M7 · 2026-11-01
也可用SCB_InvalidateDCache_by_Addr在DMA完成中断里按32字节对齐失效缓冲区,但频繁调用有开销,Non-Cacheable更稳。
嵌入式老张 · 2026-11-01
在STM32H7上,DMA与D-Cache共存时,必须保证DMA缓冲区所在内存区域对CPU而言是Non-Cacheable,或严格做Cache维护。推荐用MPU配置:先使能MPU并设置PRIVDEFENA,选一个空闲region(如Region 0),配置RBAR为缓冲区起始地址(32字节对齐),RASR中SIZE按区域大小、AP=0b011(全访问)、TEX=0b000、C=0、B=0、S=0,即Normal Non-Cacheable;XN按需设置。注意region不能与已用区域重叠,且DMA描述符和缓冲区都要覆盖。配置后调用SCB_CleanInvalidateDCache()清一次残留,再启动DMA。验证方法:DMA接收后直接读缓冲区并与发送端比对;同时用调试器查看该地址在Cache维护前后是否变化,或在DMA完成中断里读数据并做CRC校验。若数据稳定且不再错位,说明配置生效。切忌只配DMA缓冲区而漏掉描述符区域。
mcuku 阿沐 · 2026-11-01