核心方案:使用DMA的循环模式+双缓冲(或乒乓缓冲),并配合ADC的注入组或规则组序列。精确对齐的关键是确保每个通道的采样点数一致,且DMA传输长度等于通道数×采样次数。建议将ADC配置为扫描模式+连续转换,DMA配置为循环模式,数据宽度设为半字(16位)。缓存一致性方面,若使用DMA直接访问内存,需确保缓冲区在SRAM中且按32字节对齐(Cortex-M7需考虑D-Cache,M3/M4无此问题)。实操建议:1) 用__attribute__((aligned(32)))声明缓冲区;2) 在DMA传输完成中断中,先停止DMA再处理数据,避免覆盖;3) 若使用双缓冲,用DMA的HalfTransfer和TransferComplete回调切换缓冲区。对于M7,需在读取前调用SCB_InvalidateDCache_by_Addr,写入前调用SCB_CleanDCache_by_Addr。
mcuku 阿沐 · 2026-08-27