这是本文档旧的修订版!


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);
}