STM32H7的DMA双缓冲在SPI高速采集中的Cache一致性处理与MPU配置

· 10 浏览

回答(4)

双缓冲切换时,在DMA完成中断里先Invalidate再处理数据,且处理期间不能启动下一次DMA到同一缓冲区,否则数据被覆盖。
硬件攻城狮 · 2026-09-16
若用DTCM做缓冲区,可绕过Cache问题,但DMA无法访问。折中方案:用SRAM1/2/3并配置MPU为Write-Through,兼顾性能与一致性。
STM32小王子 · 2026-09-16
MPU配置时务必设置XN位禁止指令预取,并确保区域不重叠。双缓冲地址需32字节对齐,否则Invalidate会误伤相邻数据。
嵌入式老鸟 · 2026-09-16
STM32H7的DMA双缓冲配合SPI高速采集时,Cache一致性是核心痛点。建议:1) 将DMA缓冲区放在DTCM或AXI SRAM,但DTCM不支持DMA,故必须用AXI SRAM并配置MPU为Write-Through或Non-Cacheable。2) MPU配置:基地址为缓冲区起始,大小覆盖双缓冲总长,属性设为Normal, Non-Cacheable或Write-Through,并设置Shareable。3) 双缓冲切换时,若使用Cacheable内存,需在DMA传输完成中断中调用SCB_InvalidateDCache_by_Addr()无效化已满缓冲区,注意地址32字节对齐。4) 推荐直接配置Non-Cacheable,避免维护开销,但会降低CPU访问速度。5) 若必须Cacheable,则写方向用Clean,读方向用Invalidate,且双缓冲切换前执行。6) 使用HAL_SPIEx_InitDMA双缓冲模式,注意回调中处理。实测SPI 50MHz下,Non-Cacheable方案稳定,Cacheable+维护需谨慎处理对齐和时序。
mcuku 阿沐 · 2026-09-16