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

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

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

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

5. ADC_DMACmd

/**
 * @brief  使能或失能指定ADC的DMA请求
 * @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);

6. ADC_ITConfig

/**
 * @brief  使能或失能指定的ADC中断
 * @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);

7. ADC_ResetCalibration

/**
 * @brief  重置指定ADC的校准寄存器
 * @param  ADCx: 选择要重置校准的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval
 * @example
 *     ADC_ResetCalibration(ADC1);
 */
void ADC_ResetCalibration(ADC_TypeDef* ADCx);

8. ADC_GetResetCalibrationStatus

/**
 * @brief  获取指定ADC重置校准寄存器的状态
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 重置校准寄存器状态,SET或RESET
 * @example
 *     while(ADC_GetResetCalibrationStatus(ADC1));
 */
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

9. ADC_StartCalibration

/**
 * @brief  开始指定ADC的校准
 * @param  ADCx: 选择要校准的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval
 * @example
 *     ADC_StartCalibration(ADC1);
 */
void ADC_StartCalibration(ADC_TypeDef* ADCx);

10. ADC_GetCalibrationStatus

/**
 * @brief  获取指定ADC校准的状态
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 校准状态,SET或RESET
 * @example
 *     while(ADC_GetCalibrationStatus(ADC1));
 */
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

11. ADC_SoftwareStartConvCmd

/**
 * @brief  使能或失能指定ADC的软件启动转换功能
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 软件启动转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 */
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

12. ADC_GetSoftwareStartConvStatus

/**
 * @brief  获取ADC软件启动转换状态
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 软件启动转换状态,SET或RESET
 * @example
 *     FlagStatus status = ADC_GetSoftwareStartConvStatus(ADC1);
 */
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);

13. ADC_DiscModeChannelCountConfig

/**
 * @brief  配置指定ADC规则通道组的间断模式通道数
 * @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);

14. ADC_DiscModeCmd

/**
 * @brief  使能或失能指定ADC规则通道组的间断模式
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 间断模式的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_DiscModeCmd(ADC1, ENABLE);
 */
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

15. ADC_RegularChannelConfig

/**
 * @brief  配置指定ADC通道的转换顺序和采样时间
 * @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);

16. ADC_ExternalTrigConvCmd

/**
 * @brief  使能或失能ADC规则通道组的外部触发转换
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 外部触发转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_ExternalTrigConvCmd(ADC1, ENABLE);
 */
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

17. ADC_GetConversionValue

/**
 * @brief  返回指定ADC规则通道组最后一次转换的结果
 * @param  ADCx: 选择要获取转换值的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 转换结果
 * @example
 *     uint16_t adcValue = ADC_GetConversionValue(ADC1);
 */
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

18. ADC_GetDualModeConversionValue

/**
 * @brief  返回ADC1和ADC2的最后转换结果数据(双ADC模式)
 * @param
 * @retval 双ADC转换结果
 * @example
 *     uint32_t dualValue = ADC_GetDualModeConversionValue();
 */
uint32_t ADC_GetDualModeConversionValue(void);

19. ADC_AutoInjectedConvCmd

/**
 * @brief  使能或失能指定ADC的自动注入转换
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 自动注入转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_AutoInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

20. ADC_InjectedDiscModeCmd

/**
 * @brief  使能或失能指定ADC注入通道组的间断模式
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 注入通道间断模式的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_InjectedDiscModeCmd(ADC1, ENABLE);
 */
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

21. ADC_ExternalTrigInjectedConvConfig

/**
 * @brief  配置ADC注入通道组的外部触发源
 * @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);

22. ADC_ExternalTrigInjectedConvCmd

/**
 * @brief  使能或失能ADC注入通道组的外部触发转换
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 外部触发转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

23. ADC_SoftwareStartInjectedConvCmd

/**
 * @brief  使能或失能指定ADC注入通道组的软件启动转换
 * @param  ADCx: 选择要控制的ADC外设,可以是ADC1、ADC2或ADC3
 * @param  NewState: 软件启动转换的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
 */
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

24. ADC_GetSoftwareStartInjectedConvCmdStatus

/**
 * @brief  获取ADC注入通道组软件启动转换状态
 * @param  ADCx: 选择要检查的ADC外设,可以是ADC1、ADC2或ADC3
 * @retval 软件启动转换状态,SET或RESET
 * @example
 *     FlagStatus status = ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1);
 */
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);

25. ADC_InjectedChannelConfig

/**
 * @brief  配置指定ADC注入通道的转换顺序和采样时间
 * @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);

26. ADC_InjectedSequencerLengthConfig

/**
 * @brief  配置注入通道组的序列长度
 * @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);

27. ADC_SetInjectedOffset

/**
 * @brief  设置指定ADC注入通道的偏移值
 * @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);

28. ADC_GetInjectedConversionValue

/**
 * @brief  返回指定ADC注入通道的转换结果
 * @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);

29. ADC_AnalogWatchdogCmd

/**
 * @brief  使能或失能指定单个/全部规则或注入通道的模拟看门狗
 * @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);

30. ADC_AnalogWatchdogThresholdsConfig

/**
 * @brief  配置模拟看门狗的高低阈值
 * @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);

31. ADC_AnalogWatchdogSingleChannelConfig

/**
 * @brief  配置模拟看门狗保护的单个通道
 * @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);

32. ADC_TempSensorVrefintCmd

/**
 * @brief  使能或失能温度传感器和内部参考电压通道
 * @param  NewState: 温度传感器和Vrefint通道的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     ADC_TempSensorVrefintCmd(ENABLE);
 */
void ADC_TempSensorVrefintCmd(FunctionalState NewState);

33. ADC_GetFlagStatus

/**
 * @brief  检查指定的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);

34. ADC_ClearFlag

/**
 * @brief  清除指定ADC的待处理标志位
 * @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);

35. ADC_GetITStatus

/**
 * @brief  检查指定的ADC中断是否发生
 * @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);

36. ADC_ClearITPendingBit

/**
 * @brief  清除指定ADC的中断待处理位
 * @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);

使用示例

基本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中断服务程序示例
注意事项
总结