- typedef struct {
- GPIO_T *port;
- uint16_t pin;
- uint32_t AHBPeriph;
- uint32_t adc_channel;
- } adc_ch_info_t;
- /* ADC信息 */
- static adc_ch_info_t adc_ch_info[] = {
- {GPIOA, GPIO_PIN_2, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_0 },
- {GPIOA, GPIO_PIN_3, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_1 },
- {GPIOA, GPIO_PIN_4, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_2 },
- {GPIOA, GPIO_PIN_5, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_3 },
- {GPIOA, GPIO_PIN_0, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_4 },
- {GPIOA, GPIO_PIN_1, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_5 },
- {GPIOA, GPIO_PIN_6, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_6 },
- {GPIOA, GPIO_PIN_7, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_7 },
- {GPIOB, GPIO_PIN_0, RCM_AHB_PERIPH_GPIOB, ADC_CHANNEL_8 },
- {GPIOB, GPIO_PIN_1, RCM_AHB_PERIPH_GPIOB, ADC_CHANNEL_9 },
- {GPIOC, GPIO_PIN_0, RCM_AHB_PERIPH_GPIOC, ADC_CHANNEL_10 },
- {GPIOC, GPIO_PIN_1, RCM_AHB_PERIPH_GPIOC, ADC_CHANNEL_11 },
- {GPIOB, GPIO_PIN_10, RCM_AHB_PERIPH_GPIOB, ADC_CHANNEL_12 },
- {GPIOC, GPIO_PIN_3, RCM_AHB_PERIPH_GPIOC, ADC_CHANNEL_13 },
- {GPIOC, GPIO_PIN_4, RCM_AHB_PERIPH_GPIOC, ADC_CHANNEL_14 },
- {GPIOC, GPIO_PIN_5, RCM_AHB_PERIPH_GPIOC, ADC_CHANNEL_15 },
- {NULL, 0, 0, ADC_CHANNEL_16 }, /* 温度 */
- {NULL, 0, 0, ADC_CHANNEL_17 }, /* Vref_in */
- {NULL, 0, 0, ADC_CHANNEL_18 }, /* VDD/2 */
- };
- /*
- * @brief 引脚初始化
- *
- * @param ch: 通道
- *
- * @retval None
- *
- */
- void bsp_adc_gpio_init(enum ADC_CH ch)
- {
- GPIO_Config_T gpioConfig;
-
- if ((ch < ADC_CH_NUM) && (adc_ch_info[ch].port != NULL)) {
- RCM_EnableAHBPeriphClock(adc_ch_info[ch].AHBPeriph);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = adc_ch_info[ch].pin;
- gpioConfig.mode = GPIO_MODE_AN;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(adc_ch_info[ch].port, &gpioConfig);
- }
- }
- enum ADC_CH {
- ADC_CH0,
- ADC_CH1,
- ADC_CH2,
- ADC_CH3,
- ADC_CH4,
- ADC_CH5,
- ADC_CH6,
- ADC_CH7,
- ADC_CH8,
- ADC_CH9,
- ADC_CH10,
- ADC_CH11,
- ADC_CH12,
- ADC_CH13,
- ADC_CH14,
- ADC_CH15,
- ADC_CH16,
- ADC_CH17,
- ADC_CH18,
-
- ADC_CH_NUM
- };
如下为轮询方式执行ADC转换,开始ADC转换前,必须确保寄存器位ADC_STS.ADCRDY**为置1已准备好状态,当ADC_STS.EOC**为1表明ADC已经转换完成,可以从寄存器ADC_DATA获取转换之后的数据。
注意:ADC的采样时间最短能配置多少,需要根据实际情况调整,时间过短,通道的建立时间不足,将导致转换结果不正确,误差较大。通道16~19,需开启对应的使能位。
轮询方式的ADC转换代码比较简单,但在需要多通道使用的场景下,此方式效率较低。