- /*
- * PA0 -> ADC_IN0
- * PA1 -> ADC_IN1
- * PA2 -> ADC_IN2
- * PA3 -> ADC_IN3
- * PA4 -> ADC_IN4
- * PA5 -> ADC_IN5
- * PA6 -> ADC_IN6
- * PA7 -> ADC_IN7
- * PB0 -> ADC_IN8
- * PB1 -> ADC_IN9
- * PC0 -> ADC_IN10
- * PC1 -> ADC_IN11
- * PC2 -> ADC_IN12
- * PC3 -> ADC_IN13
- * PC4 -> ADC_IN14
- * PC5 -> ADC_IN15
- */
- 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_0, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_0 },
- {GPIOA, GPIO_PIN_1, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_1 },
- {GPIOA, GPIO_PIN_2, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_2 },
- {GPIOA, GPIO_PIN_3, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_3 },
- {GPIOA, GPIO_PIN_4, RCM_AHB_PERIPH_GPIOA, ADC_CHANNEL_4 },
- {GPIOA, GPIO_PIN_5, 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 },
- {GPIOC, GPIO_PIN_2, RCM_AHB_PERIPH_GPIOC, 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 },
- };
- /*
- * [url=/u/brief]@brief[/url] 引脚初始化
- *
- * @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);
- }
- }
- /*
- * @brief ADC初始化
- *
- * @param ch: 通道
- multi: 是否连续采样
- *
- * @retval None
- *
- */
- void bsp_adc_init(enum ADC_CH ch, uint8_t multi)
- {
- ADC_Config_T adcConfig;
-
- if (ch < ADC_CH_NUM) {
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
-
- /* 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;
- if (multi == 0) {
- /* Set convMode continous*/
- adcConfig.convMode = ADC_CONVERSION_SINGLE;
- } else {
- adcConfig.convMode = ADC_CONVERSION_CONTINUOUS;
- }
- /* Set extTrigConv*/
- adcConfig.extTrigConv = ADC_EXT_TRIG_CONV_TRG0;
- /* Set TrigEdge*/
- adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;
- ADC_Config(&adcConfig);
- if (ch == ADC_CH16) {
- ADC_EnableTempSensor();
- } else if (ch == ADC_CH17) {
- ADC_EnableVrefint();
- }
- ADC_ConfigChannel(adc_ch_info[ch].adc_channel, ADC_SAMPLE_TIME_41_5);
- /* Calibration*/
- ADC_ReadCalibrationFactor();
- /* Enable ADC*/
- ADC_Enable();
- }
- }
- /*
- * @brief ADC启动
- *
- * @param None
- *
- * @retval None
- *
- */
- void bsp_adc_start(void)
- {
- /* Wait until ADC is ready */
- while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
- ADC_StartConversion();
- }
- /*
- * @brief ADC停止
- *
- * @param None
- *
- * @retval None
- *
- */
- void bsp_adc_stop(void)
- {
- ADC_StopConversion();
- }
- /*
- * @brief ADC值获取
- *
- * @param None
- *
- * @retval AD值
- *
- */
- uint16_t bsp_adc_get_value(void)
- {
- while (ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET);
- ADC_ClearStatusFlag(ADC_FLAG_CC);
- return ADC_ReadConversionValue();
- }
- 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_CH_NUM
- };
测试代码如下:
- enum ADC_CH adc_ch = ADC_CH1;
- uint16_t adc_ch_value;
- // 应用初始化
- void app_init(void)
- {
- bsp_adc_gpio_init(adc_ch);
- bsp_adc_init(adc_ch, 1);
- bsp_adc_start();
- }
- // 应用任务
- void app_task(void)
- {
- adc_ch_value = bsp_adc_get_value();
- }
详细代码, 请查看附件:
Poll.zip
(2.35 MB, 下载次数: 1)