mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed Sep 30 17:00:09 2015 +0100
Revision:
636:a11c0372f0ba
Parent:
631:825f75ca301e
Synchronized with git revision d29c98dae61be0946ddf3a3c641c7726056f9452

Full URL: https://github.com/mbedmicro/mbed/commit/d29c98dae61be0946ddf3a3c641c7726056f9452/

Added support for SAMW25

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 340:28d1f895c6fe 1 /**
mbed_official 340:28d1f895c6fe 2 ******************************************************************************
mbed_official 340:28d1f895c6fe 3 * @file stm32f0xx_hal_adc.c
mbed_official 340:28d1f895c6fe 4 * @author MCD Application Team
mbed_official 631:825f75ca301e 5 * @version V1.3.0
mbed_official 631:825f75ca301e 6 * @date 26-June-2015
mbed_official 340:28d1f895c6fe 7 * @brief This file provides firmware functions to manage the following
mbed_official 340:28d1f895c6fe 8 * functionalities of the Analog to Digital Convertor (ADC)
mbed_official 340:28d1f895c6fe 9 * peripheral:
mbed_official 340:28d1f895c6fe 10 * + Initialization and de-initialization functions
mbed_official 340:28d1f895c6fe 11 * ++ Initialization and Configuration of ADC
mbed_official 340:28d1f895c6fe 12 * + Operation functions
mbed_official 631:825f75ca301e 13 * ++ Start, stop, get result of conversions of regular
mbed_official 631:825f75ca301e 14 * group, using 3 possible modes: polling, interruption or DMA.
mbed_official 340:28d1f895c6fe 15 * + Control functions
mbed_official 631:825f75ca301e 16 * ++ Channels configuration on regular group
mbed_official 340:28d1f895c6fe 17 * ++ Analog Watchdog configuration
mbed_official 340:28d1f895c6fe 18 * + State functions
mbed_official 340:28d1f895c6fe 19 * ++ ADC state machine management
mbed_official 340:28d1f895c6fe 20 * ++ Interrupts and flags management
mbed_official 631:825f75ca301e 21 * Other functions (extended functions) are available in file
mbed_official 631:825f75ca301e 22 * "stm32f0xx_hal_adc_ex.c".
mbed_official 631:825f75ca301e 23 *
mbed_official 340:28d1f895c6fe 24 @verbatim
mbed_official 340:28d1f895c6fe 25 ==============================================================================
mbed_official 631:825f75ca301e 26 ##### ADC peripheral features #####
mbed_official 340:28d1f895c6fe 27 ==============================================================================
mbed_official 631:825f75ca301e 28 [..]
mbed_official 631:825f75ca301e 29 (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution
mbed_official 340:28d1f895c6fe 30
mbed_official 631:825f75ca301e 31 (+) Interrupt generation at the end of regular conversion and in case of
mbed_official 340:28d1f895c6fe 32 analog watchdog or overrun events.
mbed_official 340:28d1f895c6fe 33
mbed_official 631:825f75ca301e 34 (+) Single and continuous conversion modes.
mbed_official 340:28d1f895c6fe 35
mbed_official 631:825f75ca301e 36 (+) Scan mode for conversion of several channels sequentially.
mbed_official 340:28d1f895c6fe 37
mbed_official 631:825f75ca301e 38 (+) Data alignment with in-built data coherency.
mbed_official 340:28d1f895c6fe 39
mbed_official 631:825f75ca301e 40 (+) Programmable sampling time (common for all channels)
mbed_official 340:28d1f895c6fe 41
mbed_official 631:825f75ca301e 42 (+) ADC conversion of regular group.
mbed_official 340:28d1f895c6fe 43
mbed_official 631:825f75ca301e 44 (+) External trigger (timer or EXTI) with configurable polarity
mbed_official 340:28d1f895c6fe 45
mbed_official 631:825f75ca301e 46 (+) DMA request generation for transfer of conversions data of regular group.
mbed_official 340:28d1f895c6fe 47
mbed_official 631:825f75ca301e 48 (+) ADC calibration
mbed_official 340:28d1f895c6fe 49
mbed_official 631:825f75ca301e 50 (+) ADC supply requirements: 2.4 V to 3.6 V at full speed and down to 1.8 V at
mbed_official 340:28d1f895c6fe 51 slower speed.
mbed_official 340:28d1f895c6fe 52
mbed_official 631:825f75ca301e 53 (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
mbed_official 340:28d1f895c6fe 54 Vdda or to an external voltage reference).
mbed_official 340:28d1f895c6fe 55
mbed_official 340:28d1f895c6fe 56
mbed_official 340:28d1f895c6fe 57 ##### How to use this driver #####
mbed_official 340:28d1f895c6fe 58 ==============================================================================
mbed_official 340:28d1f895c6fe 59 [..]
mbed_official 340:28d1f895c6fe 60
mbed_official 631:825f75ca301e 61 *** Configuration of top level parameters related to ADC ***
mbed_official 631:825f75ca301e 62 ============================================================
mbed_official 631:825f75ca301e 63 [..]
mbed_official 631:825f75ca301e 64
mbed_official 631:825f75ca301e 65 (#) Enable the ADC interface
mbed_official 631:825f75ca301e 66 (++) As prerequisite, ADC clock must be configured at RCC top level.
mbed_official 631:825f75ca301e 67 Caution: On STM32F0, ADC clock frequency max is 14MHz (refer
mbed_official 631:825f75ca301e 68 to device datasheet).
mbed_official 631:825f75ca301e 69 Therefore, ADC clock prescaler must be configured in
mbed_official 631:825f75ca301e 70 function of ADC clock source frequency to remain below
mbed_official 631:825f75ca301e 71 this maximum frequency.
mbed_official 631:825f75ca301e 72
mbed_official 631:825f75ca301e 73 (++) Two clock settings are mandatory:
mbed_official 631:825f75ca301e 74 (+++) ADC clock (core clock, also possibly conversion clock).
mbed_official 340:28d1f895c6fe 75
mbed_official 631:825f75ca301e 76 (+++) ADC clock (conversions clock).
mbed_official 631:825f75ca301e 77 Two possible clock sources: synchronous clock derived from APB clock
mbed_official 631:825f75ca301e 78 or asynchronous clock derived from ADC dedicated HSI RC oscillator
mbed_official 631:825f75ca301e 79 14MHz.
mbed_official 631:825f75ca301e 80 If asynchronous clock is selected, parameter "HSI14State" must be set either:
mbed_official 631:825f75ca301e 81 - to "...HSI14State = RCC_HSI14_ADC_CONTROL" to let the ADC control
mbed_official 631:825f75ca301e 82 the HSI14 oscillator enable/disable (if not used to supply the main
mbed_official 631:825f75ca301e 83 system clock): feature used if ADC mode LowPowerAutoPowerOff is
mbed_official 631:825f75ca301e 84 enabled.
mbed_official 631:825f75ca301e 85 - to "...HSI14State = RCC_HSI14_ON" to maintain the HSI14 oscillator
mbed_official 631:825f75ca301e 86 always enabled: can be used to supply the main system clock.
mbed_official 631:825f75ca301e 87
mbed_official 631:825f75ca301e 88 (+++) Example:
mbed_official 631:825f75ca301e 89 Into HAL_ADC_MspInit() (recommended code location) or with
mbed_official 631:825f75ca301e 90 other device clock parameters configuration:
mbed_official 631:825f75ca301e 91 (+++) __HAL_RCC_ADC1_CLK_ENABLE(); (mandatory)
mbed_official 631:825f75ca301e 92
mbed_official 631:825f75ca301e 93 HI14 enable or let under control of ADC: (optional: if asynchronous clock selected)
mbed_official 631:825f75ca301e 94 (+++) RCC_OscInitTypeDef RCC_OscInitStructure;
mbed_official 631:825f75ca301e 95 (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
mbed_official 631:825f75ca301e 96 (+++) RCC_OscInitStructure.HSI14CalibrationValue = RCC_HSI14CALIBRATION_DEFAULT;
mbed_official 631:825f75ca301e 97 (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_ADC_CONTROL;
mbed_official 631:825f75ca301e 98 (+++) RCC_OscInitStructure.PLL... (optional if used for system clock)
mbed_official 631:825f75ca301e 99 (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
mbed_official 631:825f75ca301e 100
mbed_official 631:825f75ca301e 101 (++) ADC clock source and clock prescaler are configured at ADC level with
mbed_official 631:825f75ca301e 102 parameter "ClockPrescaler" using function HAL_ADC_Init().
mbed_official 340:28d1f895c6fe 103
mbed_official 340:28d1f895c6fe 104 (#) ADC pins configuration
mbed_official 631:825f75ca301e 105 (++) Enable the clock for the ADC GPIOs
mbed_official 631:825f75ca301e 106 using macro __HAL_RCC_GPIOx_CLK_ENABLE()
mbed_official 631:825f75ca301e 107 (++) Configure these ADC pins in analog mode
mbed_official 631:825f75ca301e 108 using function HAL_GPIO_Init()
mbed_official 340:28d1f895c6fe 109
mbed_official 631:825f75ca301e 110 (#) Optionally, in case of usage of ADC with interruptions:
mbed_official 631:825f75ca301e 111 (++) Configure the NVIC for ADC
mbed_official 631:825f75ca301e 112 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
mbed_official 631:825f75ca301e 113 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
mbed_official 631:825f75ca301e 114 into the function of corresponding ADC interruption vector
mbed_official 631:825f75ca301e 115 ADCx_IRQHandler().
mbed_official 631:825f75ca301e 116
mbed_official 631:825f75ca301e 117 (#) Optionally, in case of usage of DMA:
mbed_official 631:825f75ca301e 118 (++) Configure the DMA (DMA channel, mode normal or circular, ...)
mbed_official 631:825f75ca301e 119 using function HAL_DMA_Init().
mbed_official 631:825f75ca301e 120 (++) Configure the NVIC for DMA
mbed_official 631:825f75ca301e 121 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
mbed_official 631:825f75ca301e 122 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
mbed_official 631:825f75ca301e 123 into the function of corresponding DMA interruption vector
mbed_official 631:825f75ca301e 124 DMAx_Channelx_IRQHandler().
mbed_official 340:28d1f895c6fe 125
mbed_official 631:825f75ca301e 126 *** Configuration of ADC, group regular, channels parameters ***
mbed_official 631:825f75ca301e 127 ================================================================
mbed_official 631:825f75ca301e 128 [..]
mbed_official 631:825f75ca301e 129
mbed_official 631:825f75ca301e 130 (#) Configure the ADC parameters (resolution, data alignment, ...)
mbed_official 631:825f75ca301e 131 and regular group parameters (conversion trigger, sequencer, ...)
mbed_official 631:825f75ca301e 132 using function HAL_ADC_Init().
mbed_official 631:825f75ca301e 133
mbed_official 631:825f75ca301e 134 (#) Configure the channels for regular group parameters (channel number,
mbed_official 631:825f75ca301e 135 channel rank into sequencer, ..., into regular group)
mbed_official 631:825f75ca301e 136 using function HAL_ADC_ConfigChannel().
mbed_official 631:825f75ca301e 137
mbed_official 631:825f75ca301e 138 (#) Optionally, configure the analog watchdog parameters (channels
mbed_official 631:825f75ca301e 139 monitored, thresholds, ...)
mbed_official 631:825f75ca301e 140 using function HAL_ADC_AnalogWDGConfig().
mbed_official 631:825f75ca301e 141
mbed_official 631:825f75ca301e 142 *** Execution of ADC conversions ***
mbed_official 631:825f75ca301e 143 ====================================
mbed_official 340:28d1f895c6fe 144 [..]
mbed_official 631:825f75ca301e 145
mbed_official 631:825f75ca301e 146 (#) Optionally, perform an automatic ADC calibration to improve the
mbed_official 631:825f75ca301e 147 conversion accuracy
mbed_official 631:825f75ca301e 148 using function HAL_ADCEx_Calibration_Start().
mbed_official 631:825f75ca301e 149
mbed_official 631:825f75ca301e 150 (#) ADC driver can be used among three modes: polling, interruption,
mbed_official 631:825f75ca301e 151 transfer by DMA.
mbed_official 631:825f75ca301e 152
mbed_official 631:825f75ca301e 153 (++) ADC conversion by polling:
mbed_official 631:825f75ca301e 154 (+++) Activate the ADC peripheral and start conversions
mbed_official 631:825f75ca301e 155 using function HAL_ADC_Start()
mbed_official 631:825f75ca301e 156 (+++) Wait for ADC conversion completion
mbed_official 631:825f75ca301e 157 using function HAL_ADC_PollForConversion()
mbed_official 631:825f75ca301e 158 (+++) Retrieve conversion results
mbed_official 631:825f75ca301e 159 using function HAL_ADC_GetValue()
mbed_official 631:825f75ca301e 160 (+++) Stop conversion and disable the ADC peripheral
mbed_official 631:825f75ca301e 161 using function HAL_ADC_Stop()
mbed_official 631:825f75ca301e 162
mbed_official 631:825f75ca301e 163 (++) ADC conversion by interruption:
mbed_official 631:825f75ca301e 164 (+++) Activate the ADC peripheral and start conversions
mbed_official 631:825f75ca301e 165 using function HAL_ADC_Start_IT()
mbed_official 631:825f75ca301e 166 (+++) Wait for ADC conversion completion by call of function
mbed_official 631:825f75ca301e 167 HAL_ADC_ConvCpltCallback()
mbed_official 631:825f75ca301e 168 (this function must be implemented in user program)
mbed_official 631:825f75ca301e 169 (+++) Retrieve conversion results
mbed_official 631:825f75ca301e 170 using function HAL_ADC_GetValue()
mbed_official 631:825f75ca301e 171 (+++) Stop conversion and disable the ADC peripheral
mbed_official 631:825f75ca301e 172 using function HAL_ADC_Stop_IT()
mbed_official 631:825f75ca301e 173
mbed_official 631:825f75ca301e 174 (++) ADC conversion with transfer by DMA:
mbed_official 631:825f75ca301e 175 (+++) Activate the ADC peripheral and start conversions
mbed_official 631:825f75ca301e 176 using function HAL_ADC_Start_DMA()
mbed_official 631:825f75ca301e 177 (+++) Wait for ADC conversion completion by call of function
mbed_official 631:825f75ca301e 178 HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
mbed_official 631:825f75ca301e 179 (these functions must be implemented in user program)
mbed_official 631:825f75ca301e 180 (+++) Conversion results are automatically transferred by DMA into
mbed_official 631:825f75ca301e 181 destination variable address.
mbed_official 631:825f75ca301e 182 (+++) Stop conversion and disable the ADC peripheral
mbed_official 631:825f75ca301e 183 using function HAL_ADC_Stop_DMA()
mbed_official 631:825f75ca301e 184
mbed_official 631:825f75ca301e 185 [..]
mbed_official 631:825f75ca301e 186
mbed_official 631:825f75ca301e 187 (@) Callback functions must be implemented in user program:
mbed_official 631:825f75ca301e 188 (+@) HAL_ADC_ErrorCallback()
mbed_official 631:825f75ca301e 189 (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
mbed_official 631:825f75ca301e 190 (+@) HAL_ADC_ConvCpltCallback()
mbed_official 631:825f75ca301e 191 (+@) HAL_ADC_ConvHalfCpltCallback
mbed_official 631:825f75ca301e 192
mbed_official 631:825f75ca301e 193 *** Deinitialization of ADC ***
mbed_official 631:825f75ca301e 194 ============================================================
mbed_official 631:825f75ca301e 195 [..]
mbed_official 631:825f75ca301e 196
mbed_official 631:825f75ca301e 197 (#) Disable the ADC interface
mbed_official 631:825f75ca301e 198 (++) ADC clock can be hard reset and disabled at RCC top level.
mbed_official 631:825f75ca301e 199 (++) Hard reset of ADC peripherals
mbed_official 631:825f75ca301e 200 using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
mbed_official 631:825f75ca301e 201 (++) ADC clock disable
mbed_official 631:825f75ca301e 202 using the equivalent macro/functions as configuration step.
mbed_official 631:825f75ca301e 203 (+++) Example:
mbed_official 631:825f75ca301e 204 Into HAL_ADC_MspDeInit() (recommended code location) or with
mbed_official 631:825f75ca301e 205 other device clock parameters configuration:
mbed_official 631:825f75ca301e 206 (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
mbed_official 631:825f75ca301e 207 (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (if not used for system clock)
mbed_official 631:825f75ca301e 208 (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
mbed_official 631:825f75ca301e 209
mbed_official 631:825f75ca301e 210 (#) ADC pins configuration
mbed_official 631:825f75ca301e 211 (++) Disable the clock for the ADC GPIOs
mbed_official 631:825f75ca301e 212 using macro __HAL_RCC_GPIOx_CLK_DISABLE()
mbed_official 631:825f75ca301e 213
mbed_official 631:825f75ca301e 214 (#) Optionally, in case of usage of ADC with interruptions:
mbed_official 631:825f75ca301e 215 (++) Disable the NVIC for ADC
mbed_official 631:825f75ca301e 216 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
mbed_official 631:825f75ca301e 217
mbed_official 631:825f75ca301e 218 (#) Optionally, in case of usage of DMA:
mbed_official 631:825f75ca301e 219 (++) Deinitialize the DMA
mbed_official 631:825f75ca301e 220 using function HAL_DMA_Init().
mbed_official 631:825f75ca301e 221 (++) Disable the NVIC for DMA
mbed_official 631:825f75ca301e 222 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
mbed_official 631:825f75ca301e 223
mbed_official 631:825f75ca301e 224 [..]
mbed_official 340:28d1f895c6fe 225
mbed_official 340:28d1f895c6fe 226 @endverbatim
mbed_official 340:28d1f895c6fe 227 ******************************************************************************
mbed_official 340:28d1f895c6fe 228 * @attention
mbed_official 340:28d1f895c6fe 229 *
mbed_official 631:825f75ca301e 230 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 340:28d1f895c6fe 231 *
mbed_official 340:28d1f895c6fe 232 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 340:28d1f895c6fe 233 * are permitted provided that the following conditions are met:
mbed_official 340:28d1f895c6fe 234 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 340:28d1f895c6fe 235 * this list of conditions and the following disclaimer.
mbed_official 340:28d1f895c6fe 236 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 340:28d1f895c6fe 237 * this list of conditions and the following disclaimer in the documentation
mbed_official 340:28d1f895c6fe 238 * and/or other materials provided with the distribution.
mbed_official 340:28d1f895c6fe 239 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 340:28d1f895c6fe 240 * may be used to endorse or promote products derived from this software
mbed_official 340:28d1f895c6fe 241 * without specific prior written permission.
mbed_official 340:28d1f895c6fe 242 *
mbed_official 340:28d1f895c6fe 243 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 340:28d1f895c6fe 244 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 340:28d1f895c6fe 245 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 340:28d1f895c6fe 246 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 340:28d1f895c6fe 247 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 340:28d1f895c6fe 248 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 340:28d1f895c6fe 249 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 340:28d1f895c6fe 250 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 340:28d1f895c6fe 251 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 340:28d1f895c6fe 252 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 340:28d1f895c6fe 253 *
mbed_official 340:28d1f895c6fe 254 ******************************************************************************
mbed_official 340:28d1f895c6fe 255 */
mbed_official 340:28d1f895c6fe 256
mbed_official 340:28d1f895c6fe 257 /* Includes ------------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 258 #include "stm32f0xx_hal.h"
mbed_official 340:28d1f895c6fe 259
mbed_official 340:28d1f895c6fe 260 /** @addtogroup STM32F0xx_HAL_Driver
mbed_official 340:28d1f895c6fe 261 * @{
mbed_official 340:28d1f895c6fe 262 */
mbed_official 340:28d1f895c6fe 263
mbed_official 631:825f75ca301e 264 /** @defgroup ADC ADC
mbed_official 340:28d1f895c6fe 265 * @brief ADC HAL module driver
mbed_official 340:28d1f895c6fe 266 * @{
mbed_official 340:28d1f895c6fe 267 */
mbed_official 340:28d1f895c6fe 268
mbed_official 340:28d1f895c6fe 269 #ifdef HAL_ADC_MODULE_ENABLED
mbed_official 340:28d1f895c6fe 270
mbed_official 340:28d1f895c6fe 271 /* Private typedef -----------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 272 /* Private define ------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 273 /** @defgroup ADC_Private_Constants ADC Private Constants
mbed_official 340:28d1f895c6fe 274 * @{
mbed_official 340:28d1f895c6fe 275 */
mbed_official 340:28d1f895c6fe 276
mbed_official 340:28d1f895c6fe 277 /* Fixed timeout values for ADC calibration, enable settling time, disable */
mbed_official 340:28d1f895c6fe 278 /* settling time. */
mbed_official 340:28d1f895c6fe 279 /* Values defined to be higher than worst cases: low clock frequency, */
mbed_official 340:28d1f895c6fe 280 /* maximum prescaler. */
mbed_official 340:28d1f895c6fe 281 /* Ex of profile low frequency : Clock source at 0.1 MHz, ADC clock */
mbed_official 340:28d1f895c6fe 282 /* prescaler 4, sampling time 7.5 ADC clock cycles, resolution 12 bits. */
mbed_official 340:28d1f895c6fe 283 /* Unit: ms */
mbed_official 340:28d1f895c6fe 284 #define ADC_ENABLE_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 285 #define ADC_DISABLE_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 286 #define ADC_STOP_CONVERSION_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 287
mbed_official 631:825f75ca301e 288 /* Delay for ADC stabilization time. */
mbed_official 631:825f75ca301e 289 /* Maximum delay is 1us (refer to device datasheet, parameter tSTAB). */
mbed_official 631:825f75ca301e 290 /* Unit: us */
mbed_official 631:825f75ca301e 291 #define ADC_STAB_DELAY_US ((uint32_t) 1)
mbed_official 631:825f75ca301e 292
mbed_official 340:28d1f895c6fe 293 /* Delay for temperature sensor stabilization time. */
mbed_official 340:28d1f895c6fe 294 /* Maximum delay is 10us (refer to device datasheet, parameter tSTART). */
mbed_official 631:825f75ca301e 295 /* Unit: us */
mbed_official 631:825f75ca301e 296 #define ADC_TEMPSENSOR_DELAY_US ((uint32_t) 10)
mbed_official 340:28d1f895c6fe 297
mbed_official 340:28d1f895c6fe 298 /**
mbed_official 340:28d1f895c6fe 299 * @}
mbed_official 340:28d1f895c6fe 300 */
mbed_official 340:28d1f895c6fe 301
mbed_official 340:28d1f895c6fe 302 /* Private macro -------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 303 /* Private variables ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 304 /* Private function prototypes -----------------------------------------------*/
mbed_official 340:28d1f895c6fe 305 /** @defgroup ADC_Private_Functions ADC Private Functions
mbed_official 340:28d1f895c6fe 306 * @{
mbed_official 340:28d1f895c6fe 307 */
mbed_official 340:28d1f895c6fe 308 static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 309 static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 310 static HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 311 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 312 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 313 static void ADC_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 314 /**
mbed_official 340:28d1f895c6fe 315 * @}
mbed_official 340:28d1f895c6fe 316 */
mbed_official 340:28d1f895c6fe 317
mbed_official 340:28d1f895c6fe 318 /* Exported functions ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 319
mbed_official 340:28d1f895c6fe 320 /** @defgroup ADC_Exported_Functions ADC Exported Functions
mbed_official 340:28d1f895c6fe 321 * @{
mbed_official 340:28d1f895c6fe 322 */
mbed_official 340:28d1f895c6fe 323
mbed_official 340:28d1f895c6fe 324 /** @defgroup ADC_Exported_Functions_Group1 Initialization/de-initialization functions
mbed_official 340:28d1f895c6fe 325 * @brief Initialization and Configuration functions
mbed_official 340:28d1f895c6fe 326 *
mbed_official 340:28d1f895c6fe 327 @verbatim
mbed_official 340:28d1f895c6fe 328 ===============================================================================
mbed_official 340:28d1f895c6fe 329 ##### Initialization and de-initialization functions #####
mbed_official 340:28d1f895c6fe 330 ===============================================================================
mbed_official 340:28d1f895c6fe 331 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 332 (+) Initialize and configure the ADC.
mbed_official 340:28d1f895c6fe 333 (+) De-initialize the ADC
mbed_official 340:28d1f895c6fe 334 @endverbatim
mbed_official 340:28d1f895c6fe 335 * @{
mbed_official 340:28d1f895c6fe 336 */
mbed_official 340:28d1f895c6fe 337
mbed_official 340:28d1f895c6fe 338 /**
mbed_official 340:28d1f895c6fe 339 * @brief Initializes the ADC peripheral and regular group according to
mbed_official 340:28d1f895c6fe 340 * parameters specified in structure "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 341 * @note As prerequisite, ADC clock must be configured at RCC top level
mbed_official 340:28d1f895c6fe 342 * depending on both possible clock sources: APB clock of HSI clock.
mbed_official 340:28d1f895c6fe 343 * See commented example code below that can be copied and uncommented
mbed_official 340:28d1f895c6fe 344 * into HAL_ADC_MspInit().
mbed_official 340:28d1f895c6fe 345 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 346 * This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
mbed_official 340:28d1f895c6fe 347 * coming from ADC state reset. Following calls to this function can
mbed_official 340:28d1f895c6fe 348 * be used to reconfigure some parameters of ADC_InitTypeDef
mbed_official 340:28d1f895c6fe 349 * structure on the fly, without modifying MSP configuration. If ADC
mbed_official 340:28d1f895c6fe 350 * MSP has to be modified again, HAL_ADC_DeInit() must be called
mbed_official 340:28d1f895c6fe 351 * before HAL_ADC_Init().
mbed_official 340:28d1f895c6fe 352 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 353 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 354 * "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 355 * @note This function configures the ADC within 2 scopes: scope of entire
mbed_official 340:28d1f895c6fe 356 * ADC and scope of regular group. For parameters details, see comments
mbed_official 340:28d1f895c6fe 357 * of structure "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 358 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 359 * @retval HAL status
mbed_official 340:28d1f895c6fe 360 */
mbed_official 340:28d1f895c6fe 361 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 362 {
mbed_official 631:825f75ca301e 363 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 364 uint32_t tmpCFGR1 = 0;
mbed_official 340:28d1f895c6fe 365
mbed_official 340:28d1f895c6fe 366 /* Check ADC handle */
mbed_official 442:d2c15dda23c1 367 if(hadc == NULL)
mbed_official 340:28d1f895c6fe 368 {
mbed_official 340:28d1f895c6fe 369 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 370 }
mbed_official 340:28d1f895c6fe 371
mbed_official 340:28d1f895c6fe 372 /* Check the parameters */
mbed_official 340:28d1f895c6fe 373 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 374 assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
mbed_official 340:28d1f895c6fe 375 assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
mbed_official 340:28d1f895c6fe 376 assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
mbed_official 340:28d1f895c6fe 377 assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
mbed_official 340:28d1f895c6fe 378 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
mbed_official 340:28d1f895c6fe 379 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
mbed_official 340:28d1f895c6fe 380 assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
mbed_official 340:28d1f895c6fe 381 assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
mbed_official 340:28d1f895c6fe 382 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
mbed_official 340:28d1f895c6fe 383 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
mbed_official 340:28d1f895c6fe 384 assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
mbed_official 340:28d1f895c6fe 385 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
mbed_official 340:28d1f895c6fe 386 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoPowerOff));
mbed_official 340:28d1f895c6fe 387
mbed_official 340:28d1f895c6fe 388 /* As prerequisite, into HAL_ADC_MspInit(), ADC clock must be configured */
mbed_official 340:28d1f895c6fe 389 /* at RCC top level depending on both possible clock sources: */
mbed_official 340:28d1f895c6fe 390 /* APB clock or HSI clock. */
mbed_official 340:28d1f895c6fe 391 /* Refer to header of this file for more details on clock enabling procedure*/
mbed_official 340:28d1f895c6fe 392
mbed_official 340:28d1f895c6fe 393 /* Actions performed only if ADC is coming from state reset: */
mbed_official 340:28d1f895c6fe 394 /* - Initialization of ADC MSP */
mbed_official 340:28d1f895c6fe 395 /* - ADC voltage regulator enable */
mbed_official 340:28d1f895c6fe 396 if (hadc->State == HAL_ADC_STATE_RESET)
mbed_official 340:28d1f895c6fe 397 {
mbed_official 631:825f75ca301e 398 /* Initialize ADC error code */
mbed_official 631:825f75ca301e 399 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 631:825f75ca301e 400
mbed_official 631:825f75ca301e 401 /* Allocate lock resource and initialize it */
mbed_official 631:825f75ca301e 402 hadc->Lock = HAL_UNLOCKED;
mbed_official 631:825f75ca301e 403
mbed_official 340:28d1f895c6fe 404 /* Init the low level hardware */
mbed_official 340:28d1f895c6fe 405 HAL_ADC_MspInit(hadc);
mbed_official 340:28d1f895c6fe 406 }
mbed_official 340:28d1f895c6fe 407
mbed_official 340:28d1f895c6fe 408 /* Configuration of ADC parameters if previous preliminary actions are */
mbed_official 340:28d1f895c6fe 409 /* correctly completed. */
mbed_official 340:28d1f895c6fe 410 /* and if there is no conversion on going on regular group (ADC can be */
mbed_official 340:28d1f895c6fe 411 /* enabled anyway, in case of call of this function to update a parameter */
mbed_official 340:28d1f895c6fe 412 /* on the fly). */
mbed_official 631:825f75ca301e 413 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL) &&
mbed_official 631:825f75ca301e 414 (tmp_hal_status == HAL_OK) &&
mbed_official 631:825f75ca301e 415 (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) )
mbed_official 340:28d1f895c6fe 416 {
mbed_official 631:825f75ca301e 417 /* Set ADC state */
mbed_official 631:825f75ca301e 418 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 419 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 420 HAL_ADC_STATE_BUSY_INTERNAL);
mbed_official 340:28d1f895c6fe 421
mbed_official 340:28d1f895c6fe 422 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 423 /* Parameters that can be updated only when ADC is disabled: */
mbed_official 340:28d1f895c6fe 424 /* - ADC clock mode */
mbed_official 340:28d1f895c6fe 425 /* - ADC clock prescaler */
mbed_official 631:825f75ca301e 426 /* - ADC resolution */
mbed_official 631:825f75ca301e 427 if (ADC_IS_ENABLE(hadc) == RESET)
mbed_official 340:28d1f895c6fe 428 {
mbed_official 340:28d1f895c6fe 429 /* Some parameters of this register are not reset, since they are set */
mbed_official 340:28d1f895c6fe 430 /* by other functions and must be kept in case of usage of this */
mbed_official 340:28d1f895c6fe 431 /* function on the fly (update of a parameter of ADC_InitTypeDef */
mbed_official 340:28d1f895c6fe 432 /* without needing to reconfigure all other ADC groups/channels */
mbed_official 340:28d1f895c6fe 433 /* parameters): */
mbed_official 340:28d1f895c6fe 434 /* - internal measurement paths: Vbat, temperature sensor, Vref */
mbed_official 340:28d1f895c6fe 435 /* (set into HAL_ADC_ConfigChannel() ) */
mbed_official 340:28d1f895c6fe 436
mbed_official 631:825f75ca301e 437 /* Configuration of ADC resolution */
mbed_official 631:825f75ca301e 438 MODIFY_REG(hadc->Instance->CFGR1,
mbed_official 631:825f75ca301e 439 ADC_CFGR1_RES ,
mbed_official 631:825f75ca301e 440 hadc->Init.Resolution );
mbed_official 340:28d1f895c6fe 441
mbed_official 340:28d1f895c6fe 442 /* Configuration of ADC clock mode: clock source AHB or HSI with */
mbed_official 340:28d1f895c6fe 443 /* selectable prescaler */
mbed_official 631:825f75ca301e 444 MODIFY_REG(hadc->Instance->CFGR2 ,
mbed_official 631:825f75ca301e 445 ADC_CFGR2_CKMODE ,
mbed_official 631:825f75ca301e 446 hadc->Init.ClockPrescaler );
mbed_official 340:28d1f895c6fe 447 }
mbed_official 340:28d1f895c6fe 448
mbed_official 340:28d1f895c6fe 449 /* Configuration of ADC: */
mbed_official 340:28d1f895c6fe 450 /* - discontinuous mode */
mbed_official 340:28d1f895c6fe 451 /* - LowPowerAutoWait mode */
mbed_official 340:28d1f895c6fe 452 /* - LowPowerAutoPowerOff mode */
mbed_official 340:28d1f895c6fe 453 /* - continuous conversion mode */
mbed_official 340:28d1f895c6fe 454 /* - overrun */
mbed_official 340:28d1f895c6fe 455 /* - external trigger to start conversion */
mbed_official 340:28d1f895c6fe 456 /* - external trigger polarity */
mbed_official 340:28d1f895c6fe 457 /* - data alignment */
mbed_official 340:28d1f895c6fe 458 /* - resolution */
mbed_official 340:28d1f895c6fe 459 /* - scan direction */
mbed_official 340:28d1f895c6fe 460 /* - DMA continuous request */
mbed_official 340:28d1f895c6fe 461 hadc->Instance->CFGR1 &= ~( ADC_CFGR1_DISCEN |
mbed_official 340:28d1f895c6fe 462 ADC_CFGR1_AUTOFF |
mbed_official 340:28d1f895c6fe 463 ADC_CFGR1_AUTDLY |
mbed_official 340:28d1f895c6fe 464 ADC_CFGR1_CONT |
mbed_official 340:28d1f895c6fe 465 ADC_CFGR1_OVRMOD |
mbed_official 340:28d1f895c6fe 466 ADC_CFGR1_EXTSEL |
mbed_official 340:28d1f895c6fe 467 ADC_CFGR1_EXTEN |
mbed_official 340:28d1f895c6fe 468 ADC_CFGR1_ALIGN |
mbed_official 340:28d1f895c6fe 469 ADC_CFGR1_SCANDIR |
mbed_official 340:28d1f895c6fe 470 ADC_CFGR1_DMACFG );
mbed_official 340:28d1f895c6fe 471
mbed_official 631:825f75ca301e 472 tmpCFGR1 |= (ADC_CFGR1_AUTOWAIT(hadc->Init.LowPowerAutoWait) |
mbed_official 631:825f75ca301e 473 ADC_CFGR1_AUTOOFF(hadc->Init.LowPowerAutoPowerOff) |
mbed_official 631:825f75ca301e 474 ADC_CFGR1_CONTINUOUS(hadc->Init.ContinuousConvMode) |
mbed_official 631:825f75ca301e 475 ADC_CFGR1_OVERRUN(hadc->Init.Overrun) |
mbed_official 631:825f75ca301e 476 hadc->Init.DataAlign |
mbed_official 631:825f75ca301e 477 ADC_SCANDIR(hadc->Init.ScanConvMode) |
mbed_official 631:825f75ca301e 478 ADC_CFGR1_DMACONTREQ(hadc->Init.DMAContinuousRequests) );
mbed_official 340:28d1f895c6fe 479
mbed_official 340:28d1f895c6fe 480 /* Enable discontinuous mode only if continuous mode is disabled */
mbed_official 340:28d1f895c6fe 481 if ((hadc->Init.DiscontinuousConvMode == ENABLE) &&
mbed_official 340:28d1f895c6fe 482 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 340:28d1f895c6fe 483 {
mbed_official 340:28d1f895c6fe 484 /* Enable discontinuous mode of regular group */
mbed_official 340:28d1f895c6fe 485 tmpCFGR1 |= ADC_CFGR1_DISCEN;
mbed_official 340:28d1f895c6fe 486 }
mbed_official 340:28d1f895c6fe 487
mbed_official 340:28d1f895c6fe 488 /* Enable external trigger if trigger selection is different of software */
mbed_official 340:28d1f895c6fe 489 /* start. */
mbed_official 631:825f75ca301e 490 /* Note: This configuration keeps the hardware feature of parameter */
mbed_official 340:28d1f895c6fe 491 /* ExternalTrigConvEdge "trigger edge none" equivalent to */
mbed_official 340:28d1f895c6fe 492 /* software start. */
mbed_official 340:28d1f895c6fe 493 if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
mbed_official 340:28d1f895c6fe 494 {
mbed_official 340:28d1f895c6fe 495 tmpCFGR1 |= ( hadc->Init.ExternalTrigConv |
mbed_official 340:28d1f895c6fe 496 hadc->Init.ExternalTrigConvEdge );
mbed_official 340:28d1f895c6fe 497 }
mbed_official 340:28d1f895c6fe 498
mbed_official 340:28d1f895c6fe 499 /* Update ADC configuration register with previous settings */
mbed_official 340:28d1f895c6fe 500 hadc->Instance->CFGR1 |= tmpCFGR1;
mbed_official 340:28d1f895c6fe 501
mbed_official 631:825f75ca301e 502 /* Channel sampling time configuration */
mbed_official 631:825f75ca301e 503 /* Management of parameters "SamplingTimeCommon" and "SamplingTime" */
mbed_official 631:825f75ca301e 504 /* (obsolete): sampling time set in this function if parameter */
mbed_official 631:825f75ca301e 505 /* "SamplingTimeCommon" has been set to a valid sampling time. */
mbed_official 631:825f75ca301e 506 /* Otherwise, sampling time is set into ADC channel initialization */
mbed_official 631:825f75ca301e 507 /* structure with parameter "SamplingTime" (obsolete). */
mbed_official 631:825f75ca301e 508 if (IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 631:825f75ca301e 509 {
mbed_official 631:825f75ca301e 510 /* Channel sampling time configuration */
mbed_official 631:825f75ca301e 511 /* Clear the old sample time */
mbed_official 631:825f75ca301e 512 hadc->Instance->SMPR &= ~(ADC_SMPR_SMP);
mbed_official 631:825f75ca301e 513
mbed_official 631:825f75ca301e 514 /* Set the new sample time */
mbed_official 631:825f75ca301e 515 hadc->Instance->SMPR |= ADC_SMPR_SET(hadc->Init.SamplingTimeCommon);
mbed_official 631:825f75ca301e 516 }
mbed_official 631:825f75ca301e 517
mbed_official 340:28d1f895c6fe 518 /* Check back that ADC registers have effectively been configured to */
mbed_official 340:28d1f895c6fe 519 /* ensure of no potential problem of ADC core IP clocking. */
mbed_official 340:28d1f895c6fe 520 /* Check through register CFGR1 (excluding analog watchdog configuration: */
mbed_official 631:825f75ca301e 521 /* set into separate dedicated function, and bits of ADC resolution set */
mbed_official 631:825f75ca301e 522 /* out of temporary variable 'tmpCFGR1'). */
mbed_official 631:825f75ca301e 523 if ((hadc->Instance->CFGR1 & ~(ADC_CFGR1_AWDCH | ADC_CFGR1_AWDEN | ADC_CFGR1_AWDSGL | ADC_CFGR1_RES))
mbed_official 340:28d1f895c6fe 524 == tmpCFGR1)
mbed_official 340:28d1f895c6fe 525 {
mbed_official 340:28d1f895c6fe 526 /* Set ADC error code to none */
mbed_official 631:825f75ca301e 527 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 340:28d1f895c6fe 528
mbed_official 631:825f75ca301e 529 /* Set the ADC state */
mbed_official 631:825f75ca301e 530 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 531 HAL_ADC_STATE_BUSY_INTERNAL,
mbed_official 631:825f75ca301e 532 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 533 }
mbed_official 340:28d1f895c6fe 534 else
mbed_official 340:28d1f895c6fe 535 {
mbed_official 340:28d1f895c6fe 536 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 537 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 538 HAL_ADC_STATE_BUSY_INTERNAL,
mbed_official 631:825f75ca301e 539 HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 540
mbed_official 340:28d1f895c6fe 541 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 542 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 543
mbed_official 631:825f75ca301e 544 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 545 }
mbed_official 340:28d1f895c6fe 546
mbed_official 340:28d1f895c6fe 547 }
mbed_official 340:28d1f895c6fe 548 else
mbed_official 340:28d1f895c6fe 549 {
mbed_official 340:28d1f895c6fe 550 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 551 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 552
mbed_official 631:825f75ca301e 553 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 554 }
mbed_official 340:28d1f895c6fe 555
mbed_official 340:28d1f895c6fe 556 /* Return function status */
mbed_official 631:825f75ca301e 557 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 558 }
mbed_official 340:28d1f895c6fe 559
mbed_official 340:28d1f895c6fe 560
mbed_official 340:28d1f895c6fe 561 /**
mbed_official 340:28d1f895c6fe 562 * @brief Deinitialize the ADC peripheral registers to their default reset
mbed_official 340:28d1f895c6fe 563 * values, with deinitialization of the ADC MSP.
mbed_official 340:28d1f895c6fe 564 * @note For devices with several ADCs: reset of ADC common registers is done
mbed_official 340:28d1f895c6fe 565 * only if all ADCs sharing the same common group are disabled.
mbed_official 340:28d1f895c6fe 566 * If this is not the case, reset of these common parameters reset is
mbed_official 340:28d1f895c6fe 567 * bypassed without error reporting: it can be the intended behaviour in
mbed_official 340:28d1f895c6fe 568 * case of reset of a single ADC while the other ADCs sharing the same
mbed_official 340:28d1f895c6fe 569 * common group is still running.
mbed_official 340:28d1f895c6fe 570 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 571 * @retval HAL status
mbed_official 340:28d1f895c6fe 572 */
mbed_official 340:28d1f895c6fe 573 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 574 {
mbed_official 631:825f75ca301e 575 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 576
mbed_official 340:28d1f895c6fe 577 /* Check ADC handle */
mbed_official 442:d2c15dda23c1 578 if(hadc == NULL)
mbed_official 340:28d1f895c6fe 579 {
mbed_official 340:28d1f895c6fe 580 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 581 }
mbed_official 340:28d1f895c6fe 582
mbed_official 340:28d1f895c6fe 583 /* Check the parameters */
mbed_official 340:28d1f895c6fe 584 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 585
mbed_official 631:825f75ca301e 586 /* Set ADC state */
mbed_official 631:825f75ca301e 587 SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
mbed_official 340:28d1f895c6fe 588
mbed_official 340:28d1f895c6fe 589 /* Stop potential conversion on going, on regular group */
mbed_official 631:825f75ca301e 590 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 591
mbed_official 340:28d1f895c6fe 592 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 631:825f75ca301e 593 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 594 {
mbed_official 340:28d1f895c6fe 595 /* Disable the ADC peripheral */
mbed_official 631:825f75ca301e 596 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 597
mbed_official 340:28d1f895c6fe 598 /* Check if ADC is effectively disabled */
mbed_official 631:825f75ca301e 599 if (tmp_hal_status != HAL_ERROR)
mbed_official 340:28d1f895c6fe 600 {
mbed_official 340:28d1f895c6fe 601 /* Change ADC state */
mbed_official 340:28d1f895c6fe 602 hadc->State = HAL_ADC_STATE_READY;
mbed_official 340:28d1f895c6fe 603 }
mbed_official 340:28d1f895c6fe 604 }
mbed_official 340:28d1f895c6fe 605
mbed_official 340:28d1f895c6fe 606
mbed_official 340:28d1f895c6fe 607 /* Configuration of ADC parameters if previous preliminary actions are */
mbed_official 340:28d1f895c6fe 608 /* correctly completed. */
mbed_official 631:825f75ca301e 609 if (tmp_hal_status != HAL_ERROR)
mbed_official 340:28d1f895c6fe 610 {
mbed_official 340:28d1f895c6fe 611
mbed_official 340:28d1f895c6fe 612 /* ========== Reset ADC registers ========== */
mbed_official 340:28d1f895c6fe 613 /* Reset register IER */
mbed_official 340:28d1f895c6fe 614 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD | ADC_IT_OVR |
mbed_official 340:28d1f895c6fe 615 ADC_IT_EOS | ADC_IT_EOC |
mbed_official 340:28d1f895c6fe 616 ADC_IT_EOSMP | ADC_IT_RDY ) );
mbed_official 340:28d1f895c6fe 617
mbed_official 340:28d1f895c6fe 618 /* Reset register ISR */
mbed_official 340:28d1f895c6fe 619 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD | ADC_FLAG_OVR |
mbed_official 340:28d1f895c6fe 620 ADC_FLAG_EOS | ADC_FLAG_EOC |
mbed_official 340:28d1f895c6fe 621 ADC_FLAG_EOSMP | ADC_FLAG_RDY ) );
mbed_official 340:28d1f895c6fe 622
mbed_official 340:28d1f895c6fe 623 /* Reset register CR */
mbed_official 340:28d1f895c6fe 624 /* Bits ADC_CR_ADCAL, ADC_CR_ADSTP, ADC_CR_ADSTART are in access mode */
mbed_official 340:28d1f895c6fe 625 /* "read-set": no direct reset applicable. */
mbed_official 340:28d1f895c6fe 626
mbed_official 340:28d1f895c6fe 627 /* Reset register CFGR1 */
mbed_official 340:28d1f895c6fe 628 hadc->Instance->CFGR1 &= ~(ADC_CFGR1_AWDCH | ADC_CFGR1_AWDEN | ADC_CFGR1_AWDSGL | ADC_CFGR1_DISCEN |
mbed_official 340:28d1f895c6fe 629 ADC_CFGR1_AUTOFF | ADC_CFGR1_WAIT | ADC_CFGR1_CONT | ADC_CFGR1_OVRMOD |
mbed_official 340:28d1f895c6fe 630 ADC_CFGR1_EXTEN | ADC_CFGR1_EXTSEL | ADC_CFGR1_ALIGN | ADC_CFGR1_RES |
mbed_official 340:28d1f895c6fe 631 ADC_CFGR1_SCANDIR | ADC_CFGR1_DMACFG | ADC_CFGR1_DMAEN );
mbed_official 340:28d1f895c6fe 632
mbed_official 340:28d1f895c6fe 633 /* Reset register CFGR2 */
mbed_official 631:825f75ca301e 634 /* Note: Update of ADC clock mode is conditioned to ADC state disabled: */
mbed_official 340:28d1f895c6fe 635 /* already done above. */
mbed_official 340:28d1f895c6fe 636 hadc->Instance->CFGR2 &= ~ADC_CFGR2_CKMODE;
mbed_official 340:28d1f895c6fe 637
mbed_official 340:28d1f895c6fe 638 /* Reset register SMPR */
mbed_official 340:28d1f895c6fe 639 hadc->Instance->SMPR &= ~ADC_SMPR_SMP;
mbed_official 340:28d1f895c6fe 640
mbed_official 340:28d1f895c6fe 641 /* Reset register TR1 */
mbed_official 340:28d1f895c6fe 642 hadc->Instance->TR &= ~(ADC_TR_HT | ADC_TR_LT);
mbed_official 340:28d1f895c6fe 643
mbed_official 340:28d1f895c6fe 644 /* Reset register CHSELR */
mbed_official 340:28d1f895c6fe 645 hadc->Instance->CHSELR &= ~(ADC_CHSELR_CHSEL18 | ADC_CHSELR_CHSEL17 | ADC_CHSELR_CHSEL16 |
mbed_official 340:28d1f895c6fe 646 ADC_CHSELR_CHSEL15 | ADC_CHSELR_CHSEL14 | ADC_CHSELR_CHSEL13 | ADC_CHSELR_CHSEL12 |
mbed_official 340:28d1f895c6fe 647 ADC_CHSELR_CHSEL11 | ADC_CHSELR_CHSEL10 | ADC_CHSELR_CHSEL9 | ADC_CHSELR_CHSEL8 |
mbed_official 340:28d1f895c6fe 648 ADC_CHSELR_CHSEL7 | ADC_CHSELR_CHSEL6 | ADC_CHSELR_CHSEL5 | ADC_CHSELR_CHSEL4 |
mbed_official 340:28d1f895c6fe 649 ADC_CHSELR_CHSEL3 | ADC_CHSELR_CHSEL2 | ADC_CHSELR_CHSEL1 | ADC_CHSELR_CHSEL0 );
mbed_official 340:28d1f895c6fe 650
mbed_official 340:28d1f895c6fe 651 /* Reset register DR */
mbed_official 340:28d1f895c6fe 652 /* bits in access mode read only, no direct reset applicable*/
mbed_official 340:28d1f895c6fe 653
mbed_official 340:28d1f895c6fe 654 /* Reset register CCR */
mbed_official 631:825f75ca301e 655 ADC->CCR &= ~(ADC_CCR_ALL);
mbed_official 340:28d1f895c6fe 656
mbed_official 340:28d1f895c6fe 657 /* ========== Hard reset ADC peripheral ========== */
mbed_official 340:28d1f895c6fe 658 /* Performs a global reset of the entire ADC peripheral: ADC state is */
mbed_official 340:28d1f895c6fe 659 /* forced to a similar state after device power-on. */
mbed_official 340:28d1f895c6fe 660 /* If needed, copy-paste and uncomment the following reset code into */
mbed_official 340:28d1f895c6fe 661 /* function "void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)": */
mbed_official 340:28d1f895c6fe 662 /* */
mbed_official 631:825f75ca301e 663 /* __HAL_RCC_ADC1_FORCE_RESET() */
mbed_official 631:825f75ca301e 664 /* __HAL_RCC_ADC1_RELEASE_RESET() */
mbed_official 340:28d1f895c6fe 665
mbed_official 340:28d1f895c6fe 666 /* DeInit the low level hardware */
mbed_official 340:28d1f895c6fe 667 HAL_ADC_MspDeInit(hadc);
mbed_official 340:28d1f895c6fe 668
mbed_official 340:28d1f895c6fe 669 /* Set ADC error code to none */
mbed_official 631:825f75ca301e 670 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 340:28d1f895c6fe 671
mbed_official 631:825f75ca301e 672 /* Set ADC state */
mbed_official 340:28d1f895c6fe 673 hadc->State = HAL_ADC_STATE_RESET;
mbed_official 340:28d1f895c6fe 674 }
mbed_official 340:28d1f895c6fe 675
mbed_official 340:28d1f895c6fe 676 /* Process unlocked */
mbed_official 340:28d1f895c6fe 677 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 678
mbed_official 340:28d1f895c6fe 679 /* Return function status */
mbed_official 631:825f75ca301e 680 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 681 }
mbed_official 340:28d1f895c6fe 682
mbed_official 340:28d1f895c6fe 683
mbed_official 340:28d1f895c6fe 684 /**
mbed_official 340:28d1f895c6fe 685 * @brief Initializes the ADC MSP.
mbed_official 340:28d1f895c6fe 686 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 687 * @retval None
mbed_official 340:28d1f895c6fe 688 */
mbed_official 340:28d1f895c6fe 689 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 690 {
mbed_official 340:28d1f895c6fe 691 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 692 function HAL_ADC_MspInit must be implemented in the user file.
mbed_official 340:28d1f895c6fe 693 */
mbed_official 340:28d1f895c6fe 694 }
mbed_official 340:28d1f895c6fe 695
mbed_official 340:28d1f895c6fe 696 /**
mbed_official 340:28d1f895c6fe 697 * @brief DeInitializes the ADC MSP.
mbed_official 340:28d1f895c6fe 698 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 699 * @retval None
mbed_official 340:28d1f895c6fe 700 */
mbed_official 340:28d1f895c6fe 701 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 702 {
mbed_official 340:28d1f895c6fe 703 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 704 function HAL_ADC_MspDeInit must be implemented in the user file.
mbed_official 340:28d1f895c6fe 705 */
mbed_official 340:28d1f895c6fe 706 }
mbed_official 340:28d1f895c6fe 707
mbed_official 340:28d1f895c6fe 708 /**
mbed_official 340:28d1f895c6fe 709 * @}
mbed_official 340:28d1f895c6fe 710 */
mbed_official 340:28d1f895c6fe 711
mbed_official 340:28d1f895c6fe 712 /** @defgroup ADC_Exported_Functions_Group2 IO operation functions
mbed_official 340:28d1f895c6fe 713 * @brief IO operation functions
mbed_official 340:28d1f895c6fe 714 *
mbed_official 340:28d1f895c6fe 715 @verbatim
mbed_official 340:28d1f895c6fe 716 ===============================================================================
mbed_official 340:28d1f895c6fe 717 ##### IO operation functions #####
mbed_official 340:28d1f895c6fe 718 ===============================================================================
mbed_official 340:28d1f895c6fe 719 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 720 (+) Start conversion of regular group.
mbed_official 340:28d1f895c6fe 721 (+) Stop conversion of regular group.
mbed_official 340:28d1f895c6fe 722 (+) Poll for conversion complete on regular group.
mbed_official 340:28d1f895c6fe 723 (+) Poll for conversion event.
mbed_official 340:28d1f895c6fe 724 (+) Get result of regular channel conversion.
mbed_official 340:28d1f895c6fe 725 (+) Start conversion of regular group and enable interruptions.
mbed_official 340:28d1f895c6fe 726 (+) Stop conversion of regular group and disable interruptions.
mbed_official 340:28d1f895c6fe 727 (+) Handle ADC interrupt request
mbed_official 340:28d1f895c6fe 728 (+) Start conversion of regular group and enable DMA transfer.
mbed_official 340:28d1f895c6fe 729 (+) Stop conversion of regular group and disable ADC DMA transfer.
mbed_official 340:28d1f895c6fe 730 @endverbatim
mbed_official 340:28d1f895c6fe 731 * @{
mbed_official 340:28d1f895c6fe 732 */
mbed_official 340:28d1f895c6fe 733
mbed_official 340:28d1f895c6fe 734 /**
mbed_official 340:28d1f895c6fe 735 * @brief Enables ADC, starts conversion of regular group.
mbed_official 340:28d1f895c6fe 736 * Interruptions enabled in this function: None.
mbed_official 340:28d1f895c6fe 737 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 738 * @retval HAL status
mbed_official 340:28d1f895c6fe 739 */
mbed_official 340:28d1f895c6fe 740 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 741 {
mbed_official 631:825f75ca301e 742 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 743
mbed_official 340:28d1f895c6fe 744 /* Check the parameters */
mbed_official 340:28d1f895c6fe 745 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 442:d2c15dda23c1 746
mbed_official 442:d2c15dda23c1 747 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 631:825f75ca301e 748 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 749 {
mbed_official 442:d2c15dda23c1 750 /* Process locked */
mbed_official 442:d2c15dda23c1 751 __HAL_LOCK(hadc);
mbed_official 442:d2c15dda23c1 752
mbed_official 442:d2c15dda23c1 753 /* Enable the ADC peripheral */
mbed_official 442:d2c15dda23c1 754 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 442:d2c15dda23c1 755 /* performed automatically by hardware. */
mbed_official 442:d2c15dda23c1 756 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 442:d2c15dda23c1 757 {
mbed_official 631:825f75ca301e 758 tmp_hal_status = ADC_Enable(hadc);
mbed_official 442:d2c15dda23c1 759 }
mbed_official 340:28d1f895c6fe 760
mbed_official 442:d2c15dda23c1 761 /* Start conversion if ADC is effectively enabled */
mbed_official 631:825f75ca301e 762 if (tmp_hal_status == HAL_OK)
mbed_official 442:d2c15dda23c1 763 {
mbed_official 631:825f75ca301e 764 /* Set ADC state */
mbed_official 631:825f75ca301e 765 /* - Clear state bitfield related to regular group conversion results */
mbed_official 631:825f75ca301e 766 /* - Set state bitfield related to regular operation */
mbed_official 631:825f75ca301e 767 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 768 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 631:825f75ca301e 769 HAL_ADC_STATE_REG_BUSY);
mbed_official 631:825f75ca301e 770
mbed_official 631:825f75ca301e 771 /* Reset ADC all error code fields */
mbed_official 631:825f75ca301e 772 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 631:825f75ca301e 773
mbed_official 631:825f75ca301e 774 /* Process unlocked */
mbed_official 631:825f75ca301e 775 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 631:825f75ca301e 776 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 631:825f75ca301e 777 __HAL_UNLOCK(hadc);
mbed_official 442:d2c15dda23c1 778
mbed_official 442:d2c15dda23c1 779 /* Clear regular group conversion flag and overrun flag */
mbed_official 442:d2c15dda23c1 780 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 442:d2c15dda23c1 781 /* operations) */
mbed_official 442:d2c15dda23c1 782 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 442:d2c15dda23c1 783
mbed_official 442:d2c15dda23c1 784 /* Enable conversion of regular group. */
mbed_official 442:d2c15dda23c1 785 /* If software start has been selected, conversion starts immediately. */
mbed_official 442:d2c15dda23c1 786 /* If external trigger has been selected, conversion will start at next */
mbed_official 442:d2c15dda23c1 787 /* trigger event. */
mbed_official 442:d2c15dda23c1 788 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 442:d2c15dda23c1 789 }
mbed_official 340:28d1f895c6fe 790 }
mbed_official 442:d2c15dda23c1 791 else
mbed_official 442:d2c15dda23c1 792 {
mbed_official 631:825f75ca301e 793 tmp_hal_status = HAL_BUSY;
mbed_official 442:d2c15dda23c1 794 }
mbed_official 340:28d1f895c6fe 795
mbed_official 340:28d1f895c6fe 796 /* Return function status */
mbed_official 631:825f75ca301e 797 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 798 }
mbed_official 340:28d1f895c6fe 799
mbed_official 340:28d1f895c6fe 800 /**
mbed_official 340:28d1f895c6fe 801 * @brief Stop ADC conversion of regular group, disable ADC peripheral.
mbed_official 340:28d1f895c6fe 802 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 803 * @retval HAL status.
mbed_official 340:28d1f895c6fe 804 */
mbed_official 340:28d1f895c6fe 805 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 806 {
mbed_official 631:825f75ca301e 807 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 808
mbed_official 340:28d1f895c6fe 809 /* Check the parameters */
mbed_official 340:28d1f895c6fe 810 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 811
mbed_official 340:28d1f895c6fe 812 /* Process locked */
mbed_official 340:28d1f895c6fe 813 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 814
mbed_official 340:28d1f895c6fe 815 /* 1. Stop potential conversion on going, on regular group */
mbed_official 631:825f75ca301e 816 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 817
mbed_official 340:28d1f895c6fe 818 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 631:825f75ca301e 819 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 820 {
mbed_official 340:28d1f895c6fe 821 /* 2. Disable the ADC peripheral */
mbed_official 631:825f75ca301e 822 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 823
mbed_official 340:28d1f895c6fe 824 /* Check if ADC is effectively disabled */
mbed_official 631:825f75ca301e 825 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 826 {
mbed_official 631:825f75ca301e 827 /* Set ADC state */
mbed_official 631:825f75ca301e 828 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 829 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 830 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 831 }
mbed_official 340:28d1f895c6fe 832 }
mbed_official 340:28d1f895c6fe 833
mbed_official 340:28d1f895c6fe 834 /* Process unlocked */
mbed_official 340:28d1f895c6fe 835 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 836
mbed_official 340:28d1f895c6fe 837 /* Return function status */
mbed_official 631:825f75ca301e 838 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 839 }
mbed_official 340:28d1f895c6fe 840
mbed_official 340:28d1f895c6fe 841 /**
mbed_official 340:28d1f895c6fe 842 * @brief Wait for regular group conversion to be completed.
mbed_official 631:825f75ca301e 843 * @note ADC conversion flags EOS (end of sequence) and EOC (end of
mbed_official 631:825f75ca301e 844 * conversion) are cleared by this function, with an exception:
mbed_official 631:825f75ca301e 845 * if low power feature "LowPowerAutoWait" is enabled, flags are
mbed_official 631:825f75ca301e 846 * not cleared to not interfere with this feature until data register
mbed_official 631:825f75ca301e 847 * is read using function HAL_ADC_GetValue().
mbed_official 631:825f75ca301e 848 * @note This function cannot be used in a particular setup: ADC configured
mbed_official 631:825f75ca301e 849 * in DMA mode and polling for end of each conversion (ADC init
mbed_official 631:825f75ca301e 850 * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
mbed_official 631:825f75ca301e 851 * In this case, DMA resets the flag EOC and polling cannot be
mbed_official 631:825f75ca301e 852 * performed on each conversion. Nevertheless, polling can still
mbed_official 631:825f75ca301e 853 * be performed on the complete sequence (ADC init
mbed_official 631:825f75ca301e 854 * parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
mbed_official 340:28d1f895c6fe 855 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 856 * @param Timeout: Timeout value in millisecond.
mbed_official 340:28d1f895c6fe 857 * @retval HAL status
mbed_official 340:28d1f895c6fe 858 */
mbed_official 340:28d1f895c6fe 859 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 860 {
mbed_official 340:28d1f895c6fe 861 uint32_t tickstart;
mbed_official 340:28d1f895c6fe 862 uint32_t tmp_Flag_EOC;
mbed_official 340:28d1f895c6fe 863
mbed_official 340:28d1f895c6fe 864 /* Check the parameters */
mbed_official 340:28d1f895c6fe 865 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 866
mbed_official 340:28d1f895c6fe 867 /* If end of conversion selected to end of sequence */
mbed_official 631:825f75ca301e 868 if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
mbed_official 340:28d1f895c6fe 869 {
mbed_official 340:28d1f895c6fe 870 tmp_Flag_EOC = ADC_FLAG_EOS;
mbed_official 340:28d1f895c6fe 871 }
mbed_official 340:28d1f895c6fe 872 /* If end of conversion selected to end of each conversion */
mbed_official 631:825f75ca301e 873 else /* ADC_EOC_SINGLE_CONV */
mbed_official 340:28d1f895c6fe 874 {
mbed_official 631:825f75ca301e 875 /* Verification that ADC configuration is compliant with polling for */
mbed_official 631:825f75ca301e 876 /* each conversion: */
mbed_official 631:825f75ca301e 877 /* Particular case is ADC configured in DMA mode and ADC sequencer with */
mbed_official 631:825f75ca301e 878 /* several ranks and polling for end of each conversion. */
mbed_official 631:825f75ca301e 879 /* For code simplicity sake, this particular case is generalized to */
mbed_official 631:825f75ca301e 880 /* ADC configured in DMA mode and and polling for end of each conversion. */
mbed_official 631:825f75ca301e 881 if (HAL_IS_BIT_SET(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN))
mbed_official 631:825f75ca301e 882 {
mbed_official 631:825f75ca301e 883 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 884 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 631:825f75ca301e 885
mbed_official 631:825f75ca301e 886 /* Process unlocked */
mbed_official 631:825f75ca301e 887 __HAL_UNLOCK(hadc);
mbed_official 631:825f75ca301e 888
mbed_official 631:825f75ca301e 889 return HAL_ERROR;
mbed_official 631:825f75ca301e 890 }
mbed_official 631:825f75ca301e 891 else
mbed_official 631:825f75ca301e 892 {
mbed_official 631:825f75ca301e 893 tmp_Flag_EOC = (ADC_FLAG_EOC | ADC_FLAG_EOS);
mbed_official 631:825f75ca301e 894 }
mbed_official 340:28d1f895c6fe 895 }
mbed_official 631:825f75ca301e 896
mbed_official 631:825f75ca301e 897 /* Get tick count */
mbed_official 631:825f75ca301e 898 tickstart = HAL_GetTick();
mbed_official 631:825f75ca301e 899
mbed_official 340:28d1f895c6fe 900 /* Wait until End of Conversion flag is raised */
mbed_official 340:28d1f895c6fe 901 while(HAL_IS_BIT_CLR(hadc->Instance->ISR, tmp_Flag_EOC))
mbed_official 340:28d1f895c6fe 902 {
mbed_official 340:28d1f895c6fe 903 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 340:28d1f895c6fe 904 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 905 {
mbed_official 340:28d1f895c6fe 906 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 907 {
mbed_official 340:28d1f895c6fe 908 /* Update ADC state machine to timeout */
mbed_official 631:825f75ca301e 909 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
mbed_official 340:28d1f895c6fe 910
mbed_official 340:28d1f895c6fe 911 /* Process unlocked */
mbed_official 340:28d1f895c6fe 912 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 913
mbed_official 631:825f75ca301e 914 return HAL_TIMEOUT;
mbed_official 631:825f75ca301e 915 }
mbed_official 631:825f75ca301e 916 }
mbed_official 631:825f75ca301e 917 }
mbed_official 631:825f75ca301e 918
mbed_official 631:825f75ca301e 919 /* Update ADC state machine */
mbed_official 631:825f75ca301e 920 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 631:825f75ca301e 921
mbed_official 631:825f75ca301e 922 /* Determine whether any further conversion upcoming on group regular */
mbed_official 631:825f75ca301e 923 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 631:825f75ca301e 924 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 631:825f75ca301e 925 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 631:825f75ca301e 926 {
mbed_official 631:825f75ca301e 927 /* If End of Sequence is reached, disable interrupts */
mbed_official 631:825f75ca301e 928 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 631:825f75ca301e 929 {
mbed_official 631:825f75ca301e 930 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 631:825f75ca301e 931 /* ADSTART==0 (no conversion on going) */
mbed_official 631:825f75ca301e 932 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 631:825f75ca301e 933 {
mbed_official 631:825f75ca301e 934 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 631:825f75ca301e 935 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 631:825f75ca301e 936 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 631:825f75ca301e 937 /* by overrun IRQ process below. */
mbed_official 631:825f75ca301e 938 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 631:825f75ca301e 939
mbed_official 631:825f75ca301e 940 /* Set ADC state */
mbed_official 631:825f75ca301e 941 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 942 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 943 HAL_ADC_STATE_READY);
mbed_official 631:825f75ca301e 944 }
mbed_official 631:825f75ca301e 945 else
mbed_official 631:825f75ca301e 946 {
mbed_official 631:825f75ca301e 947 /* Change ADC state to error state */
mbed_official 631:825f75ca301e 948 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 631:825f75ca301e 949
mbed_official 631:825f75ca301e 950 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 951 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 952 }
mbed_official 340:28d1f895c6fe 953 }
mbed_official 340:28d1f895c6fe 954 }
mbed_official 340:28d1f895c6fe 955
mbed_official 340:28d1f895c6fe 956 /* Clear end of conversion flag of regular group if low power feature */
mbed_official 340:28d1f895c6fe 957 /* "LowPowerAutoWait " is disabled, to not interfere with this feature */
mbed_official 340:28d1f895c6fe 958 /* until data register is read using function HAL_ADC_GetValue(). */
mbed_official 340:28d1f895c6fe 959 if (hadc->Init.LowPowerAutoWait == DISABLE)
mbed_official 340:28d1f895c6fe 960 {
mbed_official 340:28d1f895c6fe 961 /* Clear regular group conversion flag */
mbed_official 340:28d1f895c6fe 962 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
mbed_official 340:28d1f895c6fe 963 }
mbed_official 340:28d1f895c6fe 964
mbed_official 340:28d1f895c6fe 965 /* Return ADC state */
mbed_official 340:28d1f895c6fe 966 return HAL_OK;
mbed_official 340:28d1f895c6fe 967 }
mbed_official 340:28d1f895c6fe 968
mbed_official 340:28d1f895c6fe 969 /**
mbed_official 340:28d1f895c6fe 970 * @brief Poll for conversion event.
mbed_official 340:28d1f895c6fe 971 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 972 * @param EventType: the ADC event type.
mbed_official 340:28d1f895c6fe 973 * This parameter can be one of the following values:
mbed_official 631:825f75ca301e 974 * @arg ADC_AWD_EVENT: ADC Analog watchdog event
mbed_official 631:825f75ca301e 975 * @arg ADC_OVR_EVENT: ADC Overrun event
mbed_official 340:28d1f895c6fe 976 * @param Timeout: Timeout value in millisecond.
mbed_official 340:28d1f895c6fe 977 * @retval HAL status
mbed_official 340:28d1f895c6fe 978 */
mbed_official 340:28d1f895c6fe 979 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 980 {
mbed_official 340:28d1f895c6fe 981 uint32_t tickstart=0;
mbed_official 340:28d1f895c6fe 982
mbed_official 340:28d1f895c6fe 983 /* Check the parameters */
mbed_official 340:28d1f895c6fe 984 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 985 assert_param(IS_ADC_EVENT_TYPE(EventType));
mbed_official 340:28d1f895c6fe 986
mbed_official 631:825f75ca301e 987 /* Get tick count */
mbed_official 340:28d1f895c6fe 988 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 989
mbed_official 340:28d1f895c6fe 990 /* Check selected event flag */
mbed_official 340:28d1f895c6fe 991 while(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET)
mbed_official 340:28d1f895c6fe 992 {
mbed_official 340:28d1f895c6fe 993 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 340:28d1f895c6fe 994 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 995 {
mbed_official 340:28d1f895c6fe 996 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 997 {
mbed_official 340:28d1f895c6fe 998 /* Update ADC state machine to timeout */
mbed_official 631:825f75ca301e 999 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
mbed_official 340:28d1f895c6fe 1000
mbed_official 340:28d1f895c6fe 1001 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1002 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1003
mbed_official 340:28d1f895c6fe 1004 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1005 }
mbed_official 340:28d1f895c6fe 1006 }
mbed_official 340:28d1f895c6fe 1007 }
mbed_official 340:28d1f895c6fe 1008
mbed_official 340:28d1f895c6fe 1009 switch(EventType)
mbed_official 340:28d1f895c6fe 1010 {
mbed_official 340:28d1f895c6fe 1011 /* Analog watchdog (level out of window) event */
mbed_official 631:825f75ca301e 1012 case ADC_AWD_EVENT:
mbed_official 631:825f75ca301e 1013 /* Set ADC state */
mbed_official 631:825f75ca301e 1014 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
mbed_official 340:28d1f895c6fe 1015
mbed_official 340:28d1f895c6fe 1016 /* Clear ADC analog watchdog flag */
mbed_official 340:28d1f895c6fe 1017 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
mbed_official 340:28d1f895c6fe 1018 break;
mbed_official 340:28d1f895c6fe 1019
mbed_official 340:28d1f895c6fe 1020 /* Overrun event */
mbed_official 631:825f75ca301e 1021 default: /* Case ADC_OVR_EVENT */
mbed_official 340:28d1f895c6fe 1022 /* If overrun is set to overwrite previous data, overrun event is not */
mbed_official 340:28d1f895c6fe 1023 /* considered as an error. */
mbed_official 340:28d1f895c6fe 1024 /* (cf ref manual "Managing conversions without using the DMA and without */
mbed_official 340:28d1f895c6fe 1025 /* overrun ") */
mbed_official 631:825f75ca301e 1026 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
mbed_official 340:28d1f895c6fe 1027 {
mbed_official 631:825f75ca301e 1028 /* Set ADC state */
mbed_official 631:825f75ca301e 1029 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
mbed_official 340:28d1f895c6fe 1030
mbed_official 340:28d1f895c6fe 1031 /* Set ADC error code to overrun */
mbed_official 631:825f75ca301e 1032 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
mbed_official 340:28d1f895c6fe 1033 }
mbed_official 340:28d1f895c6fe 1034
mbed_official 340:28d1f895c6fe 1035 /* Clear ADC Overrun flag */
mbed_official 340:28d1f895c6fe 1036 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1037 break;
mbed_official 340:28d1f895c6fe 1038 }
mbed_official 340:28d1f895c6fe 1039
mbed_official 340:28d1f895c6fe 1040 /* Return ADC state */
mbed_official 340:28d1f895c6fe 1041 return HAL_OK;
mbed_official 340:28d1f895c6fe 1042 }
mbed_official 340:28d1f895c6fe 1043
mbed_official 340:28d1f895c6fe 1044 /**
mbed_official 340:28d1f895c6fe 1045 * @brief Enables ADC, starts conversion of regular group with interruption.
mbed_official 442:d2c15dda23c1 1046 * Interruptions enabled in this function:
mbed_official 442:d2c15dda23c1 1047 * - EOC (end of conversion of regular group) or EOS (end of
mbed_official 442:d2c15dda23c1 1048 * sequence of regular group) depending on ADC initialization
mbed_official 442:d2c15dda23c1 1049 * parameter "EOCSelection"
mbed_official 442:d2c15dda23c1 1050 * - overrun (if available)
mbed_official 340:28d1f895c6fe 1051 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1052 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1053 * @retval HAL status
mbed_official 340:28d1f895c6fe 1054 */
mbed_official 340:28d1f895c6fe 1055 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1056 {
mbed_official 631:825f75ca301e 1057 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1058
mbed_official 340:28d1f895c6fe 1059 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1060 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1061
mbed_official 442:d2c15dda23c1 1062 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 631:825f75ca301e 1063 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1064 {
mbed_official 442:d2c15dda23c1 1065 /* Process locked */
mbed_official 442:d2c15dda23c1 1066 __HAL_LOCK(hadc);
mbed_official 442:d2c15dda23c1 1067
mbed_official 442:d2c15dda23c1 1068 /* Enable the ADC peripheral */
mbed_official 442:d2c15dda23c1 1069 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 442:d2c15dda23c1 1070 /* performed automatically by hardware. */
mbed_official 442:d2c15dda23c1 1071 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 340:28d1f895c6fe 1072 {
mbed_official 631:825f75ca301e 1073 tmp_hal_status = ADC_Enable(hadc);
mbed_official 340:28d1f895c6fe 1074 }
mbed_official 340:28d1f895c6fe 1075
mbed_official 442:d2c15dda23c1 1076 /* Start conversion if ADC is effectively enabled */
mbed_official 631:825f75ca301e 1077 if (tmp_hal_status == HAL_OK)
mbed_official 442:d2c15dda23c1 1078 {
mbed_official 631:825f75ca301e 1079 /* Set ADC state */
mbed_official 631:825f75ca301e 1080 /* - Clear state bitfield related to regular group conversion results */
mbed_official 631:825f75ca301e 1081 /* - Set state bitfield related to regular operation */
mbed_official 631:825f75ca301e 1082 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 1083 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 631:825f75ca301e 1084 HAL_ADC_STATE_REG_BUSY);
mbed_official 442:d2c15dda23c1 1085
mbed_official 631:825f75ca301e 1086 /* Reset ADC all error code fields */
mbed_official 631:825f75ca301e 1087 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 631:825f75ca301e 1088
mbed_official 631:825f75ca301e 1089 /* Process unlocked */
mbed_official 631:825f75ca301e 1090 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 631:825f75ca301e 1091 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 631:825f75ca301e 1092 __HAL_UNLOCK(hadc);
mbed_official 442:d2c15dda23c1 1093
mbed_official 442:d2c15dda23c1 1094 /* Clear regular group conversion flag and overrun flag */
mbed_official 442:d2c15dda23c1 1095 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 442:d2c15dda23c1 1096 /* operations) */
mbed_official 442:d2c15dda23c1 1097 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 442:d2c15dda23c1 1098
mbed_official 442:d2c15dda23c1 1099 /* Enable ADC end of conversion interrupt */
mbed_official 442:d2c15dda23c1 1100 /* Enable ADC overrun interrupt */
mbed_official 442:d2c15dda23c1 1101 switch(hadc->Init.EOCSelection)
mbed_official 442:d2c15dda23c1 1102 {
mbed_official 631:825f75ca301e 1103 case ADC_EOC_SEQ_CONV:
mbed_official 442:d2c15dda23c1 1104 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
mbed_official 442:d2c15dda23c1 1105 __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOS | ADC_IT_OVR));
mbed_official 442:d2c15dda23c1 1106 break;
mbed_official 631:825f75ca301e 1107 /* case ADC_EOC_SINGLE_CONV */
mbed_official 442:d2c15dda23c1 1108 default:
mbed_official 442:d2c15dda23c1 1109 __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
mbed_official 442:d2c15dda23c1 1110 break;
mbed_official 442:d2c15dda23c1 1111 }
mbed_official 442:d2c15dda23c1 1112
mbed_official 442:d2c15dda23c1 1113 /* Enable conversion of regular group. */
mbed_official 442:d2c15dda23c1 1114 /* If software start has been selected, conversion starts immediately. */
mbed_official 442:d2c15dda23c1 1115 /* If external trigger has been selected, conversion will start at next */
mbed_official 442:d2c15dda23c1 1116 /* trigger event. */
mbed_official 442:d2c15dda23c1 1117 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 442:d2c15dda23c1 1118 }
mbed_official 340:28d1f895c6fe 1119 }
mbed_official 442:d2c15dda23c1 1120 else
mbed_official 442:d2c15dda23c1 1121 {
mbed_official 631:825f75ca301e 1122 tmp_hal_status = HAL_BUSY;
mbed_official 442:d2c15dda23c1 1123 }
mbed_official 442:d2c15dda23c1 1124
mbed_official 340:28d1f895c6fe 1125 /* Return function status */
mbed_official 631:825f75ca301e 1126 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1127 }
mbed_official 340:28d1f895c6fe 1128
mbed_official 340:28d1f895c6fe 1129
mbed_official 340:28d1f895c6fe 1130 /**
mbed_official 340:28d1f895c6fe 1131 * @brief Stop ADC conversion of regular group, disable interruption of
mbed_official 340:28d1f895c6fe 1132 * end-of-conversion, disable ADC peripheral.
mbed_official 340:28d1f895c6fe 1133 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1134 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1135 */
mbed_official 340:28d1f895c6fe 1136 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1137 {
mbed_official 631:825f75ca301e 1138 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1139
mbed_official 340:28d1f895c6fe 1140 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1141 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1142
mbed_official 340:28d1f895c6fe 1143 /* Process locked */
mbed_official 340:28d1f895c6fe 1144 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1145
mbed_official 340:28d1f895c6fe 1146 /* 1. Stop potential conversion on going, on regular group */
mbed_official 631:825f75ca301e 1147 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 631:825f75ca301e 1148
mbed_official 340:28d1f895c6fe 1149 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 631:825f75ca301e 1150 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1151 {
mbed_official 340:28d1f895c6fe 1152 /* Disable ADC end of conversion interrupt for regular group */
mbed_official 340:28d1f895c6fe 1153 /* Disable ADC overrun interrupt */
mbed_official 340:28d1f895c6fe 1154 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
mbed_official 340:28d1f895c6fe 1155
mbed_official 340:28d1f895c6fe 1156 /* 2. Disable the ADC peripheral */
mbed_official 631:825f75ca301e 1157 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1158
mbed_official 340:28d1f895c6fe 1159 /* Check if ADC is effectively disabled */
mbed_official 631:825f75ca301e 1160 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1161 {
mbed_official 631:825f75ca301e 1162 /* Set ADC state */
mbed_official 631:825f75ca301e 1163 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 1164 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 1165 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1166 }
mbed_official 340:28d1f895c6fe 1167 }
mbed_official 340:28d1f895c6fe 1168
mbed_official 340:28d1f895c6fe 1169 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1170 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1171
mbed_official 340:28d1f895c6fe 1172 /* Return function status */
mbed_official 631:825f75ca301e 1173 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1174 }
mbed_official 340:28d1f895c6fe 1175
mbed_official 340:28d1f895c6fe 1176 /**
mbed_official 340:28d1f895c6fe 1177 * @brief Enables ADC, starts conversion of regular group and transfers result
mbed_official 340:28d1f895c6fe 1178 * through DMA.
mbed_official 340:28d1f895c6fe 1179 * Interruptions enabled in this function:
mbed_official 442:d2c15dda23c1 1180 * - DMA transfer complete
mbed_official 442:d2c15dda23c1 1181 * - DMA half transfer
mbed_official 442:d2c15dda23c1 1182 * - overrun
mbed_official 340:28d1f895c6fe 1183 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1184 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1185 * @param pData: The destination Buffer address.
mbed_official 340:28d1f895c6fe 1186 * @param Length: The length of data to be transferred from ADC peripheral to memory.
mbed_official 340:28d1f895c6fe 1187 * @retval None
mbed_official 340:28d1f895c6fe 1188 */
mbed_official 340:28d1f895c6fe 1189 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
mbed_official 340:28d1f895c6fe 1190 {
mbed_official 631:825f75ca301e 1191 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1192
mbed_official 340:28d1f895c6fe 1193 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1194 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 442:d2c15dda23c1 1195
mbed_official 442:d2c15dda23c1 1196 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 631:825f75ca301e 1197 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1198 {
mbed_official 442:d2c15dda23c1 1199 /* Process locked */
mbed_official 442:d2c15dda23c1 1200 __HAL_LOCK(hadc);
mbed_official 442:d2c15dda23c1 1201
mbed_official 442:d2c15dda23c1 1202 /* Enable the ADC peripheral */
mbed_official 442:d2c15dda23c1 1203 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 442:d2c15dda23c1 1204 /* performed automatically by hardware. */
mbed_official 442:d2c15dda23c1 1205 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 442:d2c15dda23c1 1206 {
mbed_official 631:825f75ca301e 1207 tmp_hal_status = ADC_Enable(hadc);
mbed_official 442:d2c15dda23c1 1208 }
mbed_official 340:28d1f895c6fe 1209
mbed_official 442:d2c15dda23c1 1210 /* Start conversion if ADC is effectively enabled */
mbed_official 631:825f75ca301e 1211 if (tmp_hal_status == HAL_OK)
mbed_official 442:d2c15dda23c1 1212 {
mbed_official 631:825f75ca301e 1213 /* Set ADC state */
mbed_official 631:825f75ca301e 1214 /* - Clear state bitfield related to regular group conversion results */
mbed_official 631:825f75ca301e 1215 /* - Set state bitfield related to regular operation */
mbed_official 631:825f75ca301e 1216 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 1217 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 631:825f75ca301e 1218 HAL_ADC_STATE_REG_BUSY);
mbed_official 442:d2c15dda23c1 1219
mbed_official 631:825f75ca301e 1220 /* Reset ADC all error code fields */
mbed_official 631:825f75ca301e 1221 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 442:d2c15dda23c1 1222
mbed_official 631:825f75ca301e 1223 /* Process unlocked */
mbed_official 631:825f75ca301e 1224 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 631:825f75ca301e 1225 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 631:825f75ca301e 1226 __HAL_UNLOCK(hadc);
mbed_official 631:825f75ca301e 1227
mbed_official 442:d2c15dda23c1 1228 /* Set the DMA transfer complete callback */
mbed_official 442:d2c15dda23c1 1229 hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
mbed_official 442:d2c15dda23c1 1230
mbed_official 442:d2c15dda23c1 1231 /* Set the DMA half transfer complete callback */
mbed_official 442:d2c15dda23c1 1232 hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
mbed_official 442:d2c15dda23c1 1233
mbed_official 442:d2c15dda23c1 1234 /* Set the DMA error callback */
mbed_official 442:d2c15dda23c1 1235 hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
mbed_official 340:28d1f895c6fe 1236
mbed_official 442:d2c15dda23c1 1237
mbed_official 442:d2c15dda23c1 1238 /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
mbed_official 442:d2c15dda23c1 1239 /* start (in case of SW start): */
mbed_official 442:d2c15dda23c1 1240
mbed_official 442:d2c15dda23c1 1241 /* Clear regular group conversion flag and overrun flag */
mbed_official 442:d2c15dda23c1 1242 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 442:d2c15dda23c1 1243 /* operations) */
mbed_official 442:d2c15dda23c1 1244 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 442:d2c15dda23c1 1245
mbed_official 442:d2c15dda23c1 1246 /* Enable ADC overrun interrupt */
mbed_official 442:d2c15dda23c1 1247 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
mbed_official 442:d2c15dda23c1 1248
mbed_official 442:d2c15dda23c1 1249 /* Enable ADC DMA mode */
mbed_official 442:d2c15dda23c1 1250 hadc->Instance->CFGR1 |= ADC_CFGR1_DMAEN;
mbed_official 442:d2c15dda23c1 1251
mbed_official 442:d2c15dda23c1 1252 /* Start the DMA channel */
mbed_official 442:d2c15dda23c1 1253 HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
mbed_official 442:d2c15dda23c1 1254
mbed_official 442:d2c15dda23c1 1255 /* Enable conversion of regular group. */
mbed_official 442:d2c15dda23c1 1256 /* If software start has been selected, conversion starts immediately. */
mbed_official 442:d2c15dda23c1 1257 /* If external trigger has been selected, conversion will start at next */
mbed_official 442:d2c15dda23c1 1258 /* trigger event. */
mbed_official 442:d2c15dda23c1 1259 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 442:d2c15dda23c1 1260 }
mbed_official 442:d2c15dda23c1 1261 }
mbed_official 442:d2c15dda23c1 1262 else
mbed_official 442:d2c15dda23c1 1263 {
mbed_official 631:825f75ca301e 1264 tmp_hal_status = HAL_BUSY;
mbed_official 442:d2c15dda23c1 1265 }
mbed_official 340:28d1f895c6fe 1266
mbed_official 340:28d1f895c6fe 1267 /* Return function status */
mbed_official 631:825f75ca301e 1268 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1269 }
mbed_official 340:28d1f895c6fe 1270
mbed_official 340:28d1f895c6fe 1271 /**
mbed_official 340:28d1f895c6fe 1272 * @brief Stop ADC conversion of regular group, disable ADC DMA transfer, disable
mbed_official 340:28d1f895c6fe 1273 * ADC peripheral.
mbed_official 340:28d1f895c6fe 1274 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1275 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1276 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1277 */
mbed_official 340:28d1f895c6fe 1278 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1279 {
mbed_official 631:825f75ca301e 1280 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1281
mbed_official 340:28d1f895c6fe 1282 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1283 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1284
mbed_official 340:28d1f895c6fe 1285 /* Process locked */
mbed_official 340:28d1f895c6fe 1286 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1287
mbed_official 340:28d1f895c6fe 1288 /* 1. Stop potential conversion on going, on regular group */
mbed_official 631:825f75ca301e 1289 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 1290
mbed_official 340:28d1f895c6fe 1291 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 631:825f75ca301e 1292 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1293 {
mbed_official 340:28d1f895c6fe 1294 /* Disable ADC DMA (ADC DMA configuration ADC_CFGR_DMACFG is kept) */
mbed_official 340:28d1f895c6fe 1295 hadc->Instance->CFGR1 &= ~ADC_CFGR1_DMAEN;
mbed_official 340:28d1f895c6fe 1296
mbed_official 340:28d1f895c6fe 1297 /* Disable the DMA channel (in case of DMA in circular mode or stop while */
mbed_official 340:28d1f895c6fe 1298 /* while DMA transfer is on going) */
mbed_official 631:825f75ca301e 1299 tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
mbed_official 340:28d1f895c6fe 1300
mbed_official 340:28d1f895c6fe 1301 /* Check if DMA channel effectively disabled */
mbed_official 631:825f75ca301e 1302 if (tmp_hal_status != HAL_OK)
mbed_official 340:28d1f895c6fe 1303 {
mbed_official 340:28d1f895c6fe 1304 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1305 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
mbed_official 340:28d1f895c6fe 1306 }
mbed_official 340:28d1f895c6fe 1307
mbed_official 340:28d1f895c6fe 1308 /* Disable ADC overrun interrupt */
mbed_official 340:28d1f895c6fe 1309 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
mbed_official 340:28d1f895c6fe 1310
mbed_official 340:28d1f895c6fe 1311 /* 2. Disable the ADC peripheral */
mbed_official 631:825f75ca301e 1312 /* Update "tmp_hal_status" only if DMA channel disabling passed, to keep */
mbed_official 631:825f75ca301e 1313 /* in memory a potential failing status. */
mbed_official 631:825f75ca301e 1314 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1315 {
mbed_official 631:825f75ca301e 1316 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1317 }
mbed_official 340:28d1f895c6fe 1318 else
mbed_official 340:28d1f895c6fe 1319 {
mbed_official 340:28d1f895c6fe 1320 ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1321 }
mbed_official 340:28d1f895c6fe 1322
mbed_official 340:28d1f895c6fe 1323 /* Check if ADC is effectively disabled */
mbed_official 631:825f75ca301e 1324 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1325 {
mbed_official 631:825f75ca301e 1326 /* Set ADC state */
mbed_official 631:825f75ca301e 1327 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 1328 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 1329 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1330 }
mbed_official 340:28d1f895c6fe 1331
mbed_official 340:28d1f895c6fe 1332 }
mbed_official 340:28d1f895c6fe 1333
mbed_official 340:28d1f895c6fe 1334 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1335 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1336
mbed_official 340:28d1f895c6fe 1337 /* Return function status */
mbed_official 631:825f75ca301e 1338 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1339 }
mbed_official 340:28d1f895c6fe 1340
mbed_official 340:28d1f895c6fe 1341 /**
mbed_official 340:28d1f895c6fe 1342 * @brief Get ADC regular group conversion result.
mbed_official 442:d2c15dda23c1 1343 * @note Reading DR register automatically clears EOC (end of conversion of
mbed_official 442:d2c15dda23c1 1344 * regular group) flag.
mbed_official 442:d2c15dda23c1 1345 * Additionally, this functions clears EOS (end of sequence of
mbed_official 442:d2c15dda23c1 1346 * regular group) flag, in case of the end of the sequence is reached.
mbed_official 340:28d1f895c6fe 1347 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1348 * @retval Converted value
mbed_official 340:28d1f895c6fe 1349 */
mbed_official 340:28d1f895c6fe 1350 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1351 {
mbed_official 340:28d1f895c6fe 1352 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1353 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1354
mbed_official 631:825f75ca301e 1355 /* Note: EOC flag is not cleared here by software because automatically */
mbed_official 442:d2c15dda23c1 1356 /* cleared by hardware when reading register DR. */
mbed_official 340:28d1f895c6fe 1357
mbed_official 442:d2c15dda23c1 1358 /* Clear regular group end of sequence flag */
mbed_official 442:d2c15dda23c1 1359 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS);
mbed_official 340:28d1f895c6fe 1360
mbed_official 340:28d1f895c6fe 1361 /* Return ADC converted value */
mbed_official 340:28d1f895c6fe 1362 return hadc->Instance->DR;
mbed_official 340:28d1f895c6fe 1363 }
mbed_official 340:28d1f895c6fe 1364
mbed_official 340:28d1f895c6fe 1365 /**
mbed_official 340:28d1f895c6fe 1366 * @brief Handles ADC interrupt request.
mbed_official 340:28d1f895c6fe 1367 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1368 * @retval None
mbed_official 340:28d1f895c6fe 1369 */
mbed_official 340:28d1f895c6fe 1370 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1371 {
mbed_official 340:28d1f895c6fe 1372 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1373 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1374 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
mbed_official 340:28d1f895c6fe 1375 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
mbed_official 340:28d1f895c6fe 1376
mbed_official 340:28d1f895c6fe 1377 /* ========== Check End of Conversion flag for regular group ========== */
mbed_official 340:28d1f895c6fe 1378 if( (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOC)) ||
mbed_official 340:28d1f895c6fe 1379 (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOS)) )
mbed_official 340:28d1f895c6fe 1380 {
mbed_official 340:28d1f895c6fe 1381 /* Update state machine on conversion status if not in error state */
mbed_official 631:825f75ca301e 1382 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
mbed_official 340:28d1f895c6fe 1383 {
mbed_official 631:825f75ca301e 1384 /* Set ADC state */
mbed_official 631:825f75ca301e 1385 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 340:28d1f895c6fe 1386 }
mbed_official 340:28d1f895c6fe 1387
mbed_official 631:825f75ca301e 1388 /* Determine whether any further conversion upcoming on group regular */
mbed_official 631:825f75ca301e 1389 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 631:825f75ca301e 1390 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 631:825f75ca301e 1391 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 340:28d1f895c6fe 1392 {
mbed_official 340:28d1f895c6fe 1393 /* If End of Sequence is reached, disable interrupts */
mbed_official 340:28d1f895c6fe 1394 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 340:28d1f895c6fe 1395 {
mbed_official 340:28d1f895c6fe 1396 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 340:28d1f895c6fe 1397 /* ADSTART==0 (no conversion on going) */
mbed_official 631:825f75ca301e 1398 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1399 {
mbed_official 631:825f75ca301e 1400 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 631:825f75ca301e 1401 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 340:28d1f895c6fe 1402 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 340:28d1f895c6fe 1403 /* by overrun IRQ process below. */
mbed_official 340:28d1f895c6fe 1404 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 631:825f75ca301e 1405
mbed_official 631:825f75ca301e 1406 /* Set ADC state */
mbed_official 631:825f75ca301e 1407 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 1408 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 1409 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1410 }
mbed_official 340:28d1f895c6fe 1411 else
mbed_official 340:28d1f895c6fe 1412 {
mbed_official 340:28d1f895c6fe 1413 /* Change ADC state to error state */
mbed_official 631:825f75ca301e 1414 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1415
mbed_official 340:28d1f895c6fe 1416 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 1417 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1418 }
mbed_official 340:28d1f895c6fe 1419 }
mbed_official 340:28d1f895c6fe 1420 }
mbed_official 340:28d1f895c6fe 1421
mbed_official 340:28d1f895c6fe 1422 /* Conversion complete callback */
mbed_official 631:825f75ca301e 1423 /* Note: into callback, to determine if conversion has been triggered */
mbed_official 340:28d1f895c6fe 1424 /* from EOC or EOS, possibility to use: */
mbed_official 340:28d1f895c6fe 1425 /* " if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) " */
mbed_official 340:28d1f895c6fe 1426 HAL_ADC_ConvCpltCallback(hadc);
mbed_official 340:28d1f895c6fe 1427
mbed_official 340:28d1f895c6fe 1428
mbed_official 340:28d1f895c6fe 1429 /* Clear regular group conversion flag */
mbed_official 631:825f75ca301e 1430 /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of */
mbed_official 631:825f75ca301e 1431 /* conversion flags clear induces the release of the preserved data.*/
mbed_official 340:28d1f895c6fe 1432 /* Therefore, if the preserved data value is needed, it must be */
mbed_official 340:28d1f895c6fe 1433 /* read preliminarily into HAL_ADC_ConvCpltCallback(). */
mbed_official 340:28d1f895c6fe 1434 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS) );
mbed_official 340:28d1f895c6fe 1435 }
mbed_official 340:28d1f895c6fe 1436
mbed_official 340:28d1f895c6fe 1437 /* ========== Check Analog watchdog flags ========== */
mbed_official 340:28d1f895c6fe 1438 if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_AWD))
mbed_official 340:28d1f895c6fe 1439 {
mbed_official 631:825f75ca301e 1440 /* Set ADC state */
mbed_official 631:825f75ca301e 1441 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
mbed_official 340:28d1f895c6fe 1442
mbed_official 442:d2c15dda23c1 1443 /* Level out of window callback */
mbed_official 442:d2c15dda23c1 1444 HAL_ADC_LevelOutOfWindowCallback(hadc);
mbed_official 442:d2c15dda23c1 1445
mbed_official 340:28d1f895c6fe 1446 /* Clear ADC Analog watchdog flag */
mbed_official 340:28d1f895c6fe 1447 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
mbed_official 442:d2c15dda23c1 1448
mbed_official 340:28d1f895c6fe 1449 }
mbed_official 340:28d1f895c6fe 1450
mbed_official 340:28d1f895c6fe 1451
mbed_official 340:28d1f895c6fe 1452 /* ========== Check Overrun flag ========== */
mbed_official 340:28d1f895c6fe 1453 if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_OVR) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_OVR))
mbed_official 340:28d1f895c6fe 1454 {
mbed_official 340:28d1f895c6fe 1455 /* If overrun is set to overwrite previous data (default setting), */
mbed_official 340:28d1f895c6fe 1456 /* overrun event is not considered as an error. */
mbed_official 340:28d1f895c6fe 1457 /* (cf ref manual "Managing conversions without using the DMA and without */
mbed_official 340:28d1f895c6fe 1458 /* overrun ") */
mbed_official 340:28d1f895c6fe 1459 /* Exception for usage with DMA overrun event always considered as an */
mbed_official 340:28d1f895c6fe 1460 /* error. */
mbed_official 631:825f75ca301e 1461 if ((hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) ||
mbed_official 340:28d1f895c6fe 1462 HAL_IS_BIT_SET(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN) )
mbed_official 340:28d1f895c6fe 1463 {
mbed_official 631:825f75ca301e 1464 /* Set ADC error code to overrun */
mbed_official 631:825f75ca301e 1465 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
mbed_official 340:28d1f895c6fe 1466
mbed_official 631:825f75ca301e 1467 /* Clear ADC overrun flag */
mbed_official 631:825f75ca301e 1468 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1469
mbed_official 340:28d1f895c6fe 1470 /* Error callback */
mbed_official 340:28d1f895c6fe 1471 HAL_ADC_ErrorCallback(hadc);
mbed_official 340:28d1f895c6fe 1472 }
mbed_official 340:28d1f895c6fe 1473
mbed_official 340:28d1f895c6fe 1474 /* Clear the Overrun flag */
mbed_official 340:28d1f895c6fe 1475 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1476 }
mbed_official 340:28d1f895c6fe 1477
mbed_official 340:28d1f895c6fe 1478 }
mbed_official 340:28d1f895c6fe 1479
mbed_official 340:28d1f895c6fe 1480
mbed_official 340:28d1f895c6fe 1481 /**
mbed_official 340:28d1f895c6fe 1482 * @brief Conversion complete callback in non blocking mode
mbed_official 340:28d1f895c6fe 1483 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1484 * @retval None
mbed_official 340:28d1f895c6fe 1485 */
mbed_official 340:28d1f895c6fe 1486 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1487 {
mbed_official 340:28d1f895c6fe 1488 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1489 function HAL_ADC_ConvCpltCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1490 */
mbed_official 340:28d1f895c6fe 1491 }
mbed_official 340:28d1f895c6fe 1492
mbed_official 340:28d1f895c6fe 1493 /**
mbed_official 340:28d1f895c6fe 1494 * @brief Conversion DMA half-transfer callback in non blocking mode
mbed_official 340:28d1f895c6fe 1495 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1496 * @retval None
mbed_official 340:28d1f895c6fe 1497 */
mbed_official 340:28d1f895c6fe 1498 __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1499 {
mbed_official 340:28d1f895c6fe 1500 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1501 function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1502 */
mbed_official 340:28d1f895c6fe 1503 }
mbed_official 340:28d1f895c6fe 1504
mbed_official 340:28d1f895c6fe 1505 /**
mbed_official 340:28d1f895c6fe 1506 * @brief Analog watchdog callback in non blocking mode.
mbed_official 340:28d1f895c6fe 1507 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1508 * @retval None
mbed_official 340:28d1f895c6fe 1509 */
mbed_official 340:28d1f895c6fe 1510 __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1511 {
mbed_official 340:28d1f895c6fe 1512 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1513 function HAL_ADC_LevelOoutOfWindowCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1514 */
mbed_official 340:28d1f895c6fe 1515 }
mbed_official 340:28d1f895c6fe 1516
mbed_official 340:28d1f895c6fe 1517 /**
mbed_official 340:28d1f895c6fe 1518 * @brief ADC error callback in non blocking mode
mbed_official 340:28d1f895c6fe 1519 * (ADC conversion with interruption or transfer by DMA)
mbed_official 340:28d1f895c6fe 1520 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1521 * @retval None
mbed_official 340:28d1f895c6fe 1522 */
mbed_official 340:28d1f895c6fe 1523 __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
mbed_official 340:28d1f895c6fe 1524 {
mbed_official 340:28d1f895c6fe 1525 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1526 function HAL_ADC_ErrorCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1527 */
mbed_official 340:28d1f895c6fe 1528 }
mbed_official 340:28d1f895c6fe 1529
mbed_official 340:28d1f895c6fe 1530
mbed_official 340:28d1f895c6fe 1531 /**
mbed_official 340:28d1f895c6fe 1532 * @}
mbed_official 340:28d1f895c6fe 1533 */
mbed_official 340:28d1f895c6fe 1534
mbed_official 340:28d1f895c6fe 1535 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
mbed_official 340:28d1f895c6fe 1536 * @brief Peripheral Control functions
mbed_official 340:28d1f895c6fe 1537 *
mbed_official 340:28d1f895c6fe 1538 @verbatim
mbed_official 340:28d1f895c6fe 1539 ===============================================================================
mbed_official 340:28d1f895c6fe 1540 ##### Peripheral Control functions #####
mbed_official 340:28d1f895c6fe 1541 ===============================================================================
mbed_official 340:28d1f895c6fe 1542 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 1543 (+) Configure channels on regular group
mbed_official 340:28d1f895c6fe 1544 (+) Configure the analog watchdog
mbed_official 340:28d1f895c6fe 1545
mbed_official 340:28d1f895c6fe 1546 @endverbatim
mbed_official 340:28d1f895c6fe 1547 * @{
mbed_official 340:28d1f895c6fe 1548 */
mbed_official 340:28d1f895c6fe 1549
mbed_official 340:28d1f895c6fe 1550 /**
mbed_official 340:28d1f895c6fe 1551 * @brief Configures the the selected channel to be linked to the regular
mbed_official 340:28d1f895c6fe 1552 * group.
mbed_official 340:28d1f895c6fe 1553 * @note In case of usage of internal measurement channels:
mbed_official 340:28d1f895c6fe 1554 * VrefInt/Vbat/TempSensor.
mbed_official 340:28d1f895c6fe 1555 * Sampling time constraints must be respected (sampling time can be
mbed_official 340:28d1f895c6fe 1556 * adjusted in function of ADC clock frequency and sampling time
mbed_official 340:28d1f895c6fe 1557 * setting).
mbed_official 340:28d1f895c6fe 1558 * Refer to device datasheet for timings values, parameters TS_vrefint,
mbed_official 340:28d1f895c6fe 1559 * TS_vbat, TS_temp (values rough order: 5us to 17us).
mbed_official 340:28d1f895c6fe 1560 * These internal paths can be be disabled using function
mbed_official 340:28d1f895c6fe 1561 * HAL_ADC_DeInit().
mbed_official 340:28d1f895c6fe 1562 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 1563 * This function initializes channel into regular group, following
mbed_official 340:28d1f895c6fe 1564 * calls to this function can be used to reconfigure some parameters
mbed_official 340:28d1f895c6fe 1565 * of structure "ADC_ChannelConfTypeDef" on the fly, without reseting
mbed_official 340:28d1f895c6fe 1566 * the ADC.
mbed_official 340:28d1f895c6fe 1567 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 1568 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 1569 * "ADC_ChannelConfTypeDef".
mbed_official 340:28d1f895c6fe 1570 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1571 * @param sConfig: Structure of ADC channel for regular group.
mbed_official 340:28d1f895c6fe 1572 * @retval HAL status
mbed_official 340:28d1f895c6fe 1573 */
mbed_official 340:28d1f895c6fe 1574 HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
mbed_official 340:28d1f895c6fe 1575 {
mbed_official 631:825f75ca301e 1576 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1577 __IO uint32_t wait_loop_index = 0;
mbed_official 340:28d1f895c6fe 1578
mbed_official 340:28d1f895c6fe 1579 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1580 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1581 assert_param(IS_ADC_CHANNEL(sConfig->Channel));
mbed_official 340:28d1f895c6fe 1582 assert_param(IS_ADC_RANK(sConfig->Rank));
mbed_official 631:825f75ca301e 1583
mbed_official 631:825f75ca301e 1584 if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 631:825f75ca301e 1585 {
mbed_official 631:825f75ca301e 1586 assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));
mbed_official 631:825f75ca301e 1587 }
mbed_official 631:825f75ca301e 1588
mbed_official 340:28d1f895c6fe 1589 /* Process locked */
mbed_official 340:28d1f895c6fe 1590 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1591
mbed_official 340:28d1f895c6fe 1592 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 1593 /* Parameters that can be updated when ADC is disabled or enabled without */
mbed_official 340:28d1f895c6fe 1594 /* conversion on going on regular group: */
mbed_official 340:28d1f895c6fe 1595 /* - Channel number */
mbed_official 340:28d1f895c6fe 1596 /* - Channel sampling time */
mbed_official 631:825f75ca301e 1597 /* - Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 631:825f75ca301e 1598 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1599 {
mbed_official 340:28d1f895c6fe 1600 /* Configure channel: depending on rank setting, add it or remove it from */
mbed_official 340:28d1f895c6fe 1601 /* ADC conversion sequencer. */
mbed_official 340:28d1f895c6fe 1602 if (sConfig->Rank != ADC_RANK_NONE)
mbed_official 340:28d1f895c6fe 1603 {
mbed_official 340:28d1f895c6fe 1604 /* Regular sequence configuration */
mbed_official 340:28d1f895c6fe 1605 /* Set the channel selection register from the selected channel */
mbed_official 631:825f75ca301e 1606 hadc->Instance->CHSELR |= ADC_CHSELR_CHANNEL(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1607
mbed_official 340:28d1f895c6fe 1608 /* Channel sampling time configuration */
mbed_official 631:825f75ca301e 1609 /* Management of parameters "SamplingTimeCommon" and "SamplingTime" */
mbed_official 631:825f75ca301e 1610 /* (obsolete): sampling time set in this function with */
mbed_official 631:825f75ca301e 1611 /* parameter "SamplingTime" (obsolete) only if not already set into */
mbed_official 631:825f75ca301e 1612 /* ADC initialization structure with parameter "SamplingTimeCommon". */
mbed_official 631:825f75ca301e 1613 if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 340:28d1f895c6fe 1614 {
mbed_official 631:825f75ca301e 1615 /* Modify sampling time if needed (not needed in case of reoccurrence */
mbed_official 631:825f75ca301e 1616 /* for several channels programmed consecutively into the sequencer) */
mbed_official 631:825f75ca301e 1617 if (sConfig->SamplingTime != ADC_GET_SAMPLINGTIME(hadc))
mbed_official 631:825f75ca301e 1618 {
mbed_official 631:825f75ca301e 1619 /* Channel sampling time configuration */
mbed_official 631:825f75ca301e 1620 /* Clear the old sample time */
mbed_official 631:825f75ca301e 1621 hadc->Instance->SMPR &= ~(ADC_SMPR_SMP);
mbed_official 631:825f75ca301e 1622
mbed_official 631:825f75ca301e 1623 /* Set the new sample time */
mbed_official 631:825f75ca301e 1624 hadc->Instance->SMPR |= ADC_SMPR_SET(sConfig->SamplingTime);
mbed_official 631:825f75ca301e 1625 }
mbed_official 340:28d1f895c6fe 1626 }
mbed_official 631:825f75ca301e 1627
mbed_official 631:825f75ca301e 1628 /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 340:28d1f895c6fe 1629 /* internal measurement paths enable: If internal channel selected, */
mbed_official 340:28d1f895c6fe 1630 /* enable dedicated internal buffers and path. */
mbed_official 631:825f75ca301e 1631 /* Note: these internal measurement paths can be disabled using */
mbed_official 631:825f75ca301e 1632 /* HAL_ADC_DeInit() or removing the channel from sequencer with */
mbed_official 631:825f75ca301e 1633 /* channel configuration parameter "Rank". */
mbed_official 631:825f75ca301e 1634 if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
mbed_official 340:28d1f895c6fe 1635 {
mbed_official 631:825f75ca301e 1636 /* If Channel_16 is selected, enable Temp. sensor measurement path. */
mbed_official 631:825f75ca301e 1637 /* If Channel_17 is selected, enable VREFINT measurement path. */
mbed_official 631:825f75ca301e 1638 /* If Channel_18 is selected, enable VBAT measurement path. */
mbed_official 631:825f75ca301e 1639 ADC->CCR |= ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1640
mbed_official 631:825f75ca301e 1641 /* If Temp. sensor is selected, wait for stabilization delay */
mbed_official 631:825f75ca301e 1642 if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
mbed_official 340:28d1f895c6fe 1643 {
mbed_official 631:825f75ca301e 1644 /* Delay for temperature sensor stabilization time */
mbed_official 631:825f75ca301e 1645 /* Compute number of CPU cycles to wait for */
mbed_official 631:825f75ca301e 1646 wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000));
mbed_official 631:825f75ca301e 1647 while(wait_loop_index != 0)
mbed_official 631:825f75ca301e 1648 {
mbed_official 631:825f75ca301e 1649 wait_loop_index--;
mbed_official 631:825f75ca301e 1650 }
mbed_official 340:28d1f895c6fe 1651 }
mbed_official 340:28d1f895c6fe 1652 }
mbed_official 340:28d1f895c6fe 1653 }
mbed_official 340:28d1f895c6fe 1654 else
mbed_official 340:28d1f895c6fe 1655 {
mbed_official 340:28d1f895c6fe 1656 /* Regular sequence configuration */
mbed_official 340:28d1f895c6fe 1657 /* Reset the channel selection register from the selected channel */
mbed_official 631:825f75ca301e 1658 hadc->Instance->CHSELR &= ~ADC_CHSELR_CHANNEL(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1659
mbed_official 631:825f75ca301e 1660 /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 340:28d1f895c6fe 1661 /* internal measurement paths disable: If internal channel selected, */
mbed_official 340:28d1f895c6fe 1662 /* disable dedicated internal buffers and path. */
mbed_official 631:825f75ca301e 1663 if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
mbed_official 340:28d1f895c6fe 1664 {
mbed_official 631:825f75ca301e 1665 /* If Channel_16 is selected, disable Temp. sensor measurement path. */
mbed_official 631:825f75ca301e 1666 /* If Channel_17 is selected, disable VREFINT measurement path. */
mbed_official 631:825f75ca301e 1667 /* If Channel_18 is selected, disable VBAT measurement path. */
mbed_official 631:825f75ca301e 1668 ADC->CCR &= ~ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1669 }
mbed_official 340:28d1f895c6fe 1670 }
mbed_official 631:825f75ca301e 1671
mbed_official 340:28d1f895c6fe 1672 }
mbed_official 340:28d1f895c6fe 1673
mbed_official 340:28d1f895c6fe 1674 /* If a conversion is on going on regular group, no update on regular */
mbed_official 340:28d1f895c6fe 1675 /* channel could be done on neither of the channel configuration structure */
mbed_official 340:28d1f895c6fe 1676 /* parameters. */
mbed_official 340:28d1f895c6fe 1677 else
mbed_official 340:28d1f895c6fe 1678 {
mbed_official 340:28d1f895c6fe 1679 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1680 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1681
mbed_official 631:825f75ca301e 1682 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 1683 }
mbed_official 340:28d1f895c6fe 1684
mbed_official 340:28d1f895c6fe 1685 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1686 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1687
mbed_official 340:28d1f895c6fe 1688 /* Return function status */
mbed_official 631:825f75ca301e 1689 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1690 }
mbed_official 340:28d1f895c6fe 1691
mbed_official 340:28d1f895c6fe 1692
mbed_official 340:28d1f895c6fe 1693 /**
mbed_official 340:28d1f895c6fe 1694 * @brief Configures the analog watchdog.
mbed_official 340:28d1f895c6fe 1695 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 1696 * This function initializes the selected analog watchdog, following
mbed_official 340:28d1f895c6fe 1697 * calls to this function can be used to reconfigure some parameters
mbed_official 340:28d1f895c6fe 1698 * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without reseting
mbed_official 340:28d1f895c6fe 1699 * the ADC.
mbed_official 340:28d1f895c6fe 1700 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 1701 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 1702 * "ADC_AnalogWDGConfTypeDef".
mbed_official 340:28d1f895c6fe 1703 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1704 * @param AnalogWDGConfig: Structure of ADC analog watchdog configuration
mbed_official 340:28d1f895c6fe 1705 * @retval HAL status
mbed_official 340:28d1f895c6fe 1706 */
mbed_official 340:28d1f895c6fe 1707 HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig)
mbed_official 340:28d1f895c6fe 1708 {
mbed_official 631:825f75ca301e 1709 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1710
mbed_official 340:28d1f895c6fe 1711 uint32_t tmpAWDHighThresholdShifted;
mbed_official 340:28d1f895c6fe 1712 uint32_t tmpAWDLowThresholdShifted;
mbed_official 340:28d1f895c6fe 1713
mbed_official 340:28d1f895c6fe 1714 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1715 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 631:825f75ca301e 1716 assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
mbed_official 340:28d1f895c6fe 1717 assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
mbed_official 340:28d1f895c6fe 1718
mbed_official 340:28d1f895c6fe 1719 /* Verify if threshold is within the selected ADC resolution */
mbed_official 631:825f75ca301e 1720 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
mbed_official 631:825f75ca301e 1721 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
mbed_official 340:28d1f895c6fe 1722
mbed_official 442:d2c15dda23c1 1723 if(AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG)
mbed_official 442:d2c15dda23c1 1724 {
mbed_official 442:d2c15dda23c1 1725 assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel));
mbed_official 442:d2c15dda23c1 1726 }
mbed_official 442:d2c15dda23c1 1727
mbed_official 340:28d1f895c6fe 1728 /* Process locked */
mbed_official 340:28d1f895c6fe 1729 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1730
mbed_official 340:28d1f895c6fe 1731 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 1732 /* Parameters that can be updated when ADC is disabled or enabled without */
mbed_official 340:28d1f895c6fe 1733 /* conversion on going on regular group: */
mbed_official 340:28d1f895c6fe 1734 /* - Analog watchdog channels */
mbed_official 340:28d1f895c6fe 1735 /* - Analog watchdog thresholds */
mbed_official 631:825f75ca301e 1736 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1737 {
mbed_official 340:28d1f895c6fe 1738 /* Configuration of analog watchdog: */
mbed_official 340:28d1f895c6fe 1739 /* - Set the analog watchdog enable mode: one or overall group of */
mbed_official 340:28d1f895c6fe 1740 /* channels. */
mbed_official 340:28d1f895c6fe 1741 /* - Set the Analog watchdog channel (is not used if watchdog */
mbed_official 340:28d1f895c6fe 1742 /* mode "all channels": ADC_CFGR_AWD1SGL=0). */
mbed_official 340:28d1f895c6fe 1743 hadc->Instance->CFGR1 &= ~( ADC_CFGR1_AWDSGL |
mbed_official 340:28d1f895c6fe 1744 ADC_CFGR1_AWDEN |
mbed_official 340:28d1f895c6fe 1745 ADC_CFGR1_AWDCH );
mbed_official 340:28d1f895c6fe 1746
mbed_official 631:825f75ca301e 1747 hadc->Instance->CFGR1 |= ( AnalogWDGConfig->WatchdogMode |
mbed_official 631:825f75ca301e 1748 ADC_CFGR_AWDCH(AnalogWDGConfig->Channel) );
mbed_official 340:28d1f895c6fe 1749
mbed_official 340:28d1f895c6fe 1750 /* Shift the offset in function of the selected ADC resolution: Thresholds*/
mbed_official 340:28d1f895c6fe 1751 /* have to be left-aligned on bit 11, the LSB (right bits) are set to 0 */
mbed_official 631:825f75ca301e 1752 tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
mbed_official 631:825f75ca301e 1753 tmpAWDLowThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
mbed_official 340:28d1f895c6fe 1754
mbed_official 340:28d1f895c6fe 1755 /* Set the high and low thresholds */
mbed_official 340:28d1f895c6fe 1756 hadc->Instance->TR &= ~(ADC_TR_HT | ADC_TR_LT);
mbed_official 631:825f75ca301e 1757 hadc->Instance->TR |= ( ADC_TRX_HIGHTHRESHOLD (tmpAWDHighThresholdShifted) |
mbed_official 631:825f75ca301e 1758 tmpAWDLowThresholdShifted );
mbed_official 340:28d1f895c6fe 1759
mbed_official 442:d2c15dda23c1 1760 /* Clear the ADC Analog watchdog flag (in case of left enabled by */
mbed_official 340:28d1f895c6fe 1761 /* previous ADC operations) to be ready to use for HAL_ADC_IRQHandler() */
mbed_official 340:28d1f895c6fe 1762 /* or HAL_ADC_PollForEvent(). */
mbed_official 340:28d1f895c6fe 1763 __HAL_ADC_CLEAR_FLAG(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1764
mbed_official 340:28d1f895c6fe 1765 /* Configure ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1766 if(AnalogWDGConfig->ITMode == ENABLE)
mbed_official 340:28d1f895c6fe 1767 {
mbed_official 340:28d1f895c6fe 1768 /* Enable the ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1769 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1770 }
mbed_official 340:28d1f895c6fe 1771 else
mbed_official 340:28d1f895c6fe 1772 {
mbed_official 340:28d1f895c6fe 1773 /* Disable the ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1774 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1775 }
mbed_official 340:28d1f895c6fe 1776
mbed_official 340:28d1f895c6fe 1777 }
mbed_official 340:28d1f895c6fe 1778 /* If a conversion is on going on regular group, no update could be done */
mbed_official 340:28d1f895c6fe 1779 /* on neither of the AWD configuration structure parameters. */
mbed_official 340:28d1f895c6fe 1780 else
mbed_official 340:28d1f895c6fe 1781 {
mbed_official 340:28d1f895c6fe 1782 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1783 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1784
mbed_official 631:825f75ca301e 1785 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 1786 }
mbed_official 340:28d1f895c6fe 1787
mbed_official 340:28d1f895c6fe 1788
mbed_official 340:28d1f895c6fe 1789 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1790 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1791
mbed_official 340:28d1f895c6fe 1792 /* Return function status */
mbed_official 631:825f75ca301e 1793 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1794 }
mbed_official 340:28d1f895c6fe 1795
mbed_official 340:28d1f895c6fe 1796
mbed_official 340:28d1f895c6fe 1797 /**
mbed_official 340:28d1f895c6fe 1798 * @}
mbed_official 340:28d1f895c6fe 1799 */
mbed_official 340:28d1f895c6fe 1800
mbed_official 340:28d1f895c6fe 1801
mbed_official 340:28d1f895c6fe 1802 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
mbed_official 340:28d1f895c6fe 1803 * @brief Peripheral State functions
mbed_official 340:28d1f895c6fe 1804 *
mbed_official 340:28d1f895c6fe 1805 @verbatim
mbed_official 340:28d1f895c6fe 1806 ===============================================================================
mbed_official 340:28d1f895c6fe 1807 ##### Peripheral State and Errors functions #####
mbed_official 340:28d1f895c6fe 1808 ===============================================================================
mbed_official 340:28d1f895c6fe 1809 [..]
mbed_official 340:28d1f895c6fe 1810 This subsection provides functions to get in run-time the status of the
mbed_official 340:28d1f895c6fe 1811 peripheral.
mbed_official 340:28d1f895c6fe 1812 (+) Check the ADC state
mbed_official 340:28d1f895c6fe 1813 (+) Check the ADC error code
mbed_official 340:28d1f895c6fe 1814
mbed_official 340:28d1f895c6fe 1815 @endverbatim
mbed_official 340:28d1f895c6fe 1816 * @{
mbed_official 340:28d1f895c6fe 1817 */
mbed_official 340:28d1f895c6fe 1818
mbed_official 340:28d1f895c6fe 1819 /**
mbed_official 340:28d1f895c6fe 1820 * @brief return the ADC state
mbed_official 340:28d1f895c6fe 1821 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1822 * @retval HAL state
mbed_official 340:28d1f895c6fe 1823 */
mbed_official 631:825f75ca301e 1824 uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1825 {
mbed_official 340:28d1f895c6fe 1826 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1827 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1828
mbed_official 340:28d1f895c6fe 1829 /* Return ADC state */
mbed_official 340:28d1f895c6fe 1830 return hadc->State;
mbed_official 340:28d1f895c6fe 1831 }
mbed_official 340:28d1f895c6fe 1832
mbed_official 340:28d1f895c6fe 1833 /**
mbed_official 340:28d1f895c6fe 1834 * @brief Return the ADC error code
mbed_official 340:28d1f895c6fe 1835 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1836 * @retval ADC Error Code
mbed_official 340:28d1f895c6fe 1837 */
mbed_official 340:28d1f895c6fe 1838 uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
mbed_official 340:28d1f895c6fe 1839 {
mbed_official 340:28d1f895c6fe 1840 return hadc->ErrorCode;
mbed_official 340:28d1f895c6fe 1841 }
mbed_official 340:28d1f895c6fe 1842
mbed_official 340:28d1f895c6fe 1843 /**
mbed_official 340:28d1f895c6fe 1844 * @}
mbed_official 340:28d1f895c6fe 1845 */
mbed_official 340:28d1f895c6fe 1846
mbed_official 340:28d1f895c6fe 1847 /**
mbed_official 340:28d1f895c6fe 1848 * @}
mbed_official 340:28d1f895c6fe 1849 */
mbed_official 340:28d1f895c6fe 1850
mbed_official 340:28d1f895c6fe 1851 /** @defgroup ADC_Private_Functions ADC Private Functions
mbed_official 340:28d1f895c6fe 1852 * @{
mbed_official 340:28d1f895c6fe 1853 */
mbed_official 340:28d1f895c6fe 1854
mbed_official 340:28d1f895c6fe 1855 /**
mbed_official 340:28d1f895c6fe 1856 * @brief Enable the selected ADC.
mbed_official 340:28d1f895c6fe 1857 * @note Prerequisite condition to use this function: ADC must be disabled
mbed_official 340:28d1f895c6fe 1858 * and voltage regulator must be enabled (done into HAL_ADC_Init()).
mbed_official 631:825f75ca301e 1859 * @note If low power mode AutoPowerOff is enabled, power-on/off phases are
mbed_official 631:825f75ca301e 1860 * performed automatically by hardware.
mbed_official 631:825f75ca301e 1861 * In this mode, this function is useless and must not be called because
mbed_official 631:825f75ca301e 1862 * flag ADC_FLAG_RDY is not usable.
mbed_official 631:825f75ca301e 1863 * Therefore, this function must be called under condition of
mbed_official 631:825f75ca301e 1864 * "if (hadc->Init.LowPowerAutoPowerOff != ENABLE)".
mbed_official 340:28d1f895c6fe 1865 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1866 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1867 */
mbed_official 340:28d1f895c6fe 1868 static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1869 {
mbed_official 340:28d1f895c6fe 1870 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1871 __IO uint32_t wait_loop_index = 0;
mbed_official 340:28d1f895c6fe 1872
mbed_official 340:28d1f895c6fe 1873 /* ADC enable and wait for ADC ready (in case of ADC is disabled or */
mbed_official 340:28d1f895c6fe 1874 /* enabling phase not yet completed: flag ADC ready not yet set). */
mbed_official 340:28d1f895c6fe 1875 /* Timeout implemented to not be stuck if ADC cannot be enabled (possible */
mbed_official 340:28d1f895c6fe 1876 /* causes: ADC clock not running, ...). */
mbed_official 631:825f75ca301e 1877 if (ADC_IS_ENABLE(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1878 {
mbed_official 340:28d1f895c6fe 1879 /* Check if conditions to enable the ADC are fulfilled */
mbed_official 631:825f75ca301e 1880 if (ADC_ENABLING_CONDITIONS(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1881 {
mbed_official 340:28d1f895c6fe 1882 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1883 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 1884
mbed_official 340:28d1f895c6fe 1885 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 1886 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1887
mbed_official 340:28d1f895c6fe 1888 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1889 }
mbed_official 340:28d1f895c6fe 1890
mbed_official 340:28d1f895c6fe 1891 /* Enable the ADC peripheral */
mbed_official 340:28d1f895c6fe 1892 __HAL_ADC_ENABLE(hadc);
mbed_official 340:28d1f895c6fe 1893
mbed_official 631:825f75ca301e 1894 /* Delay for ADC stabilization time */
mbed_official 631:825f75ca301e 1895 /* Compute number of CPU cycles to wait for */
mbed_official 631:825f75ca301e 1896 wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
mbed_official 631:825f75ca301e 1897 while(wait_loop_index != 0)
mbed_official 340:28d1f895c6fe 1898 {
mbed_official 631:825f75ca301e 1899 wait_loop_index--;
mbed_official 631:825f75ca301e 1900 }
mbed_official 340:28d1f895c6fe 1901
mbed_official 631:825f75ca301e 1902 /* Get tick count */
mbed_official 340:28d1f895c6fe 1903 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 1904
mbed_official 340:28d1f895c6fe 1905 /* Wait for ADC effectively enabled */
mbed_official 340:28d1f895c6fe 1906 while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET)
mbed_official 340:28d1f895c6fe 1907 {
mbed_official 340:28d1f895c6fe 1908 if((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
mbed_official 340:28d1f895c6fe 1909 {
mbed_official 340:28d1f895c6fe 1910 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1911 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 1912
mbed_official 340:28d1f895c6fe 1913 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 1914 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1915
mbed_official 340:28d1f895c6fe 1916 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1917 }
mbed_official 340:28d1f895c6fe 1918 }
mbed_official 340:28d1f895c6fe 1919
mbed_official 340:28d1f895c6fe 1920 }
mbed_official 340:28d1f895c6fe 1921
mbed_official 340:28d1f895c6fe 1922 /* Return HAL status */
mbed_official 340:28d1f895c6fe 1923 return HAL_OK;
mbed_official 340:28d1f895c6fe 1924 }
mbed_official 340:28d1f895c6fe 1925
mbed_official 340:28d1f895c6fe 1926 /**
mbed_official 340:28d1f895c6fe 1927 * @brief Disable the selected ADC.
mbed_official 340:28d1f895c6fe 1928 * @note Prerequisite condition to use this function: ADC conversions must be
mbed_official 340:28d1f895c6fe 1929 * stopped.
mbed_official 340:28d1f895c6fe 1930 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1931 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1932 */
mbed_official 340:28d1f895c6fe 1933 static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1934 {
mbed_official 340:28d1f895c6fe 1935 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1936
mbed_official 340:28d1f895c6fe 1937 /* Verification if ADC is not already disabled: */
mbed_official 631:825f75ca301e 1938 /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */
mbed_official 631:825f75ca301e 1939 /* disabled. */
mbed_official 631:825f75ca301e 1940 if (ADC_IS_ENABLE(hadc) != RESET)
mbed_official 340:28d1f895c6fe 1941 {
mbed_official 340:28d1f895c6fe 1942 /* Check if conditions to disable the ADC are fulfilled */
mbed_official 631:825f75ca301e 1943 if (ADC_DISABLING_CONDITIONS(hadc) != RESET)
mbed_official 340:28d1f895c6fe 1944 {
mbed_official 340:28d1f895c6fe 1945 /* Disable the ADC peripheral */
mbed_official 340:28d1f895c6fe 1946 __HAL_ADC_DISABLE(hadc);
mbed_official 340:28d1f895c6fe 1947 }
mbed_official 340:28d1f895c6fe 1948 else
mbed_official 340:28d1f895c6fe 1949 {
mbed_official 340:28d1f895c6fe 1950 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1951 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 1952
mbed_official 340:28d1f895c6fe 1953 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 1954 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1955
mbed_official 340:28d1f895c6fe 1956 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1957 }
mbed_official 340:28d1f895c6fe 1958
mbed_official 340:28d1f895c6fe 1959 /* Wait for ADC effectively disabled */
mbed_official 631:825f75ca301e 1960 /* Get tick count */
mbed_official 340:28d1f895c6fe 1961 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 1962
mbed_official 340:28d1f895c6fe 1963 while(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN))
mbed_official 340:28d1f895c6fe 1964 {
mbed_official 631:825f75ca301e 1965 if((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
mbed_official 340:28d1f895c6fe 1966 {
mbed_official 340:28d1f895c6fe 1967 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 1968 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 1969
mbed_official 340:28d1f895c6fe 1970 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 1971 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1972
mbed_official 340:28d1f895c6fe 1973 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1974 }
mbed_official 340:28d1f895c6fe 1975 }
mbed_official 340:28d1f895c6fe 1976 }
mbed_official 340:28d1f895c6fe 1977
mbed_official 340:28d1f895c6fe 1978 /* Return HAL status */
mbed_official 340:28d1f895c6fe 1979 return HAL_OK;
mbed_official 340:28d1f895c6fe 1980 }
mbed_official 340:28d1f895c6fe 1981
mbed_official 340:28d1f895c6fe 1982
mbed_official 340:28d1f895c6fe 1983 /**
mbed_official 340:28d1f895c6fe 1984 * @brief Stop ADC conversion.
mbed_official 340:28d1f895c6fe 1985 * @note Prerequisite condition to use this function: ADC conversions must be
mbed_official 340:28d1f895c6fe 1986 * stopped to disable the ADC.
mbed_official 340:28d1f895c6fe 1987 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1988 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1989 */
mbed_official 340:28d1f895c6fe 1990 static HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1991 {
mbed_official 340:28d1f895c6fe 1992 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1993
mbed_official 340:28d1f895c6fe 1994 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1995 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1996
mbed_official 340:28d1f895c6fe 1997 /* Verification if ADC is not already stopped on regular group to bypass */
mbed_official 340:28d1f895c6fe 1998 /* this function if not needed. */
mbed_official 631:825f75ca301e 1999 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc))
mbed_official 340:28d1f895c6fe 2000 {
mbed_official 340:28d1f895c6fe 2001
mbed_official 340:28d1f895c6fe 2002 /* Stop potential conversion on going on regular group */
mbed_official 340:28d1f895c6fe 2003 /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
mbed_official 340:28d1f895c6fe 2004 if (HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADSTART) &&
mbed_official 340:28d1f895c6fe 2005 HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADDIS) )
mbed_official 340:28d1f895c6fe 2006 {
mbed_official 340:28d1f895c6fe 2007 /* Stop conversions on regular group */
mbed_official 340:28d1f895c6fe 2008 hadc->Instance->CR |= ADC_CR_ADSTP;
mbed_official 340:28d1f895c6fe 2009 }
mbed_official 340:28d1f895c6fe 2010
mbed_official 340:28d1f895c6fe 2011 /* Wait for conversion effectively stopped */
mbed_official 631:825f75ca301e 2012 /* Get tick count */
mbed_official 340:28d1f895c6fe 2013 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 2014
mbed_official 340:28d1f895c6fe 2015 while((hadc->Instance->CR & ADC_CR_ADSTART) != RESET)
mbed_official 340:28d1f895c6fe 2016 {
mbed_official 340:28d1f895c6fe 2017 if((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
mbed_official 340:28d1f895c6fe 2018 {
mbed_official 340:28d1f895c6fe 2019 /* Update ADC state machine to error */
mbed_official 631:825f75ca301e 2020 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 2021
mbed_official 340:28d1f895c6fe 2022 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 2023 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 2024
mbed_official 340:28d1f895c6fe 2025 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 2026 }
mbed_official 340:28d1f895c6fe 2027 }
mbed_official 340:28d1f895c6fe 2028
mbed_official 340:28d1f895c6fe 2029 }
mbed_official 340:28d1f895c6fe 2030
mbed_official 340:28d1f895c6fe 2031 /* Return HAL status */
mbed_official 340:28d1f895c6fe 2032 return HAL_OK;
mbed_official 340:28d1f895c6fe 2033 }
mbed_official 340:28d1f895c6fe 2034
mbed_official 631:825f75ca301e 2035
mbed_official 631:825f75ca301e 2036 /**
mbed_official 631:825f75ca301e 2037 * @brief DMA transfer complete callback.
mbed_official 631:825f75ca301e 2038 * @param hdma: pointer to DMA handle.
mbed_official 631:825f75ca301e 2039 * @retval None
mbed_official 631:825f75ca301e 2040 */
mbed_official 631:825f75ca301e 2041 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
mbed_official 631:825f75ca301e 2042 {
mbed_official 631:825f75ca301e 2043 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 631:825f75ca301e 2044 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 631:825f75ca301e 2045
mbed_official 631:825f75ca301e 2046 /* Update state machine on conversion status if not in error state */
mbed_official 631:825f75ca301e 2047 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
mbed_official 631:825f75ca301e 2048 {
mbed_official 631:825f75ca301e 2049 /* Set ADC state */
mbed_official 631:825f75ca301e 2050 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 631:825f75ca301e 2051
mbed_official 631:825f75ca301e 2052 /* Determine whether any further conversion upcoming on group regular */
mbed_official 631:825f75ca301e 2053 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 631:825f75ca301e 2054 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 631:825f75ca301e 2055 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 631:825f75ca301e 2056 {
mbed_official 631:825f75ca301e 2057 /* If End of Sequence is reached, disable interrupts */
mbed_official 631:825f75ca301e 2058 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 631:825f75ca301e 2059 {
mbed_official 631:825f75ca301e 2060 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 631:825f75ca301e 2061 /* ADSTART==0 (no conversion on going) */
mbed_official 631:825f75ca301e 2062 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 631:825f75ca301e 2063 {
mbed_official 631:825f75ca301e 2064 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 631:825f75ca301e 2065 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 631:825f75ca301e 2066 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 631:825f75ca301e 2067 /* by overrun IRQ process below. */
mbed_official 631:825f75ca301e 2068 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 631:825f75ca301e 2069
mbed_official 631:825f75ca301e 2070 /* Set ADC state */
mbed_official 631:825f75ca301e 2071 ADC_STATE_CLR_SET(hadc->State,
mbed_official 631:825f75ca301e 2072 HAL_ADC_STATE_REG_BUSY,
mbed_official 631:825f75ca301e 2073 HAL_ADC_STATE_READY);
mbed_official 631:825f75ca301e 2074 }
mbed_official 631:825f75ca301e 2075 else
mbed_official 631:825f75ca301e 2076 {
mbed_official 631:825f75ca301e 2077 /* Change ADC state to error state */
mbed_official 631:825f75ca301e 2078 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 631:825f75ca301e 2079
mbed_official 631:825f75ca301e 2080 /* Set ADC error code to ADC IP internal error */
mbed_official 631:825f75ca301e 2081 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 631:825f75ca301e 2082 }
mbed_official 631:825f75ca301e 2083 }
mbed_official 631:825f75ca301e 2084 }
mbed_official 631:825f75ca301e 2085
mbed_official 631:825f75ca301e 2086 /* Conversion complete callback */
mbed_official 631:825f75ca301e 2087 HAL_ADC_ConvCpltCallback(hadc);
mbed_official 631:825f75ca301e 2088 }
mbed_official 631:825f75ca301e 2089 else
mbed_official 631:825f75ca301e 2090 {
mbed_official 631:825f75ca301e 2091 /* Call DMA error callback */
mbed_official 631:825f75ca301e 2092 hadc->DMA_Handle->XferErrorCallback(hdma);
mbed_official 631:825f75ca301e 2093 }
mbed_official 631:825f75ca301e 2094
mbed_official 631:825f75ca301e 2095 }
mbed_official 631:825f75ca301e 2096
mbed_official 631:825f75ca301e 2097 /**
mbed_official 631:825f75ca301e 2098 * @brief DMA half transfer complete callback.
mbed_official 631:825f75ca301e 2099 * @param hdma: pointer to DMA handle.
mbed_official 631:825f75ca301e 2100 * @retval None
mbed_official 631:825f75ca301e 2101 */
mbed_official 631:825f75ca301e 2102 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
mbed_official 631:825f75ca301e 2103 {
mbed_official 631:825f75ca301e 2104 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 631:825f75ca301e 2105 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 631:825f75ca301e 2106
mbed_official 631:825f75ca301e 2107 /* Half conversion callback */
mbed_official 631:825f75ca301e 2108 HAL_ADC_ConvHalfCpltCallback(hadc);
mbed_official 631:825f75ca301e 2109 }
mbed_official 631:825f75ca301e 2110
mbed_official 631:825f75ca301e 2111 /**
mbed_official 631:825f75ca301e 2112 * @brief DMA error callback
mbed_official 631:825f75ca301e 2113 * @param hdma: pointer to DMA handle.
mbed_official 631:825f75ca301e 2114 * @retval None
mbed_official 631:825f75ca301e 2115 */
mbed_official 631:825f75ca301e 2116 static void ADC_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 631:825f75ca301e 2117 {
mbed_official 631:825f75ca301e 2118 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 631:825f75ca301e 2119 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 631:825f75ca301e 2120
mbed_official 631:825f75ca301e 2121 /* Set ADC state */
mbed_official 631:825f75ca301e 2122 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
mbed_official 631:825f75ca301e 2123
mbed_official 631:825f75ca301e 2124 /* Set ADC error code to DMA error */
mbed_official 631:825f75ca301e 2125 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
mbed_official 631:825f75ca301e 2126
mbed_official 631:825f75ca301e 2127 /* Error callback */
mbed_official 631:825f75ca301e 2128 HAL_ADC_ErrorCallback(hadc);
mbed_official 631:825f75ca301e 2129 }
mbed_official 631:825f75ca301e 2130
mbed_official 340:28d1f895c6fe 2131 /**
mbed_official 340:28d1f895c6fe 2132 * @}
mbed_official 340:28d1f895c6fe 2133 */
mbed_official 340:28d1f895c6fe 2134
mbed_official 340:28d1f895c6fe 2135 #endif /* HAL_ADC_MODULE_ENABLED */
mbed_official 340:28d1f895c6fe 2136 /**
mbed_official 340:28d1f895c6fe 2137 * @}
mbed_official 340:28d1f895c6fe 2138 */
mbed_official 340:28d1f895c6fe 2139
mbed_official 340:28d1f895c6fe 2140 /**
mbed_official 340:28d1f895c6fe 2141 * @}
mbed_official 340:28d1f895c6fe 2142 */
mbed_official 340:28d1f895c6fe 2143
mbed_official 340:28d1f895c6fe 2144 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/