先分别讲单通道和多通道
单通道
首先是CubeMX中的配置
我这里选择的是ADC1的4号通道,异步时钟,不分频。有些同学这里可能无法选择不分频(by 1)或者(by 2)这是因为ADC有最大的时钟频率限制,比如12MHz等等。然后是最大位数是12位,即2的12次方。右对齐。其他默认就好
我这里使用了中断
代码部分
//首先是中断函数
uint32_t light_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc)
{
light_value = HAL_ADC_GetValue(&hadc1);
printf("light_value:%d\r\n",light_value);
}
//在主循环中开启中断就好
HAL_ADC_Start_IT(&hadc1);
多通道
CubeMX配置
我这里打开的是通道三和通道四
所以箭头所指数字为2
红色方框中通道3和通道4的排列顺序代表了采样的顺序
代码部分
//中断部分
uint32_t light_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc)
{
while( !(hadc1.Instance -> ISR & (1<<2)));
light_value = HAL_ADC_GetValue(&hadc1);
printf("light_value1:%d\r\n",light_value);
while( !(hadc1.Instance -> ISR & (1<<2)));
light_value = HAL_ADC_GetValue(&hadc1);
printf("light_value2:%d\r\n",light_value);
HAL_ADC_Stop(&hadc1);
}
//主函数中开启
HAL_ADC_Start_IT(&hadc1);
现在是DMA了
这里选择的是外设到内存,数据长度是16位(Half Word)
uint16_t adc_value[2] = {0};
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) adc_value, 2);//每次使用都要用这个函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc->Instance == ADC1)
{
printf("1:%d, 2:%d\r\n",adc_value[0],adc_value[1]);
}
}