APM32F030中12 位精度的 ADC,共 18 个通道, 16 个外部通道和 2 个内部通道, 各通道 A/D转换模式有单次、连续和断续, ADC 转换结果可以左对齐或右对齐存储在 16 位数据寄存器中。stm32F030的程序可以用在APM32F030上。
 
  因需要要采集PC0和PC1两个引脚的AD值,对应于ADC_CHANNEL_10和ADC_CHANNEL_11,再调试过程中发现单独采集一个通道的值都是好的,然而采集两个通道时两个通道的值每次都差不多,将一个引脚直接拉低,采集到的两个通道值都为0,显然这是不对的,在网上查看一下资料后,发现要在获取值的时要加入ADC->CHSEL = (uint32_t)ch;  //这个非常重要,没有这句无法正常获取多通道的AD值。在此记录一下 
 
void ADCInit(void)
{
    GPIO_Config_T gpioConfig;
    ADC_Config_T  adcConfig;
 
    /** RCM Enable*/
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOC);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
    /** GPIO Configuration */
    gpioConfig.pin = GPIO_PIN_0;
    gpioConfig.mode = GPIO_MODE_AN;
    gpioConfig.pupd = GPIO_PUPD_NO;
    GPIO_Config(GPIOC, &gpioConfig);
 
    gpioConfig.pin = GPIO_PIN_1;
    gpioConfig.mode = GPIO_MODE_AN;
    gpioConfig.pupd = GPIO_PUPD_NO;
    GPIO_Config(GPIOC, &gpioConfig); 
    /** ADC Configuration */
    ADC_Reset();
    ADC_ConfigStructInit(&adcConfig);
    /** Set resolution*/
    adcConfig.resolution = ADC_RESOLUTION_12B;
    /** Set dataAlign*/
    adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
    /** Set scanDir*/
    adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
    /** Set convMode continous*/
    adcConfig.convMode   = ADC_CONVERSION_SINGLE;
    /** Set extTrigConv*/
//    adcConfig.extTrigConv  = ADC_EXT_TRIG_CONV_TRG0;
    /** Set TrigEdge*/
    adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;
 
    ADC_Config(&adcConfig);
  
//    ADC_ConfigChannel(ADC_CHANNEL_10, ADC_SAMPLE_TIME_239_5);
//        ADC_ConfigChannel(ADC_CHANNEL_11, ADC_SAMPLE_TIME_239_5);
    /** Calibration*/
    ADC_ReadCalibrationFactor();
    /** Enable ADC*/
    ADC_Enable();
 
}
 
//获取ADC通道的值
//ch 通道值0-16
//获取转换结果
uint32_t Get_Adc(uint32_t ch)   
{
 
  uint32_t adc_index = 0;
    unsigned char retry=0;
  ADC_ConfigChannel(ch, ADC_SAMPLE_TIME_239_5); 
    ADC->CHSEL = (uint32_t)ch;  //这个非常重要,没有这句无法正常获取多通道的AD值
  while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY)){
        retry++;
        if(retry>200)return 0;
    };
   ADC_StartConversion();
   retry = 0;
   while(ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET){
         retry++;
        if(retry>200)return 0;
     };
        /** Read ADC Conversion value*/
    
   adc_index = ADC_ReadConversionValue();
     ADC_StopConversion();
   return adc_index;
}
 
再次提醒ADC->CHSEL = (uint32_t)ch;  //这个非常重要,没有这句无法正常获取多通道的AD值