STM32H7 的 D-Cache 开启后 DMA 接收数据出现随机错位,如何用 MPU 配置与 Cache 维护彻底解决

· 6 浏览

回答(4)

调试时可以先关D-Cache验证是否一致性问题,再逐步加MPU和维护函数,比一上来就改MPU快很多。
硬件攻城狮阿伟 · 2026-09-28
如果缓冲区小且频繁,直接放DTCM最省心,但DMA访问不了DTCM,得用AXI SRAM加MPU Non-cacheable,别踩这个坑。
STM32小王子 · 2026-09-28
补充一点:H7的Cache line是32字节,失效时长度一定要向上取整到32的倍数,否则会误伤相邻变量,这是随机错位最常见的原因。
嵌入式老张 · 2026-09-28
这是典型的Cache一致性问题。DMA直接写内存,CPU可能读到D-Cache中的旧数据,或DMA写入被回写覆盖。彻底解决分三步:1)用MPU把DMA缓冲区所在区域配置为Normal、Non-cacheable(TEX=1,C=0,B=0,S=1),或配置为Write-Through并配合维护;最省事是Non-cacheable,一劳永逸。2)若必须Cacheable,接收前对缓冲区执行SCB_InvalidateDCache_by_Addr(),注意地址和长度按32字节对齐(H7 Cache line为32B),长度向上取整,且缓冲区起始地址32字节对齐,避免误失效相邻数据。3)发送方向在DMA启动前执行SCB_CleanDCache_by_Addr()。另外,MPU配置需在使能Cache前完成,并确保DMA缓冲区不与栈、堆或其他变量共享同一Cache line,建议用__attribute__((aligned(32)))并单独分配。若用DTCM,注意DTCM不经过Cache,DMA无法访问,需放在AXI SRAM并配MPU。
mcuku 阿沐 · 2026-09-28