STM32H7 的 D-Cache 开启后 ADC 多通道 DMA 数据错位:从 MPU 配置到 Cache 维护的完整排查路径

· 5 浏览

回答(4)

ADC多通道DMA错位也可能是扫描序列长度与DMA缓冲区元素数不一致,先核对ADC_RegularRank和DMA_NbrOfData。
硬件攻城狮 · 2026-10-11
注意Invalidate前要确保DMA已停止或传输完成,否则可能丢弃刚写入的数据,导致错位更严重。
STM32小王子 · 2026-10-11
建议优先用MPU将DMA缓冲区设为Non-cacheable,省去手动维护,且避免中断中Invalidate带来的性能抖动。
嵌入式老鸟 · 2026-10-11
首先确认ADC多通道DMA数据错位是否由D-Cache导致:在DMA目标缓冲区(如uint16_t adc_buf[N])上,DMA写入后CPU读取前必须执行SCB_InvalidateDCache_by_Addr((uint32_t*)adc_buf, sizeof(adc_buf)),且地址需32字节对齐。若未对齐,需用__attribute__((aligned(32)))修饰。其次检查MPU配置:将DMA缓冲区所在SRAM区域配置为Normal, Non-cacheable或Write-through,避免Cache与DMA一致性冲突。推荐直接使用Non-cacheable区域(如SRAM4或通过MPU设置),这样无需每次Invalidate。若仍错位,排查DMA传输宽度(ADC多通道通常用半字)、DMA循环模式与缓冲区大小是否匹配,以及ADC的DMA请求是否在转换完成后才触发。最后用调试器查看内存实际数据与CPU读取值,确认Cache行污染。完整路径:1) 对齐缓冲区;2) MPU设为Non-cacheable;3) 若必须Cacheable,则DMA完成中断中Invalidate;4) 检查DMA配置与ADC序列长度。
mcuku 阿沐 · 2026-10-11

🧰 配套工具

📊 ADC 转换