stm32f10x_adc

STM32F10x ADC(模数转换器)外设标准库函数参考文档

数据类型定义

结构体类型

ADC_InitTypeDef - ADC初始化结构体

typedef struct
{
  uint32_t ADC_Mode;                      /* ADC工作模式配置 */
  FunctionalState ADC_ScanConvMode;       /* 扫描转换模式使能 */
  FunctionalState ADC_ContinuousConvMode; /* 连续转换模式使能 */
  uint32_t ADC_ExternalTrigConv;          /* 外部触发转换配置 */
  uint32_t ADC_DataAlign;                 /* 数据对齐方式 */
  uint8_t ADC_NbrOfChannel;               /* 转换通道数量 */
} ADC_InitTypeDef;

成员说明:

  • ADC_Mode:指定ADC工作模式(独立模式或双ADC模式)
  • ADC_ScanConvMode:指定是否使用扫描模式(多通道转换)
  • ADC_ContinuousConvMode:指定是否使用连续转换模式
  • ADC_ExternalTrigConv:指定规则通道组的外部触发源
  • ADC_DataAlign:指定ADC数据对齐方式(左对齐或右对齐)
  • ADC_NbrOfChannel:指定规则通道组中转换的通道数量(1-16)

ADC工作模式定义

独立和双ADC模式

#define ADC_Mode_Independent                       ((uint32_t)0x00000000)  /* 独立模式 */
#define ADC_Mode_RegInjecSimult                    ((uint32_t)0x00010000)  /* 规则和注入同步模式 */
#define ADC_Mode_RegSimult_AlterTrig               ((uint32_t)0x00020000)  /* 规则同步交替触发模式 */
#define ADC_Mode_InjecSimult_FastInterl            ((uint32_t)0x00030000)  /* 注入同步快速交错模式 */
#define ADC_Mode_InjecSimult_SlowInterl            ((uint32_t)0x00040000)  /* 注入同步慢速交错模式 */
#define ADC_Mode_InjecSimult                       ((uint32_t)0x00050000)  /* 注入同步模式 */
#define ADC_Mode_RegSimult                         ((uint32_t)0x00060000)  /* 规则同步模式 */
#define ADC_Mode_FastInterl                        ((uint32_t)0x00070000)  /* 快速交错模式 */
#define ADC_Mode_SlowInterl                        ((uint32_t)0x00080000)  /* 慢速交错模式 */
#define ADC_Mode_AlterTrig                         ((uint32_t)0x00090000)  /* 交替触发模式 */

外部触发源定义

规则通道外部触发源

/* ADC1和ADC2通用触发源 */
#define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000)  /* TIM1 CC1事件 */
#define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x00020000)  /* TIM1 CC2事件 */
#define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x00060000)  /* TIM2 CC2事件 */
#define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x00080000)  /* TIM3 TRGO事件 */
#define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x000A0000)  /* TIM4 CC4事件 */
#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO    ((uint32_t)0x000C0000)  /* 外部中断11/TIM8 TRGO */
#define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x00040000)  /* TIM1 CC3事件 */
#define ADC_ExternalTrigConv_None                  ((uint32_t)0x000E0000)  /* 软件触发 */

注入通道外部触发源

#define ADC_ExternalTrigInjecConv_T1_TRGO           ((uint32_t)0x00000000)  /* TIM1 TRGO事件 */
#define ADC_ExternalTrigInjecConv_T1_CC4            ((uint32_t)0x00001000)  /* TIM1 CC4事件 */
#define ADC_ExternalTrigInjecConv_T2_TRGO           ((uint32_t)0x00002000)  /* TIM2 TRGO事件 */
#define ADC_ExternalTrigInjecConv_T2_CC1            ((uint32_t)0x00003000)  /* TIM2 CC1事件 */
#define ADC_ExternalTrigInjecConv_T3_CC4            ((uint32_t)0x00004000)  /* TIM3 CC4事件 */
#define ADC_ExternalTrigInjecConv_T4_TRGO           ((uint32_t)0x00005000)  /* TIM4 TRGO事件 */
#define ADC_ExternalTrigInjecConv_None              ((uint32_t)0x00007000)  /* 软件触发 */

数据对齐方式

#define ADC_DataAlign_Right                        ((uint32_t)0x00000000)  /* 数据右对齐 */
#define ADC_DataAlign_Left                         ((uint32_t)0x00000800)  /* 数据左对齐 */

ADC通道定义

#define ADC_Channel_0                               ((uint8_t)0x00)  /* ADC通道0 */
#define ADC_Channel_1                               ((uint8_t)0x01)  /* ADC通道1 */
#define ADC_Channel_2                               ((uint8_t)0x02)  /* ADC通道2 */
#define ADC_Channel_3                               ((uint8_t)0x03)  /* ADC通道3 */
#define ADC_Channel_4                               ((uint8_t)0x04)  /* ADC通道4 */
#define ADC_Channel_5                               ((uint8_t)0x05)  /* ADC通道5 */
#define ADC_Channel_6                               ((uint8_t)0x06)  /* ADC通道6 */
#define ADC_Channel_7                               ((uint8_t)0x07)  /* ADC通道7 */
#define ADC_Channel_8                               ((uint8_t)0x08)  /* ADC通道8 */
#define ADC_Channel_9                               ((uint8_t)0x09)  /* ADC通道9 */
#define ADC_Channel_10                              ((uint8_t)0x0A)  /* ADC通道10 */
#define ADC_Channel_11                              ((uint8_t)0x0B)  /* ADC通道11 */
#define ADC_Channel_12                              ((uint8_t)0x0C)  /* ADC通道12 */
#define ADC_Channel_13                              ((uint8_t)0x0D)  /* ADC通道13 */
#define ADC_Channel_14                              ((uint8_t)0x0E)  /* ADC通道14 */
#define ADC_Channel_15                              ((uint8_t)0x0F)  /* ADC通道15 */
#define ADC_Channel_16                              ((uint8_t)0x10)  /* ADC通道16(内部温度传感器)*/
#define ADC_Channel_17                              ((uint8_t)0x11)  /* ADC通道17(内部参考电压)*/

/* 特殊通道别名定义 */
#define ADC_Channel_TempSensor                      ((uint8_t)ADC_Channel_16)  /* 温度传感器通道 */
#define ADC_Channel_Vrefint                         ((uint8_t)ADC_Channel_17)  /* 内部参考电压通道 */

采样时间定义

#define ADC_SampleTime_1Cycles5                    ((uint8_t)0x00)  /* 1.5个采样周期 */
#define ADC_SampleTime_7Cycles5                    ((uint8_t)0x01)  /* 7.5个采样周期 */
#define ADC_SampleTime_13Cycles5                   ((uint8_t)0x02)  /* 13.5个采样周期 */
#define ADC_SampleTime_28Cycles5                   ((uint8_t)0x03)  /* 28.5个采样周期 */
#define ADC_SampleTime_41Cycles5                   ((uint8_t)0x04)  /* 41.5个采样周期 */
#define ADC_SampleTime_55Cycles5                   ((uint8_t)0x05)  /* 55.5个采样周期 */
#define ADC_SampleTime_71Cycles5                   ((uint8_t)0x06)  /* 71.5个采样周期 */
#define ADC_SampleTime_239Cycles5                  ((uint8_t)0x07)  /* 239.5个采样周期 */

注入通道选择

#define ADC_InjectedChannel_1                       ((uint8_t)0x14)  /* 注入通道1 */
#define ADC_InjectedChannel_2                       ((uint8_t)0x18)  /* 注入通道2 */
#define ADC_InjectedChannel_3                       ((uint8_t)0x1C)  /* 注入通道3 */
#define ADC_InjectedChannel_4                       ((uint8_t)0x20)  /* 注入通道4 */

模拟看门狗配置

#define ADC_AnalogWatchdog_SingleRegEnable         ((uint32_t)0x00800200)  /* 单个规则通道看门狗 */
#define ADC_AnalogWatchdog_SingleInjecEnable       ((uint32_t)0x00400200)  /* 单个注入通道看门狗 */
#define ADC_AnalogWatchdog_SingleRegOrInjecEnable  ((uint32_t)0x00C00200)  /* 单个规则或注入通道看门狗 */
#define ADC_AnalogWatchdog_AllRegEnable            ((uint32_t)0x00800000)  /* 所有规则通道看门狗 */
#define ADC_AnalogWatchdog_AllInjecEnable          ((uint32_t)0x00400000)  /* 所有注入通道看门狗 */
#define ADC_AnalogWatchdog_AllRegAllInjecEnable    ((uint32_t)0x00C00000)  /* 所有通道看门狗 */
#define ADC_AnalogWatchdog_None                    ((uint32_t)0x00000000)  /* 禁用看门狗 */

中断和标志定义

中断类型

#define ADC_IT_EOC                                 ((uint16_t)0x0220)  /* 转换结束中断 */
#define ADC_IT_AWD                                 ((uint16_t)0x0140)  /* 模拟看门狗中断 */
#define ADC_IT_JEOC                                ((uint16_t)0x0480)  /* 注入转换结束中断 */

状态标志

#define ADC_FLAG_AWD                               ((uint8_t)0x01)  /* 模拟看门狗标志 */
#define ADC_FLAG_EOC                               ((uint8_t)0x02)  /* 转换结束标志 */
#define ADC_FLAG_JEOC                              ((uint8_t)0x04)  /* 注入转换结束标志 */
#define ADC_FLAG_JSTRT                             ((uint8_t)0x08)  /* 注入转换开始标志 */
#define ADC_FLAG_STRT                              ((uint8_t)0x10)  /* 规则转换开始标志 */

标准库函数详解

1. ADC_DeInit

/**
 * @brief  将 ADC 寄存器恢复为复位默认值,用于更换采样模式或重新初始化前清空旧配置
 * @param  ADCx: 选择要重置的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval
 * @example
 *     ADC_DeInit(ADC1);
 */
void ADC_DeInit(ADC_TypeDef* ADCx);

功能说明:

  • 停止转换并恢复默认单通道、软件触发等状态
  • 切换独立/双 ADC 模式前可先 DeInit
  • 不会关闭 RCC 中的 ADC 时钟

2. ADC_Init

/**
 * @brief  配置 ADC 工作模式、分辨率、扫描/连续转换等,是电压采集链路的核心初始化
 * @param  ADCx: 选择要初始化的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_InitStruct: 指向ADC_InitTypeDef结构体的指针,包含配置信息
 * @retval
 * @example
 *     ADC_InitTypeDef ADC_InitStructure;
 *     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 *     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
 *     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
 *     ADC_Init(ADC1, &ADC_InitStructure);
 */
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

功能说明:

  • 须在 GPIO 模拟输入、ADC 时钟与校准流程配合使用
  • 扫描+DMA 场景需 ENABLE 扫描并配置通道序列
  • 双 ADC 模式在 ADC_Mode 中选择同步/交替等

3. ADC_StructInit

/**
 * @brief  将 ADC_InitTypeDef 填为库默认安全值,避免未赋值成员导致异常采样行为
 * @param  ADC_InitStruct: 指向要初始化的ADC_InitTypeDef结构体的指针
 * @retval
 * @example
 *     ADC_InitTypeDef ADC_InitStructure;
 *     ADC_StructInit(&ADC_InitStructure);
 */
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);

功能说明:

  • 默认独立模式、单通道、右对齐、单次转换
  • 推荐在 ADC_Init 前调用再按需修改字段
  • 仅填充结构体,不访问硬件

4. ADC_Cmd

/**
 * @brief  打开或关闭 ADC 电源与转换引擎,上电后须校准再启动采样
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: ADC外设的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_Cmd(ADC1, ENABLE);
 */
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • ENABLE 后执行复位校准→启动校准→等待完成
  • DISABLE 可省电,再次 ENABLE 建议重新校准
  • 未 ENABLE 时配置通道与触发无效

5. ADC_DMACmd

/**
 * @brief  允许规则组转换结束向 DMA 发请求,实现多通道自动搬运而不占 CPU 轮询
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1或ADC3
 * @param  NewState: ADC DMA请求的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_DMACmd(ADC1, ENABLE);
 */
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 须先配置 DMA 通道指向 ADC1->DR
  • 扫描连续模式+DMA 为高速采集常用组合
  • ADC2 无 DMA 请求(视具体型号)

6. ADC_ITConfig

/**
 * @brief  打开 EOC 等 ADC 中断,转换完成时进 ISR 读值,适合单次触发或低采样率
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_IT: 指定要使能或失能的ADC中断源
 * @param  NewState: 指定ADC中断的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
 */
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

功能说明:

  • 须配置 NVIC;ISR 内读 DR 并 ADC_ClearITPendingBit
  • 注入组可用 ADC_IT_JEOC
  • 高采样率更推荐 DMA 而非 EOC 中断

7. ADC_ResetCalibration

/**
 * @brief  启动校准寄存器复位,是上电后消除内部偏移、保证读数准确度的第一步
 * @param  ADCx: 选择要重置校准的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval
 * @example
 *     ADC_ResetCalibration(ADC1);
 */
void ADC_ResetCalibration(ADC_TypeDef* ADCx);

功能说明:

  • 须在 ADC_Cmd(ENABLE) 之后调用
  • 复位期间勿启动转换
  • 每次从 DISABLE 重新 ENABLE 建议重做校准流程

8. ADC_GetResetCalibrationStatus

/**
 * @brief  轮询校准复位是否完成,完成后才能调用 `ADC_StartCalibration`
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 重置校准寄存器状态,SET或RESET
 * @example
 *     while(ADC_GetResetCalibrationStatus(ADC1));
 */
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

功能说明:

  • SET 表示仍在复位,RESET 表示完成
  • 典型 while 阻塞等待
  • 可加超时防止硬件异常死等

9. ADC_StartCalibration

/**
 * @brief  启动 ADC 自校准,补偿内部电容与偏移,正式采样前必须执行
 * @param  ADCx: 选择要校准的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval
 * @example
 *     ADC_StartCalibration(ADC1);
 */
void ADC_StartCalibration(ADC_TypeDef* ADCx);

功能说明:

  • 在复位校准完成后调用
  • 校准时芯片内部自动采样,无需外部电压
  • 完成标志由 ADC_GetCalibrationStatus 查询

10. ADC_GetCalibrationStatus

/**
 * @brief  等待自校准结束,校准完成后再配置触发并启动转换
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 校准状态,SET或RESET
 * @example
 *     while(ADC_GetCalibrationStatus(ADC1));
 */
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

功能说明:

  • SET 表示校准进行中
  • 完成后方可 ADC_SoftwareStartConvCmd
  • 跳过等待会导致读数偏差

11. ADC_SoftwareStartConvCmd

/**
 * @brief  软件触发规则组一次或连续转换,无外部触发时的默认启动方式
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 软件启动转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 */
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 单次模式下每次 ENABLE 启动一次转换
  • 连续模式下 ENABLE 后自动反复转换
  • 与外部触发互斥时须关闭 ADC_ExternalTrigConvCmd

12. ADC_GetSoftwareStartConvStatus

/**
 * @brief  查询规则组软件触发是否仍处于启动状态,用于连续模式或调试触发链路
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 软件启动转换状态,SET或RESET
 * @example
 *     FlagStatus status = ADC_GetSoftwareStartConvStatus(ADC1);
 */
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);

功能说明:

  • 读 SWSTART 相关状态位
  • 单次转换完成后可能自动清零(视模式)
  • 可用于确认是否已软件启动

13. ADC_DiscModeChannelCountConfig

/**
 * @brief  设置间断模式下每轮连续转换的通道个数,用于降低 CPU/DMA 负担的分批采样
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  Number: 指定间断模式通道数,必须在1到8之间
 * @retval
 * @example
 *     ADC_DiscModeChannelCountConfig(ADC1, 1);
 */
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);

功能说明:

  • 须配合 ADC_DiscModeCmd(ENABLE) 与扫描模式
  • 每轮转换 Number 个通道后暂停,需再次触发
  • 适合慢速多通道轮询

14. ADC_DiscModeCmd

/**
 * @brief  打开规则组间断转换,多通道序列分段执行而非一次扫完
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 间断模式的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_DiscModeCmd(ADC1, ENABLE);
 */
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 与连续扫描同时使用时行为见参考手册时序图
  • DISABLE 恢复一次触发扫全序列
  • 需先配置通道数与 Rank

15. ADC_RegularChannelConfig

/**
 * @brief  把模拟引脚加入规则转换序列并设定采样时间,高阻抗源须加长采样周期
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_Channel: 指定要配置的ADC通道
 * @param  Rank: 指定ADC通道的转换顺序,必须在1到16之间
 * @param  ADC_SampleTime: 指定ADC通道的采样时间
 * @retval
 * @example
 *     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
 */
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);

功能说明:

  • Rank 1 为序列首通道;多通道扫描按 Rank 递增
  • 传感器源阻抗大时用 239.5 cycles 等长采样
  • 对应 GPIO 须为 GPIO_Mode_AIN

16. ADC_ExternalTrigConvCmd

/**
 * @brief  允许定时器等外部事件启动规则组转换,实现与 PWM/控制环路硬件同步采样
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 外部触发转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_ExternalTrigConvCmd(ADC1, ENABLE);
 */
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 须在 ADC_Init 中已选外部触发源
  • 典型 TIM TRGO 触发,相位与占空比稳定
  • ENABLE 后软件 SWSTART 通常不再使用

17. ADC_GetConversionValue

/**
 * @brief  读取规则组最近一次转换的 12 位结果,轮询 EOC 或 DMA 完成后调用
 * @param  ADCx: 选择要获取转换值的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 转换结果
 * @example
 *     uint16_t adcValue = ADC_GetConversionValue(ADC1);
 */
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

功能说明:

  • 读 DR 寄存器,右对齐时 0–4095 对应 0–Vref
  • 双缓冲或 DMA 场景注意读时机避免覆盖
  • 多次读同一 EOC 返回相同值直至下次转换

18. ADC_GetDualModeConversionValue

/**
 * @brief  在双 ADC 同步/交替模式下读取合并结果字,一次获取两路采样数据
 * @param
 * @retval 双ADC转换结果
 * @example
 *     uint32_t dualValue = ADC_GetDualModeConversionValue();
 */
uint32_t ADC_GetDualModeConversionValue(void);

功能说明:

  • 仅 ADC1+ADC2 双模式有效
  • 返回值高低 16 位分别对应两路 DR
  • 须在 ADC_Mode 设为双 ADC 且转换完成后读取

19. ADC_AutoInjectedConvCmd

/**
 * @brief  规则组转换结束后自动启动注入组,适合在固定时刻插入电流采样等
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 自动注入转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_AutoInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 注入组优先级高于规则组
  • 电机控制中常在 PWM 特定点采样母线电流
  • 须预先配置注入通道与触发

20. ADC_InjectedDiscModeCmd

/**
 * @brief  控制注入通道是否采用间断模式,与规则组类似的分段注入转换
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 注入通道间断模式的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_InjectedDiscModeCmd(ADC1, ENABLE);
 */
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 注入序列最多 4 通道
  • 间断模式下需多次触发才能扫完注入序列
  • ADC_InjectedSequencerLengthConfig 配合

21. ADC_ExternalTrigInjectedConvConfig

/**
 * @brief  选择注入组外部触发源(如 TIM4 CC4),实现注入采样与 PWM 边沿对齐
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_ExternalTrigInjecConv: 指定ADC注入通道组的外部触发源
 * @retval
 * @example
 *     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
 */
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);

功能说明:

  • ADC_ExternalTrigInjectedConvCmd(ENABLE) 前配置
  • 高级定时器 CC 事件为常见触发
  • 与规则组触发源独立配置

22. ADC_ExternalTrigInjectedConvCmd

/**
 * @brief  允许外部事件启动注入转换,硬件精确打点采样
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 外部触发转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • ENABLE 后由选定 TIM 边沿触发 JEOC
  • 软件 ADC_SoftwareStartInjectedConvCmd 与之二选一或按手册组合
  • 注入完成读 ADC_GetInjectedConversionValue

23. ADC_SoftwareStartInjectedConvCmd

/**
 * @brief  软件启动注入组转换,调试或无合适外部触发时使用
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 软件启动转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

功能说明:

  • 会打断当前规则转换(注入优先)
  • 完成后查 JEOC 或注入中断
  • 单次注入序列启动常用 ENABLE 脉冲

24. ADC_GetSoftwareStartInjectedConvCmdStatus

/**
 * @brief  查询注入组软件触发是否有效,确认 JSWSTART 状态
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 软件启动转换状态,SET或RESET
 * @example
 *     FlagStatus status = ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1);
 */
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);

功能说明:

  • 与规则组 SWSTART 状态查询类似
  • 用于调试注入触发是否发出
  • 转换结束可能自动清除

25. ADC_InjectedChannelConfig

/**
 * @brief  配置注入序列中的通道、顺序与采样时间,用于高优先级或同步采样点
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_Channel: 指定要配置的ADC通道
 * @param  Rank: 指定ADC注入通道的转换顺序,必须在1到4之间
 * @param  ADC_SampleTime: 指定ADC通道的采样时间
 * @retval
 * @example
 *     ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
 */
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);

功能说明:

  • 注入 Rank 1–4 对应 JDR1–JDR4
  • 可与规则组复用不同通道
  • 采样时间选择原则同规则通道

26. ADC_InjectedSequencerLengthConfig

/**
 * @brief  设定注入转换序列长度(1–4),决定每次触发扫描几个注入通道
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  Length: 指定注入通道组的序列长度,必须在1到4之间
 * @retval
 * @example
 *     ADC_InjectedSequencerLengthConfig(ADC1, 2);
 */
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);

功能说明:

  • Length 须与已配置的注入 Rank 数量一致
  • 长度为 1 时仅转换 InjectedRank1
  • 修改长度前建议停止转换

27. ADC_SetInjectedOffset

/**
 * @brief  为注入数据寄存器设置偏移量,硬件自动减去偏移,便于电流零点校准
 * @param  ADCx: 选择要设置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_InjectedChannel: 指定要设置偏移值的ADC注入通道
 * @param  Offset: 指定偏移值,必须小于等于0xFFF
 * @retval
 * @example
 *     ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 0x100);
 */
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);

功能说明:

  • 读 JDR 时得到的是已减偏移的结果
  • 电机相电流采样常用零点 offset
  • Offset 最大 12 位(0xFFF)

28. ADC_GetInjectedConversionValue

/**
 * @brief  读取指定注入通道转换结果,注入完成(JEOC)后调用
 * @param  ADCx: 选择要获取转换值的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_InjectedChannel: 指定要返回值的ADC注入通道
 * @retval 注入通道转换结果
 * @example
 *     uint16_t injectedValue = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
 */
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);

功能说明:

  • 对应 JDR1–JDR4,已含偏移处理
  • 注入组可打断规则组,读数时注意时序
  • ADC_IT_JEOC 中断配合

29. ADC_AnalogWatchdogCmd

/**
 * @brief  使能模拟看门狗监控电压窗口,超范围产生 AWD 中断/标志用于过压过流保护
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_AnalogWatchdog: 指定要使能的模拟看门狗
 * @retval
 * @example
 *     ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
 */
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);

功能说明:

  • 须先 ADC_AnalogWatchdogThresholdsConfig 设高低阈
  • 可监控单通道、全规则或全注入
  • 电池电压监测、安全联锁常用

30. ADC_AnalogWatchdogThresholdsConfig

/**
 * @brief  设定看门狗上下限阈值,转换值超出窗口触发 AWD 事件
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  HighThreshold: 指定看门狗高阈值,必须小于等于0xFFF
 * @param  LowThreshold: 指定看门狗低阈值,必须小于等于0xFFF
 * @retval
 * @example
 *     ADC_AnalogWatchdogThresholdsConfig(ADC1, 0xDA0, 0x500);
 */
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);

功能说明:

  • 12 位对齐,High 须大于 Low
  • 阈值以 ADC 数字量表示,需按 Vref 换算
  • 单通道模式需 ADC_AnalogWatchdogSingleChannelConfig

31. ADC_AnalogWatchdogSingleChannelConfig

/**
 * @brief  指定看门狗只监视某一个 ADC 通道,多路输入中单独监控关键信号
 * @param  ADCx: 选择要配置的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_Channel: 指定要被模拟看门狗保护的ADC通道
 * @retval
 * @example
 *     ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_5);
 */
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);

功能说明:

  • 配合 ADC_AnalogWatchdog_SingleRegEnable 等模式
  • 通道须在规则或注入序列中实际参与转换
  • 避免对未采样通道误报警

32. ADC_TempSensorVrefintCmd

/**
 * @brief  接通内部温度传感器与 1.2V 参考通道,用于芯片温度估算或 Vref 校准
 * @param  NewState: 温度传感器和Vrefint通道的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_TempSensorVrefintCmd(ENABLE);
 */
void ADC_TempSensorVrefintCmd(FunctionalState NewState);

功能说明:

  • 通道为 ADC_Channel_TempSensor / Vrefint
  • 启用后需稳定时间(数据手册约 10µs 级,常加延时)
  • 读温度需按手册公式由两次采样换算

33. ADC_GetFlagStatus

/**
 * @brief  查询 EOC、AWD 等 ADC 硬件标志,轮询等待转换完成或看门狗触发
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_FLAG: 指定要检查的ADC标志
 * @retval 标志状态,SET或RESET
 * @example
 *     if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET)
 *     {
 *         // 转换结束
 *     }
 */
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

功能说明:

  • 常用 ADC_FLAG_EOCADC_FLAG_JEOC
  • 读 DR 前确认 EOC 避免读旧值
  • 与中断方式二选一或组合使用

34. ADC_ClearFlag

/**
 * @brief  清除 ADC 状态标志,读值或处理 AWD 后清零以便检测下次事件
 * @param  ADCx: 选择要清除标志的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_FLAG: 指定要清除的ADC标志
 * @retval
 * @example
 *     ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
 */
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

功能说明:

  • 部分标志读 DR 自动清除,仍建议显式 Clear
  • 清除 AWD 后看门狗可再次触发
  • 不要误清正在使用的 DMA 相关状态

35. ADC_GetITStatus

/**
 * @brief  判断 ADC 中断是否 pending,在 ADC ISR 中区分 EOC/JEOC/AWD 事件
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_IT: 指定要检查的ADC中断源
 * @retval 中断状态,SET或RESET
 * @example
 *     if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET)
 *     {
 *         // 转换结束中断
 *     }
 */
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);

功能说明:

  • 须已 ADC_ITConfig 与 NVIC 使能
  • ADC_GetFlagStatus 类似但针对中断使能位
  • ISR 末尾配合 ClearITPendingBit

36. ADC_ClearITPendingBit

/**
 * @brief  清除 ADC 中断 pending,防止重复进中断
 * @param  ADCx: 选择要清除中断的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  ADC_IT: 指定要清除的ADC中断待处理位
 * @retval
 * @example
 *     ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
 */
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

功能说明:

  • 在读取转换值并处理完成后调用
  • 未清除会导致连续触发 NVIC
  • ADC_ClearFlag 常成对使用

使用示例

基本ADC配置示例

void ADC_Configuration(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能ADC1和GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置PA0为模拟输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置ADC参数
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // 配置ADC1通道0
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    
    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);
    
    // ADC校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

单次转换读取示例

uint16_t ADC_GetValue(void)
{
    // 启动转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    // 等待转换完成
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    
    // 读取转换结果
    return ADC_GetConversionValue(ADC1);
}

连续转换配置示例

void ADC_ContinuousMode_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    
    // 配置连续转换模式
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  // 连续转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // 配置通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    
    // 使能转换结束中断
    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
    
    // 使能ADC
    ADC_Cmd(ADC1, ENABLE);
    
    // 校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    
    // 开始连续转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

多通道扫描模式示例

void ADC_ScanMode_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置GPIO(PA0, PA1, PA2为模拟输入)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置ADC扫描模式
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;        // 扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 3;             // 3个通道
    
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // 配置通道转换顺序
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
    
    // 使能DMA传输
    ADC_DMACmd(ADC1, ENABLE);
    
    // 使能ADC
    ADC_Cmd(ADC1, ENABLE);
    
    // 校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

模拟看门狗配置示例

void ADC_AnalogWatchdog_Config(void)
{
    // 基本ADC配置(省略)
    
    // 配置模拟看门狗阈值
    ADC_AnalogWatchdogThresholdsConfig(ADC1, 0xDA0, 0x500);  // 高阈值3488,低阈值1280
    
    // 配置看门狗监视单个通道
    ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_0);
    
    // 使能单个规则通道的模拟看门狗
    ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
    
    // 使能模拟看门狗中断
    ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
}

温度传感器读取示例

float ADC_GetTemperature(void)
{
    uint16_t adcValue;
    float voltage, temperature;
    
    // 使能温度传感器
    ADC_TempSensorVrefintCmd(ENABLE);
    
    // 配置温度传感器通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_239Cycles5);
    
    // 启动转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    // 等待转换完成
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    
    // 获取ADC值
    adcValue = ADC_GetConversionValue(ADC1);
    
    // 转换为电压值(假设参考电压为3.3V)
    voltage = ((float)adcValue / 4096.0f) * 3.3f;
    
    // 转换为温度值(根据数据手册公式)
    temperature = (1.43f - voltage) / 0.0043f + 25.0f;
    
    return temperature;
}

ADC中断服务程序示例

void ADC1_2_IRQHandler(void)
{
    if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET)
    {
        // 读取转换结果
        uint16_t adcValue = ADC_GetConversionValue(ADC1);
        
        // 处理转换结果
        ProcessADCValue(adcValue);
        
        // 清除中断标志
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
    }
    
    if(ADC_GetITStatus(ADC1, ADC_IT_AWD) == SET)
    {
        // 模拟看门狗中断处理
        HandleAnalogWatchdog();
        
        // 清除中断标志
        ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);
    }
}

注意事项

  1. 时钟配置:使用ADC前需要使能相应的APB2时钟,ADC时钟不能超过14MHz

  2. GPIO配置:ADC输入引脚需要配置为模拟输入模式(GPIO_Mode_AIN)

  3. 校准过程:ADC使能后必须进行校准以确保转换精度

  4. 采样时间:根据信号源阻抗选择合适的采样时间,阻抗越大需要越长的采样时间

  5. 参考电压:ADC转换结果与参考电压VREF+相关,通常连接到VDDA

  6. 转换时间:总转换时间 = 采样时间 + 12.5个ADC时钟周期

  7. DMA使用:扫描模式或连续转换模式建议配合DMA使用以提高效率

  8. 温度传感器:读取温度传感器时需要较长的采样时间(推荐17.1μs)

总结

STM32F10x ADC标准库提供了丰富的模数转换功能,支持单次转换、连续转换、扫描模式、注入转换等多种工作方式。通过合理配置这些函数和参数,可以实现精确的模拟信号采集。掌握ADC的使用方法对于开发测量和控制类应用至关重要。正确的ADC配置和校准是获得准确转换结果的关键。

On this page

数据类型定义
结构体类型
ADC_InitTypeDef - ADC初始化结构体
ADC工作模式定义
独立和双ADC模式
外部触发源定义
规则通道外部触发源
注入通道外部触发源
数据对齐方式
ADC通道定义
采样时间定义
注入通道选择
模拟看门狗配置
中断和标志定义
中断类型
状态标志
标准库函数详解
1. ADC_DeInit
2. ADC_Init
3. ADC_StructInit
4. ADC_Cmd
5. ADC_DMACmd
6. ADC_ITConfig
7. ADC_ResetCalibration
8. ADC_GetResetCalibrationStatus
9. ADC_StartCalibration
10. ADC_GetCalibrationStatus
11. ADC_SoftwareStartConvCmd
12. ADC_GetSoftwareStartConvStatus
13. ADC_DiscModeChannelCountConfig
14. ADC_DiscModeCmd
15. ADC_RegularChannelConfig
16. ADC_ExternalTrigConvCmd
17. ADC_GetConversionValue
18. ADC_GetDualModeConversionValue
19. ADC_AutoInjectedConvCmd
20. ADC_InjectedDiscModeCmd
21. ADC_ExternalTrigInjectedConvConfig
22. ADC_ExternalTrigInjectedConvCmd
23. ADC_SoftwareStartInjectedConvCmd
24. ADC_GetSoftwareStartInjectedConvCmdStatus
25. ADC_InjectedChannelConfig
26. ADC_InjectedSequencerLengthConfig
27. ADC_SetInjectedOffset
28. ADC_GetInjectedConversionValue
29. ADC_AnalogWatchdogCmd
30. ADC_AnalogWatchdogThresholdsConfig
31. ADC_AnalogWatchdogSingleChannelConfig
32. ADC_TempSensorVrefintCmd
33. ADC_GetFlagStatus
34. ADC_ClearFlag
35. ADC_GetITStatus
36. ADC_ClearITPendingBit
使用示例
基本ADC配置示例
单次转换读取示例
连续转换配置示例
多通道扫描模式示例
模拟看门狗配置示例
温度传感器读取示例
ADC中断服务程序示例
注意事项
总结