说明:
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 */ |