HAL驱动库学习-ADC

如何使用ADC驱动库
1  实现如下两个函数
    a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式, 可选 DMA,中断
    b:HAL_ADC_MspDeInit() 与   HAL_ADC_MspInit()作用相反,用来关闭ADC, 可选 DMA,中断
2  配置ADC参数,详细参数描述参考ADC属性定义。通过HAL_ADC_Init()来加载参数
3  配置ADC通道,包括使用的通道,采样时间等 HAL_ADC_ConfigChannel()
4  校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准),必须在ADC转换启动前或停止后
5  使用下面函数中的一个激活ADC外设:
    HAL_ADC_Start() -- 轮询模式
    HAL_ADC_Start_IT(), -- 中断模式
    HAL_ADC_Start_DMA(). -- DMA模式

ADC属性定义
复制代码
•  uint32_tClockPrescaler--时钟源,同步PLL,异步HSI  ADC_CLOCK_ASYNC,ADC_CLOCK_SYNC_PCLK_DIV2,ADC_CLOCK_SYNC_PCLK_DIV4,ADC_CLOCKPRESCALER_PCLK_DIV2,ADC_CLOCKPRESCALER_PCLK_DIV4
•  uint32_tResolution  -- ADC分辨率(6,8,10,12)ADC_RESOLUTION12b........
•  uint32_tDataAlign   --数据对齐方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT
•  uint32_tScanConvMode--配置规则组序列,该参数可以关联“DiscontinuousConvMode”对主序列细分,如果设置多个通道则序列自动使能;如果只有一个通道,执行单一转换模式;如果有多个通道,执行序列转换模式;Rank(队列)定义为通道号,rank0->channel0,rank1-->channel1.....;扫描方向可以递增(0-->18)或递减(18-->0)ADC_SCAN_DIRECTION_FORWARD,ADC_SCAN_DIRECTION_BACKWARD,ADC_SCAN_ENABLE
•  uint32_tEOCSelection   -- EOC(EndOfConversion),用来做轮询或中断标记;每个rank转换结束,或序列转换结束;EOC_SINGLE_CONV,EOC_SEQ_CONV,EOC_SINGLE_SEQ_CONV(保留供以后用)
•  uint32_tLowPowerAutoWait
•  uint32_tLowPowerAutoPowerOff
•  uint32_tContinuousConvMode  --定义当选择的触发事件(软件触发 or 外部触发)发生后规则组执行单一转换还是连续转换 ENABLE or DISABLE
•  uint32_tDiscontinuousConvMode---指定当规则组是完整序列/非连续序列(序列分布在)时是否转换序列;只有在Continuous禁用时,DisContinuous才有效;如果ContinuousConvMode使能,则该参数抛弃
•  uint32_tExternalTrigConv  --触发方式 ADC_SOFTWARE_START 外部触发禁止,使用软件触发
•  uint32_tExternalTrigConvEdge  --外部触发规则,ADC_EXTERNALTRIGCONVEDGE_NONE,ADC_EXTERNALTRIGCONVEDGE_RISING,ADC_EXTERNALTRIGCONVEDGE_FALLING,ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING 
•  uint32_tDMAContinuousRequests--//DMA转换请求,指定DMA执行单次(当转换数达标时停止传送)or连续请求模式;备注:连续模式:
//DMA必须配置为循环模式,否则当DMA buffer存满时将触发溢出; ENABLE or DISABLE

• uint32_tOverrun--选择数据溢出时的行为:保存数据或覆盖数据;这个参数只作用于规则组,包含DMA

说明:
ContinuousConvModeDiscontinuousConvMode 通道结束序列结束  
DISABLEDISABLE单次转换EOCEOS单次转换触发一次,转换一个序列(转换所有被选通道),转换结束后停止
ENABLE无效连续转换EOCEOS连续转换触发一次,转换一个序列(转换所有被选通道),转换结束后自动重新开始
DISABLEENABLE断续转换EOCEOS断续转换触发一次,转换一个通道,在触发,在转换。在所选转换通道循环
 
ADC方法:
    1  初始化函数
        a  自定义初始化            
 HAL_ADC_Init()       用户自行调用 加载ADC属性
 HAL_ADC_MspInit()    由HAL_ADC_Init()调用,对底层初始化,主要包括时钟,IO,DMA等

        b 缺醒初始化   

1
2
HAL_ADC_DeInit()       用户自行调用,退出ADC
HAL_ADC_MspDeInit()    由 HAL_ADC_DeInit()调用,操作底层,关闭时钟,IO等

    2   IO操作函数(轮询,中断,DMA 3中编程模型)

        a  激活ADC,启动转换规则组              
1
2
3
•  HAL_ADC_Start()
•  HAL_ADC_Start_IT()  中断模式ADC_EOC_SINGLE_CONV通道转换结束,EOC_SEQ_CONV序列转换结束
•  HAL_ADC_Start_DMA()

         b  关闭ADC,停止转换规则组

1
2
3
•  HAL_ADC_Stop()
•  HAL_ADC_Stop_IT()
•  HAL_ADC_Stop_DMA()
         C  读取ADC值
                •  HAL_ADC_GetValue()
         d  其他
1
2
3
4
5
6
7
8
9
•  HAL_ADC_PollForConversion()      等待转换结束,不适用一下情况:DMA模式且轮询每个转换(ADC_EOC_SINGLE_CONV)
•  HAL_ADC_PollForEvent()
•  HAL_ADC_IRQHandler()             ADC中断请求,在<stm32fxx_it.c>中调用
 
// 回调函数,“weak”属性,使用时再在应用代码中实现 
•  HAL_ADC_ConvCpltCallback()         转换完成后回调,DMA模式下DMA传输完成后调用
•  HAL_ADC_ConvHalfCpltCallback()  转换过程中回调
•  HAL_ADC_LevelOutOfWindowCallback()
•  HAL_ADC_ErrorCallback()

    3  外设控制函数--动态配置外设参数

              •  HAL_ADC_ConfigChannel()  配置规则组通道
               •  HAL_ADC_AnalogWDGConfig()
   4  状态函数--返回运行状态获取错误信息
               •  HAL_ADC_GetState()
               •  HAL_ADC_GetError()
 
例子, ADC工作状态均为非阻塞 
     1  轮询模式  -- 非阻塞    
1
2
3
4
5
6
7
8
9
10
/*##-3- Start the conversion process ######/
if(HAL_ADC_Start(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
/*##-4- Wait for the end of conversion ######/
HAL_ADC_PollForConversion(&AdcHandle, 10);
if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG)
{
/*##-5- Get the converted value of channel ##*/
uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
}

     2  中断模式

1
2
3
4
5
6
7
/*##-3- Start the conversion process ######/
if(HAL_ADC_StartIT(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Get the converted value of regular channel */
uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
}

     3  DMA模式

1
2
3
4
5
6
7
/*##-3- Start the conversion process ######/
if(HAL_ADC_StartDMA(&AdcHandle,&uhADCxConvertedValue,1) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Turn LED1 on: Transfer process is correct */
BSP_LED_On(LED1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值