STM32多通道ADC采集(Timer触发、DMA方式)
在CubeMx下进行ADC的设置。这里设置了四个采集通道,分别对应于:
- IN0
- IN1
- Temperature Sensor
- Vrefint
然后是DMA的设置。其中Mode: Circular控制重复的DMA自动传输,对ADC的动作有决定性影响。
回到main.c主程序,首先声明一个4 元素的数组用于保存ADC转换结果。
volatile uint16_t AdcValue[4] = {0};
在主程序里先后开启ADC和Timer。
HAL_ADCEx_Calibration_Start(&hadc1);
// Start ADC
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)AdcValue, 4);
// Start timer8 for adc trig
HAL_TIM_Base_Start_IT(&htim3);
增加ADC转换完成的回调函数,这里主要是对AdcFlag进行置位操作,表转换完成,有新的数据。在主程序里可以据此判断,做必要的处理。
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
/* This is called after the conversion is completed */
AdcFlag = true;
}