#include "adc.h" // ADC1 初始化 void adc1_init(void) { GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; // 使能 ADC 和 PC0 的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE); // 初始化 PC0 为模拟输入 // 模拟输入 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOC, &GPIO_InitStruct); // 配置 ADC 的时钟主频为 12MHz(72M 六分频) RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 初始化 AADC // 独立模式 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 扫描模式(禁用) ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 连续转换(禁用) ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 外部转换出发源(禁用),使用软件出发 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 右对齐方式 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 通道个数(1 个通道) ADC_InitStruct.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStruct); // 使能 ADC ADC_Cmd(ADC1,ENABLE); // 复位校准(初次使用必须使用校准) ADC_ResetCalibration(ADC1); // 等待复位校准结束 while (ADC_GetResetCalibrationStatus(ADC1)); // 开始校准 ADC_StartCalibration(ADC1); // 等待校准结束 while (ADC_GetCalibrationStatus(ADC1)); // 设置成软件触发转换模式 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } // ADC 转换取值 // channal 表示通道 uint16_t adc1_get_value(uint8_t channal) { // 设置规则通道的转换配置,采样周期为 239.5个 ADC 时钟周期 ADC_RegularChannelConfig(ADC1, channal, 1, ADC_SampleTime_239Cycles5); // 开始软件转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 返回转换结果 return ADC_GetConversionValue(ADC1); }