首先确认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