STM32F1xx HAL库 中文详解 之 ADC篇

本文主要从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 V3.6 V,低速时降低到1.8 V  

●ADC输入范围:Vref-(连接到vsa)Vref+(连接到Vdda或外部参考电压)

一、结构体

1.ADC_InitTypeDef

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          失能

NbrOfConversionADC要转化的通道数目,可以设置为1-16,直接填写数字 1-16

DiscontinuousConvMode指定正则组的转换序列是否在全序/不连续序(主序又分为连续的部分)。 只有在启用了音序器时才使用不连续模式(参数“ScanConvMode”)。 如果sequencer被禁用,该参数将被丢弃。 只有在禁用连续模式的情况下,才能启用不连续模式。 如果连续模式开启时,该参数将被丢弃。 该参数可以设置为启用或禁用。

宏定义:

       Enable           使能

       Disable          失能

NbrOfDiscConversion指定主序列的不连续转换的次数regular group(参数NbrOfConversion)将被细分。 如果参数DiscontinuousConvMode被禁用,该参数将被丢弃。 这个参数必须是Min_Data = 1Max_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          选择定时器3TRGO作为转换外部触发

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          选择定时器8TRGO作为转换外部触发

ADC_SOFTWARE_START                                   选择软件触发

2.ADC_ChannelConfTypeDef

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时钟周期

3.ADC_AnalogWDGConfTypeDef

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配置为单个通道时,此参数才有意义。 对于模拟看门狗23,每调用一次函数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      

4.ADC_HandleTypeDef

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注入模式。

二、函数

2.1所有函数的概括及功能

函数 功能
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错误码

三、ADC的使用

3.1配置ADC相关的顶级参数:

1.启用ADC接口

  • 作为先决条件,ADC时钟必须配置在RCC顶级。 注意:STM32F1, ADC时钟频率最大值为14MHz(参考设备数据表)。因此,在ADC时钟功能中必须配置ADC时钟预分器源频率保持在这个最大频率以下。  
  • 一个时钟设置是强制性的: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引脚配置

  • 使用宏 __HAL_RCC_GPIOx_CLK_ENABLE() 为ADC gpio启用时钟
  • 使用函数HAL_GPIO_Init()在模拟模式下配置这些ADC引脚

3. 可选地,在ADC使用中断的情况下:

  • 使用功能HAL_NVIC_EnableIRQ(ADCx_IRQn)配置ADC的NVIC 
  • 将ADC中断处理函数HAL_ADC_IRQHandler()插入对应ADC中断向量ADCx_IRQHandler()的函数。 

4. 可选地,在使用DMA:

  • 配置DMA (DMA通道,模式正常或循环,…)使用功能HAL_DMA_Init()。  
  • 配置NVIC for DMA using功能HAL_NVIC_EnableIRQ (DMAx_Channelx_IRQn)  

将ADC中断处理函数HAL_ADC_IRQHandler()插入对应DMA中断向量的函数DMAx_Channelx_IRQHandler()。

版权声明:本文为CSDN博主「逆行者Fy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37255752/article/details/120763955

生成海报
点赞 0

逆行者Fy

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32CubeMx hal 驱动sg90舵机

一、舵机的控制原理 舵机通过接收PWM信号,使其进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。即给舵机一个

X-bot

X-bot 前言 这个项目是我在稚辉君的视频里面看见的,是一个完全开源的项目,而且对他来说是一个比较简单的项目,但对于我这种没有什么DIY经验的同学来说,还是有点难的,不过