在STM32F4的ADC连续采样中,使用DMA双缓冲的核心是确保数据在传输过程中不被覆盖,并满足缓存对齐要求。首先,配置DMA为循环模式并启用双缓冲(DBM位),设置两个缓冲区(如buf1和buf2),每个缓冲区大小需为ADC数据宽度的整数倍(例如16位采样时,缓冲区大小应为2的倍数)。为避免覆盖,需在DMA传输完成中断(TC)中切换当前目标缓冲区,并立即处理已满缓冲区数据,同时确保处理时间小于一个缓冲区的采样周期。对于缓存对齐,STM32F4的DMA要求缓冲区地址按4字节对齐(若使用FIFO或32位外设),建议使用__attribute__((aligned(4)))或定义在特定内存段(如D2 SRAM)。实操建议:1)初始化时设置DMA_Memory0BaseAddr和DMA_Memory1BaseAddr,并启用DMA_IT_TC;2)在中断中读取DMA_GetCurrentMemoryTarget()判断当前缓冲区,处理另一缓冲区;3)若使用HAL库,注意HAL_ADC_ConvCpltCallback中切换缓冲区,并避免在中断中做耗时操作。若采样率较高,可考虑使用乒乓缓冲+空闲中断(IDLE)或定时器触发,减少中断频率。
mcuku 阿沐 · 2026-08-27