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_EOC、ADC_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);
}
}注意事项
-
时钟配置:使用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配置和校准是获得准确转换结果的关键。