本文主要从ADC中用到的结构体、函数以及用法讲解。
目录
一、结构体
1.ADC_InitTypeDef
2.ADC_ChannelConfTypeDef
3.ADC_AnalogWDGConfTypeDef
4.ADC_HandleTypeDef
二、函数
2.1所有函数的概括及功能
三、ADC的使用
3.1配置ADC相关的顶级参数:
ADC外围功能:
●12位分辨率
●常规转换结束时产生中断,注入转换结束时产生中断,以及发生模拟看门狗或溢出事件时产生中断。
●单、连续转换模式。
●扫描模式,多通道顺序转换。
●内置数据一致性的数据对齐。
●可编程采样时间(通道)
●常规组与注射组ADC转换。
●常规组和注射组的外部触发器(定时器或EXTI)。
●DMA请求生成,用于传输常规组的转换数据。
●多模双模(可用于2台或更多adc的设备)。
●可配置多模式双模式DMA数据存储(可用于2个或更多DCs的设备)。
●双交错模式转换之间的可配置延迟(可用于2个或更多DCs的设备)。
●ADC校准
●ADC电源要求:全速时2.4 V到3.6 V,低速时降低到1.8 V。
●ADC输入范围:从Vref-(连接到vsa)到Vref+(连接到Vdda或外部参考电压)。
typedef struct
{
uint32_t DataAlign
uint32_t ScanConvMode
uint32_t ContinuousConvMode
uint32_t NbrOfConversion
uint32_t DiscontinuousConvMode
uint32_t NbrOfDiscConversion
uint32_t ExternalTrigConv
} ADC_InitTypeDef
每个参数的含义:
DataAlign:表示对齐模式,因为我们ADC采集的数据放在ADC_DR 寄存器,ADC分辨率是12所以只能放12位,但是ADC_DR寄存器是16位的,所以要选择向左对齐还是向右对齐
宏定义:
ADC_DATAALIGN_RIGHT 右对齐
ADC_DATAALIGN_LEFT 左对齐
ScanConvMode: ADC的扫描模式,配置ADC_CR1的SCAN位,扫描模式指的是不断扫描ADC1,2,3,扫描多用在多通道上
宏定义:
Enable 使能
Disable 失能
ContinuousConvMode:连续转换模式,配置的是ADC_CR2的CON位,表示ADC通道连续采集,一次采集转化完继续采集
宏定义:
Enable 使能
Disable 失能
NbrOfConversion:ADC要转化的通道数目,可以设置为1-16,直接填写数字 1-16
DiscontinuousConvMode:指定正则组的转换序列是否在全序/不连续序(主序又分为连续的部分)。 只有在启用了音序器时才使用不连续模式(参数“ScanConvMode”)。 如果sequencer被禁用,该参数将被丢弃。 只有在禁用连续模式的情况下,才能启用不连续模式。 如果连续模式开启时,该参数将被丢弃。 该参数可以设置为启用或禁用。
宏定义:
Enable 使能
Disable 失能
NbrOfDiscConversion:指定主序列的不连续转换的次数regular group(参数NbrOfConversion)将被细分。 如果参数DiscontinuousConvMode被禁用,该参数将被丢弃。 这个参数必须是Min_Data = 1和Max_Data = 8之间的一个数字,即必须是1-8之间的数字。
ExternalTrigConv:外部触发转换选择, 配置ADC_CR2的EXTTRIG和EXTSEL[2:0],EXTTRIG使能触发源,EXTSEL[2:0]选择哪一个触发源,如果不选择外部触发,可以选择软件触发
ADC External trigger selection for regular group
ADC_EXTERNALTRIGCONV_T1_CC1 选择定时器1的捕获比较1作为转换外部触发
ADC_EXTERNALTRIGCONV_T1_CC2 选择定时器1的捕获比较2作为转换外部触发
ADC_EXTERNALTRIGCONV_T2_CC2 选择定时器2的捕获比较2作为转换外部触发
ADC_EXTERNALTRIGCONV_T3_TRGO 选择定时器3的TRGO作为转换外部触发
ADC_EXTERNALTRIGCONV_T4_CC4 选择定时器4的捕获比较4作为转换外部触发
ADC_EXTERNALTRIGCONV_EXT_IT11 选择外部中断线11事件作为转换外部触发
ADC_EXTERNALTRIGCONV_T2_CC3 选择定时器2的捕获比较3作为转换外部触发
ADC_EXTERNALTRIGCONV_T3_CC1 选择定时器3的捕获比较1作为转换外部触发
ADC_EXTERNALTRIGCONV_T5_CC1 选择定时器5的捕获比较1作为转换外部触发
ADC_EXTERNALTRIGCONV_T5_CC3 选择定时器5的捕获比较3作为转换外部触发
ADC_EXTERNALTRIGCONV_T8_CC1 选择定时器8的捕获比较1作为转换外部触发
ADC_EXTERNALTRIGCONV_T1_CC3 选择定时器1的捕获比较3作为转换外部触发
ADC_EXTERNALTRIGCONV_T8_TRGO 选择定时器8的TRGO作为转换外部触发
ADC_SOFTWARE_START 选择软件触发
typedef struct
{
uint32_t Channel; //转换通道配置
uint32_t Rank; //转换序列排序
uint32_t SamplingTime; //采样时间设置
} ADC_ChannelConfTypeDef;
每个参数的含义:
Channel:配置转换通道。根据设备的不同,有些通道可能在封装引脚上不可用。
ADC_CHANNEL_0 通道0
ADC_CHANNEL_1 通道1
ADC_CHANNEL_2 通道2
ADC_CHANNEL_3 通道3
ADC_CHANNEL_4 通道4
ADC_CHANNEL_5 通道5
ADC_CHANNEL_6 通道6
ADC_CHANNEL_7 通道7
ADC_CHANNEL_8 通道8
ADC_CHANNEL_9 通道9
ADC_CHANNEL_10 通道10
ADC_CHANNEL_11 通道11
ADC_CHANNEL_12 通道12
ADC_CHANNEL_13 通道13
ADC_CHANNEL_14 通道14
ADC_CHANNEL_15 通道15
ADC_CHANNEL_16 通道16
ADC_CHANNEL_17 通道17
ADC_CHANNEL_TEMPSENSOR ADC内部通道(在设备引脚上没有连接)
ADC_CHANNEL_VREFINT ADC内部通道(在设备引脚上没有连接)
Rank:用于配置规则通道的转换顺序,如果想禁止一个通道或者改变一个通道的顺序,可以使用新配置覆盖。写的时候可以直接写数值,不用写宏定义,以为宏定义的通道和数值是对应的,通道1的值就是1,通道2的值就是2…以此类推,例如:ADC1_ChanConf.Rank=1;
ADC_REGULAR_RANK_1 1
ADC_REGULAR_RANK_2 2
ADC_REGULAR_RANK_3 3
ADC_REGULAR_RANK_4 4
ADC_REGULAR_RANK_5 5
ADC_REGULAR_RANK_6 6
ADC_REGULAR_RANK_7 7
ADC_REGULAR_RANK_8 8
ADC_REGULAR_RANK_9 9
ADC_REGULAR_RANK_10 10
ADC_REGULAR_RANK_11 11
ADC_REGULAR_RANK_12 12
ADC_REGULAR_RANK_13 13
ADC_REGULAR_RANK_14 14
ADC_REGULAR_RANK_15 15
ADC_REGULAR_RANK_16 16
SamplingTime:用于所选通道的采样时间配置,ADC的采样速度是由采样时间和转换时间同决定。用于内部通道测量时(VrefInt/Vbat/TempSensor),务必要遵循数据手册要求的参数范围。
ADC_SAMPLETIME_1CYCLE_5 采样时间1.5 ADC时钟周期
ADC_SAMPLETIME_7CYCLES_5 采样时间7.5 ADC时钟周期
ADC_SAMPLETIME_13CYCLES_5 采样时间13.5 ADC时钟周期
ADC_SAMPLETIME_28CYCLES_5 采样时间28.5 ADC时钟周期
ADC_SAMPLETIME_41CYCLES_5 采样时间41.5 ADC时钟周期
ADC_SAMPLETIME_55CYCLES_5 采样时间55.5 ADC时钟周期
ADC_SAMPLETIME_71CYCLES_5 采样时间71.5 ADC时钟周期
ADC_SAMPLETIME_239CYCLES_5 采样时间239.5 ADC时钟周期
typedef struct
{
uint32_t WatchdogMode;
uint32_t Channel;
FunctionalState ITMode;
uint32_t HighThreshold;
uint32_t LowThreshold;
uint32_t WatchdogNumber;
}ADC_AnalogWDGConfTypeDef;
WatchdogMode:此参数用于设置模拟看门狗模式。
ADC analog watchdog mode
ADC_ANALOGWATCHDOG_NONE
ADC_ANALOGWATCHDOG_SINGLE_REG
ADC_ANALOGWATCHDOG_SINGLE_INJEC
ADC_ANALOGWATCHDOG_SINGLE_REGINJEC
ADC_ANALOGWATCHDOG_ALL_REG
ADC_ANALOGWATCHDOG_ALL_INJEC
ADC_ANALOGWATCHDOG_ALL_REGINJEC
Channel:用于配置要监测的通道。对于模拟看门狗1,参数成员WatchdogMode配置为单个通道时,此参数才有意义。 对于模拟看门狗2和3,每调用一次函数HAL_ADC_AnalogWDGConfig可以指定一个通道,如果要复位那个通道,将参数WatchdogMode配置为ADC_ANALOGWATCHDOG_NONE即可。
ITMode:用于配置模拟看门狗为中断方式或者查询方式。配置为ENABEL表示使用中断方式,配置为DISABLE表示查询方式。
HighThreshold:用于配置模拟看门狗高阀值。根据配置的ADC的分辨率16, 14, 12, 10或者8bit,高阀值最小都是0x0000,最大值分别是0xFFFF, 0x3FFF, 0xFFF, 0x3FF 和 0xFF。
LowThreshold:用于配置模拟看门狗低阀值。根据配置的ADC的分辨率16, 14, 12, 10或者8bit,高阀值最小都是0x0000,最大值分别是0xFFFF, 0x3FFF, 0xFFF, 0x3FF 和 0xFF。
WatchdogNumber:此参数成员用于配置选择那个看门狗监测通道。
ADC_ANALOGWATCHDOG_1
ADC_ANALOGWATCHDOG_2
ADC_ANALOGWATCHDOG_3
typedef struct __ADC_HandleTypeDef
{
ADC_TypeDef *Instance;
ADC_InitTypeDef Init;
DMA_HandleTypeDef *DMA_Handle;
HAL_LockTypeDef Lock;
__IO uint32_t State;
__IO uint32_t ErrorCode;
}ADC_HandleTypeDef;
*Instance:这个参数是寄存器的例化,方便操作寄存器,比如使能ADC内部稳压器。
SET_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN);
Init: 这个参数是用户接触最多的,用于配置ADC的基本参数,像ADC时钟、分辨率、扫描模式、过采样等。
*DMA_Handle:如果ADC使用DMA模式的话,此参数用于关联DMA的句柄,方便DMA的配置。
HAL_LockTypeDef Lock
__IO uint32_t State;
__IO uint32_t ErrorCode
这三个变量主要供函数内部使用。Lock用于设置锁状态,State用于设置ADC通信状态,而ErrorCode用于配置代码错误。
InjectionConfig:用于配置ADC注入模式。
函数 | 功能 |
HAL_ADC_Init() | 根据结构“ADC InitTvpeDef”中指定的参数初始化ADC外围和常规组 |
HAL_ADC_DeInit() | 通过对ADC MSP的初始化,将ADC外围寄存器初始化为它们的默认重置值 |
HAL_ADC_MspInit() | 初始化ADC MSP |
HAL_ADC_MspDeInit() | 重置ADC MSP |
HAL_ADC_Start() | 启用ADC,开始常规组转换 |
HAL_ADC_Stop() | 停止常规组ADC转换(自动注入模式下停止注入通道),关闭ADC外设 |
HAL_ADC_PollForConversion() | 等待规则组转换完成 |
HAL_ADC_PollForEvent() | 转换事件轮询 |
HAL_ADC_Start_IT() | 启用ADC,开始有中断的常规组转换 |
HAL_ADC_Stop_IT() | 停止常规组(自动注入组和注入组)的ADC转换,禁用转换结束中断,禁用ADC外设 |
HAL_ADC_Start_DMA() | 启用ADC,开始常规组转换,并通过DMA传输结果 |
HAL_ADC_Stop_DMA() | 停止常规组(自动注入组和注入组)的ADC转换,禁用ADC DMA传输。禁用ADC外围 |
HAL_ADC_GetValue() | 得到ADC常规组转换结果 |
HAL_ADC_IRQHandler() | 处理ADC中断请求 |
HAL_ADC_ConvCpltCallback() | 转换完成回调在非阻塞模式 |
HAL_ADC_ConvHalfCpltCallback() | 在非阻塞模式下转换DMA半转移回调 |
HAL_ADC_LevelOutOfWindowCallback() | 模拟看门狗回叫在非阻塞模式 |
HAL_ADC_ErrorCallback() | 非阻塞模式下的ADC错误回调(带有中断或DMA传输的ADC转换) |
HAL_ADC_ConfigChannel() | 配置要链接到正规组的所选通道 |
HAL_ADC_AnalogWDGConfig() | 配置模拟看门狗 |
HAL_ADC_GetState() | 返回ADC状态 |
HAL_ADC_GetError() | 返回ADC错误码 |
1.启用ADC接口
示例:Into HAL_ADC_MspInit()(推荐的代码位置)或with其他设备时钟参数配置:
RCC_PeriphCLKInitTypeDef PeriphClkInit;
__ADC1_CLK_ENABLE();
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
2. ADC引脚配置
3. 可选地,在ADC使用中断的情况下:
4. 可选地,在使用DMA时:
将ADC中断处理函数HAL_ADC_IRQHandler()插入对应DMA中断向量的函数DMAx_Channelx_IRQHandler()。