打印

HAL库ADC源文件stm32h7xx_hal_adc.c学习笔记(2018-09-03 V1.0)

[复制链接]
227|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说明:
ADC的API注意事项比较多,几乎每个函数都有个注意事项,使用时要特别注意。


==============================================================================
                                                                  ##### ADC规格特性  #####
==============================================================================  
1、16位,14位,12位,10位,8位分辨率配置。
2、规则通道转换完毕可以产生中断。3、单次和连续转换模式。
4、多通道扫描
5、数据对齐格式
6、编程采样时间
7、外部触发(定时器或EXTI)
8、支持DMA
9、双通道快速交替采样之间的延迟时间配置
10、ADC偏移值配置
11、ADC支持校准。
12、ADC支持规则通道转换额注入通道转换
13、ADC供电范围:1.62 V to 3.6 V
14、ADC输入电压范围:Vref- (连接到 Vssa) to Vref+ (连接到外部参考电压)。


==============================================================================
                                                                  ##### ADC驱动如何使用  #####
==============================================================================  
1、有两个需要设置(这个问题待看手册了确认)
(1)ADC核心时钟
(2)ADC转换时钟
两种时钟源可供选择,可以选择AHB时钟,也可以选择来自系统时钟,PLL2或者PLL3的时钟。
比如使用PLL2:
RCC_PeriphClkInitTypeDef   RCC_PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection    = RCC_ADCCLKSOURCE_PLL2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);


2、ADC的时钟源和时钟分频通过函数HAL_ADC_Init()的参数ClockPrescaler可配置。

3、ADC引脚配置:
__HAL_RCC_GPIOx_CLK_ENABLE()
HAL_GPIO_Init()

4、配置ADC中断
(1)函数HAL_NVIC_EnableIRQ(ADCx_IRQn)
(2)函数ADCx_IRQHandler()调用HAL_ADC_IRQHandler()

5、配置ADC的DMA
(1)使用函数配置DMA的相关参数HAL_DMA_Init()
(2)使能DMA中断 HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
(3)中断函数里面调用DMAx_Channelx_IRQHandler()

6、规则通道相关的三个配置函数
HAL_ADC_Init()
HAL_ADC_ConfigChannel()
HAL_ADC_AnalogWDGConfig()

7、ADC的自动校准配置函数
HAL_ADCEx_Calibration_Start()

8、ADC数值获取
(1)查询方式
HAL_ADC_Start()
HAL_ADC_PollForConversion()
HAL_ADC_GetValue()
HAL_ADC_Stop()

(2)中断方式
HAL_ADC_Start_IT()
HAL_ADC_ConvCpltCallback()
HAL_ADC_GetValue()
HAL_ADC_Stop_IT()

(3)DMA方式
HAL_ADC_Start_DMA()
HAL_ADC_ConvCpltCallback() 和 HAL_ADC_ConvHalfCpltCallback()
HAL_ADC_Stop_DMA()

9、回调函数
HAL_ADC_ErrorCallback()
HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
HAL_ADC_ConvCpltCallback()
HAL_ADC_ConvHalfCpltCallback

10、复位ADC
(1)复位ADC外设
__HAL_RCC_ADCx_FORCE_RESET(), __HAL_RCC_ADCx_RELEASE_RESET()

(2)函数可以复位相关引脚设计HAL_ADC_MspDeInit()。函数 __HAL_RCC_ADC_CLK_DISABLE();  用于关闭ADC

(3)函数 __HAL_RCC_GPIOx_CLK_DISABLE()用于禁止ADC的IO

(4)函数HAL_NVIC_DisableIRQ(ADCx_IRQn)用于禁止ADC中断

(5)函数HAL_NVIC_DisableIRQ(DMAx_Channelx_IRQn)用于禁止ADC的DMA中断


源文件开头的等待时间配置:

/* Delay to wait before setting ADEN once ADCAL has been reset
   must be at least 4 ADC clock cycles.
   Assuming lowest ADC clock (350 KHz according to DS), this
   4 ADC clock cycles duration is equal to
   4 / 350,000 = 0.011 ms.
   ADC_ENABLE_TIMEOUT set to 2 is a margin large enough to ensure
   the 4 ADC clock cycles have elapsed while waiting for ADRDY
   to become 1 */
  #define ADC_ENABLE_TIMEOUT              ((uint32_t)  2)    /*!< ADC enable time-out value  */
  #define ADC_DISABLE_TIMEOUT             ((uint32_t)  2)    /*!< ADC disable time-out value */

/* Timeout to wait for current conversion on going to be completed.           */
/* Timeout fixed to worst case, for 1 channel.                                */
/*   - maximum sampling time (830.5 adc_clk)                                  */
/*   - ADC resolution (Tsar 16 bits= 16.5 adc_clk)                            */
/*   - ADC clock with prescaler 256                                           */
/*     823 * 256 = 210688 clock cycles max                                    */
/* Unit: cycles of CPU clock.                                                 */
#define ADC_CONVERSION_TIME_MAX_CPU_CYCLES ((uint32_t) 210688)  /*!< ADC conversion completion time-out value */

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

376

主题

377

帖子

0

粉丝