需求:获取PC0引脚的电压值,PC0对应ADC0_channel10
1.初始化引脚的adc功能
//adc初始化
void myadc_init(void){
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_ADC0);
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
//adc设置独立模式
adc_mode_config(ADC_MODE_FREE);
//adc数据右对齐
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
//adc通道长度
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1U);
//adc软件触发源
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
//adc外部触发
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
//adc使能
adc_enable(ADC0);
delay_1ms(1U);
//adc校准
adc_calibration_enable(ADC0);
}
2.获取指定ADC通道电压值
//adc通道采样
float adc_channel_sample(uint8_t channel)
{
/* ADC regular channel config */
adc_regular_channel_config(ADC0, 0U, channel, ADC_SAMPLETIME_7POINT5);
/* ADC software trigger enable */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
/* wait the end of conversion flag */
while(!adc_flag_get(ADC0, ADC_FLAG_EOC));
/* clear the end of conversion flag */
adc_flag_clear(ADC0, ADC_FLAG_EOC);
/* return regular channel sample value */
return (adc_regular_data_read(ADC0)*3.3/4096);
}
3.主函数运行
int main(void)
{
systick_config();
myadc_init();
while(1)
{
delay_1ms(5000);
printf("verf=%.2f\r\n",adc_channel_sample(ADC_CHANNEL_10));
}
}