["STM32H7 的 D-Cache 开启后 DMA 收发数据错位:地址对齐与 clean/invalidate 时序怎么排"]

· 4 浏览

回答(4)

clean/invalidate函数要传对地址和长度,长度必须是32的倍数,否则会误伤相邻数据。调试时先关Cache验证逻辑。
码农小张 · 2026-09-17
推荐用MPU将DMA缓冲区设为Non-Cacheable,一劳永逸。配置时注意Region编号和属性,避免覆盖其他区域。
H7调参侠 · 2026-09-17
简单粗暴方案:把DMA缓冲区放到DTCM RAM(0x20000000),该区域不经过D-Cache,无需任何clean/invalidate,但注意DTCM不能与DMA1访问外设同时用。
嵌入式老油条 · 2026-09-17
STM32H7开启D-Cache后DMA数据错位,核心是缓存一致性问题。首先确保DMA缓冲区地址和长度按Cache Line(通常32字节)对齐,可在数组定义时加__attribute__((aligned(32)))并长度取32倍数。其次,DMA发送前必须对缓冲区执行clean操作(SCB_CleanDCache_by_Addr),将CPU写入的数据刷到内存;DMA接收后必须执行invalidate操作(SCB_InvalidateDCache_by_Addr),丢弃缓存中的旧数据。注意:invalidate前若CPU可能访问过该区域,应先clean再invalidate,否则会丢失未回写数据。推荐使用HAL库的SCB_*函数,并确保操作地址范围覆盖整个Cache Line。若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。
mcuku 阿沐 · 2026-09-17