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);
}
}注意事项
-
时钟配置:使用ADC前需要使能相应的APB2时钟,ADC时钟不能超过14MHz
-
GPIO配置:ADC输入引脚需要配置为模拟输入模式(GPIO_Mode_AIN)
-
校准过程:ADC使能后必须进行校准以确保转换精度
-
采样时间:根据信号源阻抗选择合适的采样时间,阻抗越大需要越长的采样时间
-
参考电压:ADC转换结果与参考电压VREF+相关,通常连接到VDDA
-
转换时间:总转换时间 = 采样时间 + 12.5个ADC时钟周期
-
DMA使用:扫描模式或连续转换模式建议配合DMA使用以提高效率
-
温度传感器:读取温度传感器时需要较长的采样时间(推荐17.1μs)
总结
STM32F10x ADC标准库提供了丰富的模数转换功能,支持单次转换、连续转换、扫描模式、注入转换等多种工作方式。通过合理配置这些函数和参数,可以实现精确的模拟信号采集。掌握ADC的使用方法对于开发测量和控制类应用至关重要。正确的ADC配置和校准是获得准确转换结果的关键。