STM32G474xx HAL 用户手册
stm32g4xx_hal_adc.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_adc.c
00004   * @author  MCD Application Team
00005   * @brief   本文件提供管理以下模数转换器 (ADC)
00006   *          外设功能的固件函数:
00007   *          外设功能:
00008   *           + 初始化和反初始化函数
00009   *           + 外设控制函数
00010   *           + 外设状态函数
00011   *          其他函数(扩展函数)可在文件
00012   *          "stm32g4xx_hal_adc_ex.c" 中找到。
00013   *
00014   ******************************************************************************
00015   * @attention
00016   *
00017   * Copyright (c) 2019 STMicroelectronics.
00018   * 保留所有权利。
00019   *
00020   * 本软件的许可条款可在本软件组件根目录中的 LICENSE 文件中找到。
00021   * 如果本软件不附带 LICENSE 文件,则按原样提供。
00022   *
00023   ******************************************************************************
00024   @verbatim
00025   ==============================================================================
00026                      ##### ADC 外设特性 #####
00027   ==============================================================================
00028   [..]
00029   (+) 12位、10位、8位或6位可配置分辨率。
00030 
00031   (+) 在常规转换结束以及模拟看门狗或溢出事件发生时产生中断。
00032 
00033   (+) 单次和连续转换模式。
00034 
00035   (+) 用于顺序转换多个通道的扫描模式。
00036 
00037   (+) 具有内置数据一致性的数据对齐。
00038 
00039   (+) 可编程采样时间(按通道)
00040 
00041   (+) 具有可配置极性的外部触发器(定时器或 EXTI)
00042 
00043   (+) 用于传输常规组转换数据的 DMA 请求生成。
00044 
00045   (+) 双重交错模式下可配置的转换间延迟。
00046 
00047   (+) ADC 通道可选择单端/差分输入。
00048 
00049   (+) ADC 偏移量在 4 个偏移实例上共享。
00050   (+) ADC 增益补偿
00051 
00052   (+) ADC 校准
00053 
00054   (+) 常规组的 ADC 转换。
00055 
00056   (+) ADC 供电要求:1.62 V 至 3.6 V。
00057 
00058   (+) ADC 输入范围:从 Vref-(连接到 Vssa)到 Vref+(连接到
00059       Vdda 或外部电压基准)。
00060 
00061 
00062                      ##### 如何使用此驱动程序 #####
00063   ==============================================================================
00064     [..]
00065 
00066      *** 配置与 ADC 相关的顶层参数 ***
00067      ============================================================
00068      [..]
00069 
00070     (#) 使能 ADC 接口
00071         (++) 前提条件:必须在 RCC 顶层配置 ADC 时钟。
00072 
00073         (++) 必须进行两项时钟设置:
00074              (+++) ADC 时钟(核心时钟,也可能是转换时钟)。
00075 
00076              (+++) ADC 时钟(转换时钟)。
00077                    两种可能的时钟源:从 AHB 时钟派生的同步时钟
00078                    或从系统时钟或 PLL(输出分频器 P)派生的异步时钟,
00079                    运行频率最高可达 75MHz。
00080 
00081              (+++) 示例:
00082                    在 HAL_ADC_MspInit()(推荐的代码位置)中或与其他
00083                    设备时钟参数配置一起:
00084                (+++) __HAL_RCC_ADC_CLK_ENABLE();                  (必需)
00085 
00086                RCC_ADCCLKSOURCE_PLL 使能:                       (可选:如果选择了异步时钟)
00087                (+++) RCC_PeriphClkInitTypeDef   RCC_PeriphClkInit;
00088                (+++) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
00089                (+++) PeriphClkInit.AdcClockSelection    = RCC_ADCCLKSOURCE_PLL;
00090                (+++) HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
00091 
00092         (++) ADC 时钟源和时钟分频器在 ADC 层面使用
00093              参数 "ClockPrescaler" 通过函数 HAL_ADC_Init() 进行配置。
00094 
00095     (#) ADC 引脚配置
00096          (++) 使用宏 __HAL_RCC_GPIOx_CLK_ENABLE() 使能 ADC GPIO 的时钟
00097          (++) 使用函数 HAL_GPIO_Init() 将这些 ADC 引脚配置为模拟模式
00098 
00099     (#) 可选,如果使用带中断的 ADC:
00100          (++) 使用函数 HAL_NVIC_EnableIRQ(ADCx_IRQn) 配置 ADC 的 NVIC
00101          (++) 将 ADC 中断处理函数 HAL_ADC_IRQHandler() 插入
00102               对应 ADC 中断向量 ADCx_IRQHandler() 的函数中。
00103 
00104     (#) 可选,如果使用 DMA:
00105          (++) 使用函数 HAL_DMA_Init() 配置 DMA(DMA 通道、普通或循环模式等)
00106          (++) 使用函数 HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn) 配置 DMA 的 NVIC
00107          (++) 将 ADC 中断处理函数 HAL_ADC_IRQHandler() 插入
00108               对应 DMA 中断向量 DMAx_Channelx_IRQHandler() 的函数中。
00109 
00110      *** 配置 ADC、常规组、通道参数 ***
00111      ================================================================
00112      [..]
00113 
00114     (#) 使用函数 HAL_ADC_Init() 配置 ADC 参数(分辨率、数据对齐等)
00115         和常规组参数(转换触发器、序列器等)。
00116 
00117     (#) 使用函数 HAL_ADC_ConfigChannel() 配置常规组的通道参数(通道号、
00118         通道在序列器中的排名等)。
00119 
00120     (#) 可选,使用函数 HAL_ADC_AnalogWDGConfig() 配置模拟看门狗参数(监控的通道、
00121         阈值等)。
00122 
00123      *** 执行 ADC 转换 ***
00124      ====================================
00125      [..]
00126 
00127     (#) 可选,执行自动 ADC 校准以提高转换精度
00128         使用函数 HAL_ADCEx_Calibration_Start()。
00129 
00130     (#) ADC 驱动程序可在三种模式下使用:轮询、中断、
00131         DMA 传输。
00132 
00133         (++) 通过轮询进行 ADC 转换:
00134           (+++) 使用函数 HAL_ADC_Start() 激活 ADC 外设并启动转换
00135           (+++) 使用函数 HAL_ADC_PollForConversion() 等待 ADC 转换完成
00136           (+++) 使用函数 HAL_ADC_GetValue() 获取转换结果
00137           (+++) 使用函数 HAL_ADC_Stop() 停止转换并禁用 ADC 外设
00138 
00139         (++) 通过中断进行 ADC 转换:
00140           (+++) 使用函数 HAL_ADC_Start_IT() 激活 ADC 外设并启动转换
00141           (+++) 通过调用函数 HAL_ADC_ConvCpltCallback() 等待 ADC 转换完成
00142                 (此函数必须在用户程序中实现)
00143           (+++) 使用函数 HAL_ADC_GetValue() 获取转换结果
00144           (+++) 使用函数 HAL_ADC_Stop_IT() 停止转换并禁用 ADC 外设
00145 
00146         (++) 通过 DMA 传输进行 ADC 转换:
00147           (+++) 使用函数 HAL_ADC_Start_DMA() 激活 ADC 外设并启动转换
00148           (+++) 通过调用函数 HAL_ADC_ConvCpltCallback() 或 HAL_ADC_ConvHalfCpltCallback()
00149                 等待 ADC 转换完成(这些函数必须在用户程序中实现)
00150           (+++) 转换结果通过 DMA 自动传输到目标变量地址。
00151           (+++) 使用函数 HAL_ADC_Stop_DMA() 停止转换并禁用 ADC 外设
00152 
00153      [..]
00154 
00155     (@) 回调函数必须在用户程序中实现:
00156       (+@) HAL_ADC_ErrorCallback()
00157       (+@) HAL_ADC_LevelOutOfWindowCallback()(模拟看门狗回调)
00158       (+@) HAL_ADC_ConvCpltCallback()
00159       (+@) HAL_ADC_ConvHalfCpltCallback
00160 
00161      *** ADC 反初始化 ***
00162      ============================================================
00163      [..]
00164 
00165     (#) 禁用 ADC 接口
00166       (++) 可以在 RCC 顶层对 ADC 时钟进行硬复位和禁用。
00167         (++) 使用宏 __ADCx_FORCE_RESET()、__ADCx_RELEASE_RESET() 对 ADC 外设进行硬复位。
00168         (++) 使用与配置步骤等效的宏/函数禁用 ADC 时钟。
00169              (+++) 示例:
00170                    在 HAL_ADC_MspDeInit()(推荐的代码位置)中或与其他
00171                    设备时钟参数配置一起:
00172                (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
00173                (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (如果未用于系统时钟)
00174                (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
00175 
00176     (#) ADC 引脚配置
00177          (++) 使用宏 __HAL_RCC_GPIOx_CLK_DISABLE() 禁用 ADC GPIO 的时钟
00178 
00179     (#) 可选,如果使用带中断的 ADC:
00180          (++) 使用函数 HAL_NVIC_EnableIRQ(ADCx_IRQn) 禁用 ADC 的 NVIC
00181 
00182     (#) 可选,如果使用 DMA:
00183          (++) 使用函数 HAL_DMA_Init() 反初始化 DMA
00184          (++) 使用函数 HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn) 禁用 DMA 的 NVIC
00185 
00186     [..]
00187 
00188     *** 回调注册 ***
00189     =============================================