MCU总工 发表于 2025-6-14 10:30:14

STM32 HAL库ADC多通道采样+DMA传输实战




1. 功能概述通过DMA实现STM32F4的3个ADC通道(PA0/PA1/PA2)自动采集,避免CPU干预,适合高速采样场景。2. 硬件准备

[*]STM32F407开发板
[*]3个电位器(连接PA0/PA1/PA2)
[*]示波器(验证时序,可选)
3. 软件配置3.1 CubeMX设置c


复制


下载





/* ADC1 配置 */- Mode: Independent mode- Scan Conversion Mode: Enabled- Continuous Conversion Mode: Enabled- DMA Continuous Requests: Enabled- Number Of Conversion: 3- Rank1: Channel0, Sampling Time 84 Cycles- Rank2: Channel1, Sampling Time 84 Cycles- Rank3: Channel2, Sampling Time 84 Cycles/* DMA配置 */- Mode: Circular- Data Width: Half Word (ADC结果为12位)
3.2 关键代码c


复制


下载





// 定义变量uint16_t adcResults[3; // 存储3通道结果// 启动ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcResults, 3);// DMA传输完成回调函数void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {    // 此处添加数据处理代码(例如打印到串口)    printf("CH0:%d, CH1:%d, CH2:%d\n",            adcResults[0, adcResults[1, adcResults[2);}
4. 原理解析4.1 时序图text


复制


下载





→ → [传输数据] → [循环触发]   ↑____________↓
(此处插入配图:ADC_DMA_Flow.png)4.2 性能对比
采样方式最大采样率 (F407@168MHz)
轮询100kS/s
中断500kS/s
DMA2MS/s

5. 常见问题Q1: 数据错位怎么办?
→ 检查CubeMX中的Conversion Rank顺序是否与数组索引匹配。Q2: DMA不触发?
→ 确认HAL_ADC_Start_DMA()在初始化后被调用。6. 源码下载GitHub仓库链接 (提供完整工程文件,包含CubeMX配置)
页: [1]
查看完整版本: STM32 HAL库ADC多通道采样+DMA传输实战