这是本文档旧的修订版!
ADC.c 文件 (ADC.h文件就不写在这里了):
#include "stm32f10x.h" // Device header #include "stm32f10x_rcc.h" // 修改GPIO/PIN可能需要改动的地方: // ADC[x] // GPIO[x] // GPIO_Pin_[x] // RCC时钟分频 RCC_PCLK2_Div[x] // 采样时间 ADC_SampleTime_[x]Cycles5 void ADC_Init_PB1(void) { // 初始化ADC的5大步骤: // 1. 开启RCC时钟, 包括GPIO和ADC的时钟. 配置ADCCLK的分频器. // 2. 配置要用的GPIO pin为模拟输入. // 3. 配置选择ADC-IN到ADC转换器的通道, 把通道加入规则组里. // 4. 配置ADC转换器, 包括模式, 通道, 触发源, 数据对齐等等. 并开启ADC电源. // 5. (可选, 建议) 校准ADC. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 1, ADC_SampleTime_239Cycles5); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC2, &ADC_InitStructure); ADC_Cmd(ADC2, ENABLE); ADC_ResetCalibration(ADC2); while (ADC_GetResetCalibrationStatus(ADC2) == SET); ADC_StartCalibration(ADC2); while (ADC_GetCalibrationStatus(ADC2) == SET); } uint16_t ADC_Get_PB1_Value(void) { ADC_SoftwareStartConvCmd(ADC2, ENABLE); while (ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET); // 72/6 = 12Mhz, * 239.5T(采样周期)+12.5T(转换周期) = 252T = 5.6微秒. return ADC_GetConversionValue(ADC2); }