|
STM32G474xx HAL 用户手册
|
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 =============================================