stm32g0xx_hal_adc.c 114.0 KB
Newer Older
1 2 3 4
/**
  ******************************************************************************
  * @file    stm32g0xx_hal_adc.c
  * @author  MCD Application Team
M
Mr.Tiger 已提交
5 6
  * @brief   This file provides firmware functions to manage the following
  *          functionalities of the Analog to Digital Converter (ADC)
7 8 9 10 11 12 13 14 15 16 17 18
  *          peripheral:
  *           + Initialization and de-initialization functions
  *             ++ Initialization and Configuration of ADC
  *           + Operation functions
  *             ++ Start, stop, get result of conversions of regular
  *                group, using 3 possible modes: polling, interruption or DMA.
  *           + Control functions
  *             ++ Channels configuration on regular group
  *             ++ Analog Watchdog configuration
  *           + State functions
  *             ++ ADC state machine management
  *             ++ Interrupts and flags management
M
Mr.Tiger 已提交
19
  *          Other functions (extended functions) are available in file
20 21 22 23 24 25 26 27 28
  *          "stm32g0xx_hal_adc_ex.c".
  *
  @verbatim
  ==============================================================================
                     ##### ADC peripheral features #####
  ==============================================================================
  [..]
  (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution.

M
Mr.Tiger 已提交
29
  (+) Interrupt generation at the end of regular conversion and in case of
30
      analog watchdog or overrun events.
M
Mr.Tiger 已提交
31

32
  (+) Single and continuous conversion modes.
M
Mr.Tiger 已提交
33

34
  (+) Scan mode for conversion of several channels sequentially.
M
Mr.Tiger 已提交
35

36
  (+) Data alignment with in-built data coherency.
M
Mr.Tiger 已提交
37

38
  (+) Programmable sampling time (common to group of channels)
M
Mr.Tiger 已提交
39

40
  (+) External trigger (timer or EXTI) with configurable polarity
M
Mr.Tiger 已提交
41

42
  (+) DMA request generation for transfer of conversions data of regular group.
M
Mr.Tiger 已提交
43

44
  (+) ADC calibration
M
Mr.Tiger 已提交
45

46
  (+) ADC conversion of regular group.
M
Mr.Tiger 已提交
47

48
  (+) ADC supply requirements: 1.62 V to 3.6 V.
M
Mr.Tiger 已提交
49 50

  (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
      Vdda or to an external voltage reference).


                     ##### How to use this driver #####
  ==============================================================================
    [..]

     *** Configuration of top level parameters related to ADC ***
     ============================================================
     [..]

    (#) Enable the ADC interface
        (++) As prerequisite, ADC clock must be configured at RCC top level.
             Caution: On STM32G0, ADC clock frequency max is 35MHz (refer
                      to device datasheet).
M
Mr.Tiger 已提交
66
                      Therefore, ADC clock source from RCC and ADC clock
67 68 69
                      prescaler must be configured to remain below
                      this maximum frequency.

M
Mr.Tiger 已提交
70
        (++) Two clock settings are mandatory:
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
             (+++) ADC clock (core clock, also possibly conversion clock).

             (+++) ADC clock (conversions clock).
                   Four possible clock sources: synchronous clock from APB clock (same as ADC core clock)
                   or asynchronous clock from RCC level: SYSCLK, HSI16, PLLPCLK.

             (+++) Example:
                   Into HAL_ADC_MspInit() (recommended code location) or with
                   other device clock parameters configuration:
               (+++) __HAL_RCC_ADC_CLK_ENABLE();                  (mandatory: core clock)

        (++) ADC clock source and clock prescaler are configured at ADC level with
             parameter "ClockPrescaler" using function HAL_ADC_Init().

    (#) ADC pins configuration
         (++) Enable the clock for the ADC GPIOs
              using macro __HAL_RCC_GPIOx_CLK_ENABLE()
         (++) Configure these ADC pins in analog mode
              using function HAL_GPIO_Init()

    (#) Optionally, in case of usage of ADC with interruptions:
         (++) Configure the NVIC for ADC
              using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
M
Mr.Tiger 已提交
94 95
         (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
              into the function of corresponding ADC interruption vector
96 97 98 99 100 101 102
              ADCx_IRQHandler().

    (#) Optionally, in case of usage of DMA:
         (++) Configure the DMA (DMA channel, mode normal or circular, ...)
              using function HAL_DMA_Init().
         (++) Configure the NVIC for DMA
              using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
M
Mr.Tiger 已提交
103 104
         (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
              into the function of corresponding DMA interruption vector
105 106 107 108 109 110 111 112 113 114
              DMAx_Channelx_IRQHandler().

     *** Configuration of ADC, group regular, channels parameters ***
     ================================================================
     [..]

    (#) Configure the ADC parameters (resolution, data alignment, ...)
        and regular group parameters (conversion trigger, sequencer, ...)
        using function HAL_ADC_Init().

M
Mr.Tiger 已提交
115
    (#) Configure the channels for regular group parameters (channel number,
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
        channel rank into sequencer, ..., into regular group)
        using function HAL_ADC_ConfigChannel().

    (#) Optionally, configure the analog watchdog parameters (channels
        monitored, thresholds, ...)
        using function HAL_ADC_AnalogWDGConfig().

     *** Execution of ADC conversions ***
     ====================================
     [..]

    (#) Optionally, perform an automatic ADC calibration to improve the
        conversion accuracy
        using function HAL_ADCEx_Calibration_Start().

    (#) ADC driver can be used among three modes: polling, interruption,
        transfer by DMA.

        (++) ADC conversion by polling:
          (+++) Activate the ADC peripheral and start conversions
                using function HAL_ADC_Start()
M
Mr.Tiger 已提交
137
          (+++) Wait for ADC conversion completion
138
                using function HAL_ADC_PollForConversion()
M
Mr.Tiger 已提交
139
          (+++) Retrieve conversion results
140
                using function HAL_ADC_GetValue()
M
Mr.Tiger 已提交
141
          (+++) Stop conversion and disable the ADC peripheral
142 143
                using function HAL_ADC_Stop()

M
Mr.Tiger 已提交
144
        (++) ADC conversion by interruption:
145 146 147 148 149
          (+++) Activate the ADC peripheral and start conversions
                using function HAL_ADC_Start_IT()
          (+++) Wait for ADC conversion completion by call of function
                HAL_ADC_ConvCpltCallback()
                (this function must be implemented in user program)
M
Mr.Tiger 已提交
150
          (+++) Retrieve conversion results
151
                using function HAL_ADC_GetValue()
M
Mr.Tiger 已提交
152
          (+++) Stop conversion and disable the ADC peripheral
153 154 155 156 157 158 159 160 161 162
                using function HAL_ADC_Stop_IT()

        (++) ADC conversion with transfer by DMA:
          (+++) Activate the ADC peripheral and start conversions
                using function HAL_ADC_Start_DMA()
          (+++) Wait for ADC conversion completion by call of function
                HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
                (these functions must be implemented in user program)
          (+++) Conversion results are automatically transferred by DMA into
                destination variable address.
M
Mr.Tiger 已提交
163
          (+++) Stop conversion and disable the ADC peripheral
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
                using function HAL_ADC_Stop_DMA()

     [..]

    (@) Callback functions must be implemented in user program:
      (+@) HAL_ADC_ErrorCallback()
      (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
      (+@) HAL_ADC_ConvCpltCallback()
      (+@) HAL_ADC_ConvHalfCpltCallback

     *** Deinitialization of ADC ***
     ============================================================
     [..]

    (#) Disable the ADC interface
      (++) ADC clock can be hard reset and disabled at RCC top level.
        (++) Hard reset of ADC peripherals
             using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
        (++) ADC clock disable
             using the equivalent macro/functions as configuration step.
             (+++) Example:
                   Into HAL_ADC_MspDeInit() (recommended code location) or with
                   other device clock parameters configuration:
               (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
               (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (if not used for system clock)
               (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);

    (#) ADC pins configuration
         (++) Disable the clock for the ADC GPIOs
              using macro __HAL_RCC_GPIOx_CLK_DISABLE()

    (#) Optionally, in case of usage of ADC with interruptions:
         (++) Disable the NVIC for ADC
              using function HAL_NVIC_EnableIRQ(ADCx_IRQn)

    (#) Optionally, in case of usage of DMA:
         (++) Deinitialize the DMA
              using function HAL_DMA_Init().
         (++) Disable the NVIC for DMA
              using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)

    [..]
M
Mr.Tiger 已提交
206

207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
    *** Callback registration ***
    =============================================
    [..]

     The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
     allows the user to configure dynamically the driver callbacks.
     Use Functions @ref HAL_ADC_RegisterCallback()
     to register an interrupt callback.
    [..]

     Function @ref HAL_ADC_RegisterCallback() allows to register following callbacks:
       (+) ConvCpltCallback               : ADC conversion complete callback
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
       (+) ErrorCallback                  : ADC error callback
       (+) LevelOutOfWindow2Callback      : ADC analog watchdog 2 callback
       (+) LevelOutOfWindow3Callback      : ADC analog watchdog 3 callback
       (+) EndOfSamplingCallback          : ADC end of sampling callback
       (+) MspInitCallback                : ADC Msp Init callback
       (+) MspDeInitCallback              : ADC Msp DeInit callback
     This function takes as parameters the HAL peripheral handle, the Callback ID
     and a pointer to the user callback function.
    [..]

     Use function @ref HAL_ADC_UnRegisterCallback to reset a callback to the default
     weak function.
    [..]

     @ref HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
     and the Callback ID.
     This function allows to reset following callbacks:
       (+) ConvCpltCallback               : ADC conversion complete callback
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
       (+) ErrorCallback                  : ADC error callback
       (+) LevelOutOfWindow2Callback      : ADC analog watchdog 2 callback
       (+) LevelOutOfWindow3Callback      : ADC analog watchdog 3 callback
       (+) EndOfSamplingCallback          : ADC end of sampling callback
       (+) MspInitCallback                : ADC Msp Init callback
       (+) MspDeInitCallback              : ADC Msp DeInit callback
     [..]

     By default, after the @ref HAL_ADC_Init() and when the state is @ref HAL_ADC_STATE_RESET
     all callbacks are set to the corresponding weak functions:
     examples @ref HAL_ADC_ConvCpltCallback(), @ref HAL_ADC_ErrorCallback().
     Exception done for MspInit and MspDeInit functions that are
     reset to the legacy weak functions in the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit() only when
     these callbacks are null (not registered beforehand).
    [..]

     If MspInit or MspDeInit are not null, the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit()
     keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
     [..]

     Callbacks can be registered/unregistered in @ref HAL_ADC_STATE_READY state only.
     Exception done MspInit/MspDeInit functions that can be registered/unregistered
     in @ref HAL_ADC_STATE_READY or @ref HAL_ADC_STATE_RESET state,
     thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
    [..]

     Then, the user first registers the MspInit/MspDeInit user callbacks
     using @ref HAL_ADC_RegisterCallback() before calling @ref HAL_ADC_DeInit()
     or @ref HAL_ADC_Init() function.
     [..]

     When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
     not defined, the callback registration feature is not available and all callbacks
     are set to the corresponding weak functions.
M
Mr.Tiger 已提交
275

276 277 278 279 280 281 282 283 284 285 286 287
  @endverbatim
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
M
Mr.Tiger 已提交
288
  ******************************************************************************
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32g0xx_hal.h"

/** @addtogroup STM32G0xx_HAL_Driver
  * @{
  */

/** @defgroup ADC ADC
  * @brief ADC HAL module driver
  * @{
  */

#ifdef HAL_ADC_MODULE_ENABLED

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/** @defgroup ADC_Private_Constants ADC Private Constants
  * @{
  */

/* Fixed timeout values for ADC calibration, enable settling time, disable  */
/* settling time.                                                           */
/* Values defined to be higher than worst cases: low clock frequency,       */
/* maximum prescaler.                                                       */
/* Ex of profile low frequency : Clock source at 0.1 MHz, ADC clock         */
/* prescaler 4, sampling time 7.5 ADC clock cycles, resolution 12 bits.     */
/* Unit: ms                                                                 */
#define ADC_ENABLE_TIMEOUT              (2UL)
#define ADC_DISABLE_TIMEOUT             (2UL)
#define ADC_STOP_CONVERSION_TIMEOUT     (2UL)
#define ADC_CHANNEL_CONF_RDY_TIMEOUT    (1UL)

/* Register CHSELR bits corresponding to ranks 2 to 8 .                     */
M
Mr.Tiger 已提交
325 326
#define ADC_CHSELR_SQ2_TO_SQ8           (ADC_CHSELR_SQ2 | ADC_CHSELR_SQ3 | ADC_CHSELR_SQ4 | \
                                         ADC_CHSELR_SQ5 | ADC_CHSELR_SQ6 | ADC_CHSELR_SQ7 | ADC_CHSELR_SQ8)
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353

/**
  * @}
  */

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/** @defgroup ADC_Private_Functions ADC Private Functions
  * @{
  */
static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
static void ADC_DMAError(DMA_HandleTypeDef *hdma);
/**
  * @}
  */

/* Exported functions ---------------------------------------------------------*/

/** @defgroup ADC_Exported_Functions ADC Exported Functions
  * @{
  */

/** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions
  * @brief    ADC Initialization and Configuration functions
  *
M
Mr.Tiger 已提交
354
@verbatim
355 356 357 358
 ===============================================================================
              ##### Initialization and de-initialization functions #####
 ===============================================================================
    [..]  This section provides functions allowing to:
M
Mr.Tiger 已提交
359
      (+) Initialize and configure the ADC.
360 361 362 363 364 365
      (+) De-initialize the ADC.
@endverbatim
  * @{
  */

/**
M
Mr.Tiger 已提交
366
  * @brief  Initialize the ADC peripheral and regular group according to
367 368 369 370 371 372 373
  *         parameters specified in structure "ADC_InitTypeDef".
  * @note   As prerequisite, ADC clock must be configured at RCC top level
  *         (refer to description of RCC configuration for ADC
  *         in header of this file).
  * @note   Possibility to update parameters on the fly:
  *         This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
  *         coming from ADC state reset. Following calls to this function can
M
Mr.Tiger 已提交
374 375
  *         be used to reconfigure some parameters of ADC_InitTypeDef
  *         structure on the fly, without modifying MSP configuration. If ADC
376 377 378
  *         MSP has to be modified again, HAL_ADC_DeInit() must be called
  *         before HAL_ADC_Init().
  *         The setting of these parameters is conditioned to ADC state.
M
Mr.Tiger 已提交
379
  *         For parameters constraints, see comments of structure
380
  *         "ADC_InitTypeDef".
M
Mr.Tiger 已提交
381 382
  * @note   This function configures the ADC within 2 scopes: scope of entire
  *         ADC and scope of regular group. For parameters details, see comments
383 384 385 386
  *         of structure "ADC_InitTypeDef".
  * @param hadc ADC handle
  * @retval HAL status
  */
M
Mr.Tiger 已提交
387
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)
388 389 390 391 392 393
{
  HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  uint32_t tmpCFGR1 = 0UL;
  uint32_t tmpCFGR2 = 0UL;
  uint32_t tmp_adc_reg_is_conversion_on_going;
  __IO uint32_t wait_loop_index = 0UL;
M
Mr.Tiger 已提交
394

395
  /* Check ADC handle */
M
Mr.Tiger 已提交
396
  if (hadc == NULL)
397 398 399
  {
    return HAL_ERROR;
  }
M
Mr.Tiger 已提交
400

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
  assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
  assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
  assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
  assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
  assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
  assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
  assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoPowerOff));
  assert_param(IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon1));
  assert_param(IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon2));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OversamplingMode));
M
Mr.Tiger 已提交
418

419 420
  assert_param(IS_ADC_TRIGGER_FREQ(hadc->Init.TriggerFrequencyMode));

M
Mr.Tiger 已提交
421
  if (hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
422 423
  {
    assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
M
Mr.Tiger 已提交
424 425

    if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
426 427 428 429
    {
      assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
    }
  }
M
Mr.Tiger 已提交
430

431 432 433
  /* ADC group regular discontinuous mode can be enabled only if              */
  /* continuous mode is disabled.                                             */
  assert_param(!((hadc->Init.DiscontinuousConvMode == ENABLE) && (hadc->Init.ContinuousConvMode == ENABLE)));
M
Mr.Tiger 已提交
434

435 436
  /* Actions performed only if ADC is coming from state reset:                */
  /* - Initialization of ADC MSP                                              */
M
Mr.Tiger 已提交
437
  if (hadc->State == HAL_ADC_STATE_RESET)
438 439 440 441 442 443 444 445 446 447
  {
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    /* Init the ADC Callback settings */
    hadc->ConvCpltCallback              = HAL_ADC_ConvCpltCallback;                 /* Legacy weak callback */
    hadc->ConvHalfCpltCallback          = HAL_ADC_ConvHalfCpltCallback;             /* Legacy weak callback */
    hadc->LevelOutOfWindowCallback      = HAL_ADC_LevelOutOfWindowCallback;         /* Legacy weak callback */
    hadc->ErrorCallback                 = HAL_ADC_ErrorCallback;                    /* Legacy weak callback */
    hadc->LevelOutOfWindow2Callback     = HAL_ADCEx_LevelOutOfWindow2Callback;      /* Legacy weak callback */
    hadc->LevelOutOfWindow3Callback     = HAL_ADCEx_LevelOutOfWindow3Callback;      /* Legacy weak callback */
    hadc->EndOfSamplingCallback         = HAL_ADCEx_EndOfSamplingCallback;          /* Legacy weak callback */
M
Mr.Tiger 已提交
448

449 450 451 452
    if (hadc->MspInitCallback == NULL)
    {
      hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit  */
    }
M
Mr.Tiger 已提交
453

454 455 456 457 458 459
    /* Init the low level hardware */
    hadc->MspInitCallback(hadc);
#else
    /* Init the low level hardware */
    HAL_ADC_MspInit(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
460

461 462
    /* Set ADC error code to none */
    ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
463

464 465 466
    /* Initialize Lock */
    hadc->Lock = HAL_UNLOCKED;
  }
M
Mr.Tiger 已提交
467 468

  if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
469 470 471
  {
    /* Enable ADC internal voltage regulator */
    LL_ADC_EnableInternalRegulator(hadc->Instance);
M
Mr.Tiger 已提交
472

473 474 475 476 477 478
    /* Delay for ADC stabilization time */
    /* Wait loop initialization and execution */
    /* Note: Variable divided by 2 to compensate partially              */
    /*       CPU processing cycles, scaling in us split to not          */
    /*       exceed 32 bits register capacity and handle low frequency. */
    wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US / 10UL) * (SystemCoreClock / (100000UL * 2UL)));
M
Mr.Tiger 已提交
479
    while (wait_loop_index != 0UL)
480 481 482 483
    {
      wait_loop_index--;
    }
  }
M
Mr.Tiger 已提交
484

485 486 487
  /* Verification that ADC voltage regulator is correctly enabled, whether    */
  /* or not ADC is coming from state reset (if any potential problem of       */
  /* clocking, voltage regulator would not be enabled).                       */
M
Mr.Tiger 已提交
488
  if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
489 490 491
  {
    /* Update ADC state machine to error */
    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
492

493
    /* Set ADC error code to ADC peripheral internal error */
494
    SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
495

496 497
    tmp_hal_status = HAL_ERROR;
  }
M
Mr.Tiger 已提交
498 499

  /* Configuration of ADC parameters if previous preliminary actions are      */
500 501 502 503
  /* correctly completed and if there is no conversion on going on regular    */
  /* group (ADC may already be enabled at this point if HAL_ADC_Init() is     */
  /* called to update a parameter on the fly).                                */
  tmp_adc_reg_is_conversion_on_going = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
M
Mr.Tiger 已提交
504 505 506 507

  if (((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
      && (tmp_adc_reg_is_conversion_on_going == 0UL)
     )
508 509 510 511 512
  {
    /* Set ADC state */
    ADC_STATE_CLR_SET(hadc->State,
                      HAL_ADC_STATE_REG_BUSY,
                      HAL_ADC_STATE_BUSY_INTERNAL);
M
Mr.Tiger 已提交
513

514
    /* Configuration of common ADC parameters                                 */
M
Mr.Tiger 已提交
515

516 517 518 519 520
    /* Parameters update conditioned to ADC state:                            */
    /* Parameters that can be updated only when ADC is disabled:              */
    /*  - Internal voltage regulator (no parameter in HAL ADC init structure) */
    /*  - Clock configuration                                                 */
    /*  - ADC resolution                                                      */
M
Mr.Tiger 已提交
521 522
    /*  - Oversampling                                                        */
    /*  - Trigger frequency mode                                              */
523 524 525 526 527 528 529 530 531 532 533 534
    /* Note: If low power mode AutoPowerOff is enabled, ADC enable            */
    /*       and disable phases are performed automatically by hardware       */
    /*       (in this case, flag ADC_FLAG_RDY is not set).                    */
    if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
    {
      /* Some parameters of this register are not reset, since they are set   */
      /* by other functions and must be kept in case of usage of this         */
      /* function on the fly (update of a parameter of ADC_InitTypeDef        */
      /* without needing to reconfigure all other ADC groups/channels         */
      /* parameters):                                                         */
      /*   - internal measurement paths: Vbat, temperature sensor, Vref       */
      /*     (set into HAL_ADC_ConfigChannel() )                              */
M
Mr.Tiger 已提交
535

536 537
      /* Configuration of ADC resolution                                      */
      MODIFY_REG(hadc->Instance->CFGR1,
M
Mr.Tiger 已提交
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
                 ADC_CFGR1_RES,
                 hadc->Init.Resolution);

      tmpCFGR2 |= ((hadc->Init.ClockPrescaler & ADC_CFGR2_CKMODE) |
                   hadc->Init.Oversampling.Ratio         |
                   hadc->Init.Oversampling.RightBitShift |
                   hadc->Init.Oversampling.TriggeredMode |
                   hadc->Init.TriggerFrequencyMode
                  );

      if (hadc->Init.OversamplingMode == ENABLE)
      {
        SET_BIT(tmpCFGR2, ADC_CFGR2_OVSE);
      }

      MODIFY_REG(hadc->Instance->CFGR2,
                 ADC_CFGR2_CKMODE |
                 ADC_CFGR2_LFTRIG |
                 ADC_CFGR2_OVSE   |
                 ADC_CFGR2_OVSR   |
                 ADC_CFGR2_OVSS   |
                 ADC_CFGR2_TOVS,
                 tmpCFGR2);

      /* Configuration of ADC clock mode: asynchronous clock source           */
      /* with selectable prescaler.                                           */
564 565 566 567
      if (((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV1) &&
          ((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV2) &&
          ((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV4))
      {
M
Mr.Tiger 已提交
568 569 570
        MODIFY_REG(ADC1_COMMON->CCR,
                   ADC_CCR_PRESC,
                   hadc->Init.ClockPrescaler & ADC_CCR_PRESC);
571 572
      }
    }
M
Mr.Tiger 已提交
573

574 575 576 577 578 579 580 581 582 583 584 585
    /* Configuration of ADC:                                                  */
    /*  - discontinuous mode                                                  */
    /*  - LowPowerAutoWait mode                                               */
    /*  - LowPowerAutoPowerOff mode                                           */
    /*  - continuous conversion mode                                          */
    /*  - overrun                                                             */
    /*  - external trigger to start conversion                                */
    /*  - external trigger polarity                                           */
    /*  - data alignment                                                      */
    /*  - resolution                                                          */
    /*  - scan direction                                                      */
    /*  - DMA continuous request                                              */
M
Mr.Tiger 已提交
586 587 588 589 590 591 592 593
    tmpCFGR1 |= (ADC_CFGR1_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait)      |
                 ADC_CFGR1_AUTOOFF((uint32_t)hadc->Init.LowPowerAutoPowerOff)   |
                 ADC_CFGR1_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode)  |
                 ADC_CFGR1_OVERRUN(hadc->Init.Overrun)                          |
                 hadc->Init.DataAlign                                           |
                 ADC_SCAN_SEQ_MODE(hadc->Init.ScanConvMode)                     |
                 ADC_CFGR1_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests));

594 595 596 597 598 599 600 601 602 603 604 605 606
    /* Update setting of discontinuous mode only if continuous mode is disabled */
    if (hadc->Init.DiscontinuousConvMode == ENABLE)
    {
      if (hadc->Init.ContinuousConvMode == DISABLE)
      {
        /* Enable the selected ADC group regular discontinuous mode */
        tmpCFGR1 |= ADC_CFGR1_DISCEN;
      }
      else
      {
        /* ADC regular group discontinuous was intended to be enabled,        */
        /* but ADC regular group modes continuous and sequencer discontinuous */
        /* cannot be enabled simultaneously.                                  */
M
Mr.Tiger 已提交
607

608 609
        /* Update ADC state machine to error */
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
610

611
        /* Set ADC error code to ADC peripheral internal error */
612 613 614
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
      }
    }
M
Mr.Tiger 已提交
615

616 617 618 619 620 621 622
    /* Enable external trigger if trigger selection is different of software  */
    /* start.                                                                 */
    /* Note: This configuration keeps the hardware feature of parameter       */
    /*       ExternalTrigConvEdge "trigger edge none" equivalent to           */
    /*       software start.                                                  */
    if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
    {
M
Mr.Tiger 已提交
623 624
      tmpCFGR1 |= ((hadc->Init.ExternalTrigConv & ADC_CFGR1_EXTSEL) |
                   hadc->Init.ExternalTrigConvEdge);
625
    }
M
Mr.Tiger 已提交
626

627 628 629 630 631 632 633 634 635 636 637
    /* Update ADC configuration register with previous settings */
    MODIFY_REG(hadc->Instance->CFGR1,
               ADC_CFGR1_DISCEN  |
               ADC_CFGR1_AUTOFF  |
               ADC_CFGR1_WAIT    |
               ADC_CFGR1_CONT    |
               ADC_CFGR1_OVRMOD  |
               ADC_CFGR1_EXTSEL  |
               ADC_CFGR1_EXTEN   |
               ADC_CFGR1_ALIGN   |
               ADC_CFGR1_SCANDIR |
M
Mr.Tiger 已提交
638 639 640
               ADC_CFGR1_DMACFG,
               tmpCFGR1);

641 642 643 644 645
    MODIFY_REG(hadc->Instance->CFGR2,
               ADC_CFGR2_LFTRIG |
               ADC_CFGR2_OVSE   |
               ADC_CFGR2_OVSR   |
               ADC_CFGR2_OVSS   |
M
Mr.Tiger 已提交
646 647 648
               ADC_CFGR2_TOVS,
               tmpCFGR2);

649 650 651
    /* Channel sampling time configuration */
    LL_ADC_SetSamplingTimeCommonChannels(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_1, hadc->Init.SamplingTimeCommon1);
    LL_ADC_SetSamplingTimeCommonChannels(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_2, hadc->Init.SamplingTimeCommon2);
M
Mr.Tiger 已提交
652

653 654 655 656 657 658 659 660 661 662
    /* Configuration of regular group sequencer:                              */
    /* - if scan mode is disabled, regular channels sequence length is set to */
    /*   0x00: 1 channel converted (channel on regular rank 1)                */
    /*   Parameter "NbrOfConversion" is discarded.                            */
    /*   Note: Scan mode is not present by hardware on this device, but       */
    /*   emulated by software for alignment over all STM32 devices.           */
    /* - if scan mode is enabled, regular channels sequence length is set to  */
    /*   parameter "NbrOfConversion".                                         */
    /*   Channels must be configured into each rank using function            */
    /*   "HAL_ADC_ConfigChannel()".                                           */
M
Mr.Tiger 已提交
663
    if (hadc->Init.ScanConvMode == ADC_SCAN_DISABLE)
664 665 666 667 668 669
    {
      /* Set sequencer scan length by clearing ranks above rank 1             */
      /* and do not modify rank 1 value.                                      */
      SET_BIT(hadc->Instance->CHSELR,
              ADC_CHSELR_SQ2_TO_SQ8);
    }
M
Mr.Tiger 已提交
670
    else if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
671 672 673
    {
      /* Count number of ranks available in HAL ADC handle variable */
      uint32_t ADCGroupRegularSequencerRanksCount;
M
Mr.Tiger 已提交
674

675
      /* Parse all ranks from 1 to 8 */
M
Mr.Tiger 已提交
676
      for (ADCGroupRegularSequencerRanksCount = 0UL; ADCGroupRegularSequencerRanksCount < (8UL); ADCGroupRegularSequencerRanksCount++)
677 678
      {
        /* Check each sequencer rank until value of end of sequence */
M
Mr.Tiger 已提交
679 680
        if (((hadc->ADCGroupRegularSequencerRanks >> (ADCGroupRegularSequencerRanksCount * 4UL)) & ADC_CHSELR_SQ1) ==
            ADC_CHSELR_SQ1)
681 682 683 684
        {
          break;
        }
      }
M
Mr.Tiger 已提交
685 686

      if (ADCGroupRegularSequencerRanksCount == 1UL)
687 688 689 690 691 692 693 694 695 696 697 698 699
      {
        /* Set ADC group regular sequencer:                                   */
        /* Set sequencer scan length by clearing ranks above rank 1           */
        /* and do not modify rank 1 value.                                    */
        SET_BIT(hadc->Instance->CHSELR,
                ADC_CHSELR_SQ2_TO_SQ8);
      }
      else
      {
        /* Set ADC group regular sequencer:                                   */
        /*  - Set ADC group regular sequencer to value memorized              */
        /*    in HAL ADC handle                                               */
        /*    Note: This value maybe be initialized at a unknown value,       */
M
Mr.Tiger 已提交
700
        /*          therefore after the first call of "HAL_ADC_Init()",       */
701 702 703 704 705 706 707 708 709 710
        /*          each rank corresponding to parameter "NbrOfConversion"    */
        /*          must be set using "HAL_ADC_ConfigChannel()".              */
        /*  - Set sequencer scan length by clearing ranks above maximum rank  */
        /*    and do not modify other ranks value.                            */
        MODIFY_REG(hadc->Instance->CHSELR,
                   ADC_CHSELR_SQ_ALL,
                   (ADC_CHSELR_SQ2_TO_SQ8 << (((hadc->Init.NbrOfConversion - 1UL) * ADC_REGULAR_RANK_2) & 0x1FUL)) | (hadc->ADCGroupRegularSequencerRanks)
                  );
      }
    }
M
Mr.Tiger 已提交
711

712
    /* Check back that ADC registers have effectively been configured to      */
713
    /* ensure of no potential problem of ADC core peripheral clocking.        */
714 715 716 717
    /* Check through register CFGR1 (excluding analog watchdog configuration: */
    /* set into separate dedicated function, and bits of ADC resolution set   */
    /* out of temporary variable 'tmpCFGR1').                                 */
    if ((hadc->Instance->CFGR1 & ~(ADC_CFGR1_AWD1CH | ADC_CFGR1_AWD1EN | ADC_CFGR1_AWD1SGL | ADC_CFGR1_RES))
M
Mr.Tiger 已提交
718
        == tmpCFGR1)
719 720 721
    {
      /* Set ADC error code to none */
      ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
722

723 724 725 726 727 728 729 730 731 732 733
      /* Set the ADC state */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_BUSY_INTERNAL,
                        HAL_ADC_STATE_READY);
    }
    else
    {
      /* Update ADC state machine to error */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_BUSY_INTERNAL,
                        HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
734

735
      /* Set ADC error code to ADC peripheral internal error */
736
      SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
737

738 739
      tmp_hal_status = HAL_ERROR;
    }
M
Mr.Tiger 已提交
740

741 742 743 744 745
  }
  else
  {
    /* Update ADC state machine to error */
    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
746

747 748
    tmp_hal_status = HAL_ERROR;
  }
M
Mr.Tiger 已提交
749

750 751 752 753 754 755 756
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Deinitialize the ADC peripheral registers to their default reset
  *         values, with deinitialization of the ADC MSP.
M
Mr.Tiger 已提交
757
  * @note   For devices with several ADCs: reset of ADC common registers is done
758 759 760 761
  *         only if all ADCs sharing the same common group are disabled.
  *         (function "HAL_ADC_MspDeInit()" is also called under the same conditions:
  *         all ADC instances use the same core clock at RCC level, disabling
  *         the core clock reset all ADC instances).
M
Mr.Tiger 已提交
762
  *         If this is not the case, reset of these common parameters reset is
763
  *         bypassed without error reporting: it can be the intended behavior in
M
Mr.Tiger 已提交
764
  *         case of reset of a single ADC while the other ADCs sharing the same
765 766
  *         common group is still running.
  * @note   By default, HAL_ADC_DeInit() set ADC in mode deep power-down:
M
Mr.Tiger 已提交
767
  *         this saves more power by reducing leakage currents
768 769 770 771
  *         and is particularly interesting before entering MCU low-power modes.
  * @param hadc ADC handle
  * @retval HAL status
  */
M
Mr.Tiger 已提交
772
HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc)
773 774
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
775

776
  /* Check ADC handle */
M
Mr.Tiger 已提交
777
  if (hadc == NULL)
778 779 780
  {
    return HAL_ERROR;
  }
M
Mr.Tiger 已提交
781

782 783
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
784

785 786
  /* Set ADC state */
  SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
M
Mr.Tiger 已提交
787

788 789
  /* Stop potential conversion on going, on regular group */
  tmp_hal_status = ADC_ConversionStop(hadc);
M
Mr.Tiger 已提交
790

791 792 793 794 795
  /* Disable ADC peripheral if conversions are effectively stopped */
  if (tmp_hal_status == HAL_OK)
  {
    /* Disable the ADC peripheral */
    tmp_hal_status = ADC_Disable(hadc);
M
Mr.Tiger 已提交
796

797 798 799 800 801 802
    /* Check if ADC is effectively disabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Change ADC state */
      hadc->State = HAL_ADC_STATE_READY;
    }
M
Mr.Tiger 已提交
803 804 805

    /* Disable ADC internal voltage regulator */
    LL_ADC_DisableInternalRegulator(hadc->Instance);
806
  }
M
Mr.Tiger 已提交
807

808 809 810 811 812
  /* Note: HAL ADC deInit is done independently of ADC conversion stop        */
  /*       and disable return status. In case of status fail, attempt to      */
  /*       perform deinitialization anyway and it is up user code in          */
  /*       in HAL_ADC_MspDeInit() to reset the ADC peripheral using           */
  /*       system RCC hard reset.                                             */
M
Mr.Tiger 已提交
813

814 815 816 817 818
  /* ========== Reset ADC registers ========== */
  /* Reset register IER */
  __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD3  | ADC_IT_AWD2 |
                              ADC_IT_AWD1  | ADC_IT_OVR  |
                              ADC_IT_EOS   | ADC_IT_EOC  |
M
Mr.Tiger 已提交
819 820
                              ADC_IT_EOSMP | ADC_IT_RDY));

821 822 823 824
  /* Reset register ISR */
  __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD3  | ADC_FLAG_AWD2 |
                              ADC_FLAG_AWD1  | ADC_FLAG_OVR  |
                              ADC_FLAG_EOS   | ADC_FLAG_EOC  |
M
Mr.Tiger 已提交
825 826
                              ADC_FLAG_EOSMP | ADC_FLAG_RDY));

827 828 829
  /* Reset register CR */
  /* Bits ADC_CR_ADCAL, ADC_CR_ADSTP, ADC_CR_ADSTART are in access mode     */
  /* "read-set": no direct reset applicable.                                */
M
Mr.Tiger 已提交
830

831 832
  /* Reset register CFGR1 */
  hadc->Instance->CFGR1 &= ~(ADC_CFGR1_AWD1CH   | ADC_CFGR1_AWD1EN  | ADC_CFGR1_AWD1SGL | ADC_CFGR1_DISCEN |
M
Mr.Tiger 已提交
833
                             ADC_CFGR1_AUTOFF  | ADC_CFGR1_WAIT   | ADC_CFGR1_CONT   | ADC_CFGR1_OVRMOD |
834
                             ADC_CFGR1_EXTEN   | ADC_CFGR1_EXTSEL | ADC_CFGR1_ALIGN  | ADC_CFGR1_RES    |
M
Mr.Tiger 已提交
835 836
                             ADC_CFGR1_SCANDIR | ADC_CFGR1_DMACFG | ADC_CFGR1_DMAEN);

837 838 839 840
  /* Reset register CFGR2 */
  /* Note: Update of ADC clock mode is conditioned to ADC state disabled:   */
  /*       already done above.                                              */
  hadc->Instance->CFGR2 &= ~ADC_CFGR2_CKMODE;
M
Mr.Tiger 已提交
841

842 843
  /* Reset register SMPR */
  hadc->Instance->SMPR &= ~ADC_SMPR_SMP1;
M
Mr.Tiger 已提交
844

845 846
  /* Reset register TR1 */
  hadc->Instance->TR1 &= ~(ADC_TR1_HT1 | ADC_TR1_LT1);
M
Mr.Tiger 已提交
847

848 849
  /* Reset register CHSELR */
  hadc->Instance->CHSELR &= ~(ADC_CHSELR_SQ_ALL);
M
Mr.Tiger 已提交
850

851 852
  /* Reset register DR */
  /* bits in access mode read only, no direct reset applicable */
M
Mr.Tiger 已提交
853

854 855
  /* Reset register CCR */
  ADC1_COMMON->CCR &= ~(ADC_CCR_VBATEN | ADC_CCR_TSEN | ADC_CCR_VREFEN | ADC_CCR_PRESC);
M
Mr.Tiger 已提交
856

857 858 859 860
  /* ========== Hard reset ADC peripheral ========== */
  /* Performs a global reset of the entire ADC peripheral: ADC state is     */
  /* forced to a similar state after device power-on.                       */
  /* If needed, copy-paste and uncomment the following reset code into      */
M
Mr.Tiger 已提交
861
  /* function "void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)":            */
862 863 864
  /*                                                                        */
  /*  __HAL_RCC_ADC1_FORCE_RESET()                                          */
  /*  __HAL_RCC_ADC1_RELEASE_RESET()                                        */
M
Mr.Tiger 已提交
865

866 867 868 869 870
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  if (hadc->MspDeInitCallback == NULL)
  {
    hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit  */
  }
M
Mr.Tiger 已提交
871

872 873 874 875 876 877
  /* DeInit the low level hardware */
  hadc->MspDeInitCallback(hadc);
#else
  /* DeInit the low level hardware */
  HAL_ADC_MspDeInit(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
878

879 880
  /* Reset HAL ADC handle variable */
  hadc->ADCGroupRegularSequencerRanks = 0x00000000UL;
M
Mr.Tiger 已提交
881

882 883
  /* Set ADC error code to none */
  ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
884

885 886
  /* Set ADC state */
  hadc->State = HAL_ADC_STATE_RESET;
M
Mr.Tiger 已提交
887

888 889
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
890

891 892 893 894 895 896 897 898 899
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Initialize the ADC MSP.
  * @param hadc ADC handle
  * @retval None
  */
M
Mr.Tiger 已提交
900
__weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
901 902 903 904 905 906
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_MspInit must be implemented in the user file.
M
Mr.Tiger 已提交
907
   */
908 909 910 911 912 913 914 915 916
}

/**
  * @brief  DeInitialize the ADC MSP.
  * @param hadc ADC handle
  * @note   All ADC instances use the same core clock at RCC level, disabling
  *         the core clock reset all ADC instances).
  * @retval None
  */
M
Mr.Tiger 已提交
917
__weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
918 919 920 921 922 923
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_MspDeInit must be implemented in the user file.
M
Mr.Tiger 已提交
924
   */
925 926 927 928 929 930 931 932 933 934 935
}

#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
/**
  * @brief  Register a User ADC Callback
  *         To be used instead of the weak predefined callback
  * @param  hadc Pointer to a ADC_HandleTypeDef structure that contains
  *                the configuration information for the specified ADC.
  * @param  CallbackID ID of the callback to be registered
  *         This parameter can be one of the following values:
  *          @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID      ADC conversion complete callback ID
936
  *          @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID          ADC conversion DMA half-transfer callback ID
937 938 939 940 941 942 943 944 945 946 947 948
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID    ADC analog watchdog 1 callback ID
  *          @arg @ref HAL_ADC_ERROR_CB_ID                    ADC error callback ID
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID    ADC analog watchdog 2 callback ID
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID    ADC analog watchdog 3 callback ID
  *          @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID          ADC end of sampling callback ID
  *          @arg @ref HAL_ADC_MSPINIT_CB_ID                  ADC Msp Init callback ID
  *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID                ADC Msp DeInit callback ID
  *          @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
  *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
  * @param  pCallback pointer to the Callback function
  * @retval HAL status
  */
M
Mr.Tiger 已提交
949 950
HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID,
                                           pADC_CallbackTypeDef pCallback)
951 952
{
  HAL_StatusTypeDef status = HAL_OK;
M
Mr.Tiger 已提交
953

954 955 956 957 958 959 960
  if (pCallback == NULL)
  {
    /* Update the error code */
    hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;

    return HAL_ERROR;
  }
M
Mr.Tiger 已提交
961

962
  if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
963 964 965 966 967 968
  {
    switch (CallbackID)
    {
      case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
        hadc->ConvCpltCallback = pCallback;
        break;
M
Mr.Tiger 已提交
969

970 971 972
      case HAL_ADC_CONVERSION_HALF_CB_ID :
        hadc->ConvHalfCpltCallback = pCallback;
        break;
M
Mr.Tiger 已提交
973

974 975 976
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
        hadc->LevelOutOfWindowCallback = pCallback;
        break;
M
Mr.Tiger 已提交
977

978 979 980
      case HAL_ADC_ERROR_CB_ID :
        hadc->ErrorCallback = pCallback;
        break;
M
Mr.Tiger 已提交
981

982 983 984
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
        hadc->LevelOutOfWindow2Callback = pCallback;
        break;
M
Mr.Tiger 已提交
985

986 987 988
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
        hadc->LevelOutOfWindow3Callback = pCallback;
        break;
M
Mr.Tiger 已提交
989

990 991 992
      case HAL_ADC_END_OF_SAMPLING_CB_ID :
        hadc->EndOfSamplingCallback = pCallback;
        break;
M
Mr.Tiger 已提交
993

994 995 996
      case HAL_ADC_MSPINIT_CB_ID :
        hadc->MspInitCallback = pCallback;
        break;
M
Mr.Tiger 已提交
997

998 999 1000
      case HAL_ADC_MSPDEINIT_CB_ID :
        hadc->MspDeInitCallback = pCallback;
        break;
M
Mr.Tiger 已提交
1001

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
      default :
        /* Update the error code */
        hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;

        /* Return error status */
        status = HAL_ERROR;
        break;
    }
  }
  else if (HAL_ADC_STATE_RESET == hadc->State)
  {
    switch (CallbackID)
    {
      case HAL_ADC_MSPINIT_CB_ID :
        hadc->MspInitCallback = pCallback;
        break;
M
Mr.Tiger 已提交
1018

1019 1020 1021
      case HAL_ADC_MSPDEINIT_CB_ID :
        hadc->MspDeInitCallback = pCallback;
        break;
M
Mr.Tiger 已提交
1022

1023 1024 1025
      default :
        /* Update the error code */
        hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
M
Mr.Tiger 已提交
1026

1027 1028 1029 1030 1031 1032 1033 1034 1035
        /* Return error status */
        status = HAL_ERROR;
        break;
    }
  }
  else
  {
    /* Update the error code */
    hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
M
Mr.Tiger 已提交
1036

1037 1038 1039
    /* Return error status */
    status =  HAL_ERROR;
  }
M
Mr.Tiger 已提交
1040

1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
  return status;
}

/**
  * @brief  Unregister a ADC Callback
  *         ADC callback is redirected to the weak predefined callback
  * @param  hadc Pointer to a ADC_HandleTypeDef structure that contains
  *                the configuration information for the specified ADC.
  * @param  CallbackID ID of the callback to be unregistered
  *         This parameter can be one of the following values:
  *          @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID      ADC conversion complete callback ID
1052
  *          @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID          ADC conversion DMA half-transfer callback ID
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID    ADC analog watchdog 1 callback ID
  *          @arg @ref HAL_ADC_ERROR_CB_ID                    ADC error callback ID
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID    ADC analog watchdog 2 callback ID
  *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID    ADC analog watchdog 3 callback ID
  *          @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID          ADC end of sampling callback ID
  *          @arg @ref HAL_ADC_MSPINIT_CB_ID                  ADC Msp Init callback ID
  *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID                ADC Msp DeInit callback ID
  *          @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
  *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID)
{
  HAL_StatusTypeDef status = HAL_OK;
M
Mr.Tiger 已提交
1067

1068 1069 1070 1071 1072 1073 1074
  if ((hadc->State & HAL_ADC_STATE_READY) != 0)
  {
    switch (CallbackID)
    {
      case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
        hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback;
        break;
M
Mr.Tiger 已提交
1075

1076 1077 1078
      case HAL_ADC_CONVERSION_HALF_CB_ID :
        hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback;
        break;
M
Mr.Tiger 已提交
1079

1080 1081 1082
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
        hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback;
        break;
M
Mr.Tiger 已提交
1083

1084 1085 1086
      case HAL_ADC_ERROR_CB_ID :
        hadc->ErrorCallback = HAL_ADC_ErrorCallback;
        break;
M
Mr.Tiger 已提交
1087

1088 1089 1090
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
        hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback;
        break;
M
Mr.Tiger 已提交
1091

1092 1093 1094
      case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
        hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback;
        break;
M
Mr.Tiger 已提交
1095

1096 1097 1098
      case HAL_ADC_END_OF_SAMPLING_CB_ID :
        hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback;
        break;
M
Mr.Tiger 已提交
1099

1100 1101 1102
      case HAL_ADC_MSPINIT_CB_ID :
        hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit              */
        break;
M
Mr.Tiger 已提交
1103

1104 1105 1106
      case HAL_ADC_MSPDEINIT_CB_ID :
        hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit            */
        break;
M
Mr.Tiger 已提交
1107

1108 1109 1110
      default :
        /* Update the error code */
        hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
M
Mr.Tiger 已提交
1111

1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
        /* Return error status */
        status =  HAL_ERROR;
        break;
    }
  }
  else if (HAL_ADC_STATE_RESET == hadc->State)
  {
    switch (CallbackID)
    {
      case HAL_ADC_MSPINIT_CB_ID :
        hadc->MspInitCallback = HAL_ADC_MspInit;                   /* Legacy weak MspInit              */
        break;
M
Mr.Tiger 已提交
1124

1125 1126 1127
      case HAL_ADC_MSPDEINIT_CB_ID :
        hadc->MspDeInitCallback = HAL_ADC_MspDeInit;               /* Legacy weak MspDeInit            */
        break;
M
Mr.Tiger 已提交
1128

1129 1130 1131
      default :
        /* Update the error code */
        hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
M
Mr.Tiger 已提交
1132

1133 1134 1135 1136 1137 1138 1139 1140 1141
        /* Return error status */
        status =  HAL_ERROR;
        break;
    }
  }
  else
  {
    /* Update the error code */
    hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
M
Mr.Tiger 已提交
1142

1143 1144 1145
    /* Return error status */
    status =  HAL_ERROR;
  }
M
Mr.Tiger 已提交
1146

1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
  return status;
}

#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */

/**
  * @}
  */

/** @defgroup ADC_Exported_Functions_Group2 ADC Input and Output operation functions
M
Mr.Tiger 已提交
1157 1158 1159
  *  @brief    ADC IO operation functions
  *
@verbatim
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    [..]  This section provides functions allowing to:
      (+) Start conversion of regular group.
      (+) Stop conversion of regular group.
      (+) Poll for conversion complete on regular group.
      (+) Poll for conversion event.
      (+) Get result of regular channel conversion.
      (+) Start conversion of regular group and enable interruptions.
      (+) Stop conversion of regular group and disable interruptions.
      (+) Handle ADC interrupt request
      (+) Start conversion of regular group and enable DMA transfer.
      (+) Stop conversion of regular group and disable ADC DMA transfer.
@endverbatim
  * @{
  */

/**
  * @brief  Enable ADC, start conversion of regular group.
  * @note   Interruptions enabled in this function: None.
  * @param hadc ADC handle
  * @retval HAL status
  */
M
Mr.Tiger 已提交
1184
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
1185 1186
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1187

1188 1189
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1190

1191 1192 1193 1194 1195
  /* Perform ADC enable and conversion start if no conversion is on going */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  {
    /* Process locked */
    __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1196

1197 1198
    /* Enable the ADC peripheral */
    tmp_hal_status = ADC_Enable(hadc);
M
Mr.Tiger 已提交
1199

1200 1201 1202 1203 1204 1205 1206 1207 1208
    /* Start conversion if ADC is effectively enabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state                                                        */
      /* - Clear state bitfield related to regular group conversion results   */
      /* - Set state bitfield related to regular operation                    */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
                        HAL_ADC_STATE_REG_BUSY);
M
Mr.Tiger 已提交
1209

1210 1211 1212
      /* Set ADC error code */
      /* Reset all ADC error code fields */
      ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
1213

1214 1215 1216
      /* Clear ADC group regular conversion flag and overrun flag               */
      /* (To ensure of no unknown state from potential previous ADC operations) */
      __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
M
Mr.Tiger 已提交
1217

1218 1219 1220 1221
      /* Process unlocked */
      /* Unlock before starting ADC conversions: in case of potential         */
      /* interruption, to let the process to ADC IRQ Handler.                 */
      __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1222

1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
      /* Enable conversion of regular group.                                  */
      /* If software start has been selected, conversion starts immediately.  */
      /* If external trigger has been selected, conversion will start at next */
      /* trigger event.                                                       */
      /* Start ADC group regular conversion */
      LL_ADC_REG_StartConversion(hadc->Instance);
    }
    else
    {
      /* Process unlocked */
      __HAL_UNLOCK(hadc);
    }
  }
  else
  {
    tmp_hal_status = HAL_BUSY;
  }
M
Mr.Tiger 已提交
1240

1241 1242 1243 1244 1245
  /* Return function status */
  return tmp_hal_status;
}

/**
M
Mr.Tiger 已提交
1246
  * @brief  Stop ADC conversion of regular group (and injected channels in
1247
  *         case of auto_injection mode), disable ADC peripheral.
M
Mr.Tiger 已提交
1248
  * @note:  ADC peripheral disable is forcing stop of potential
1249 1250 1251 1252 1253
  *         conversion on injected group. If injected group is under use, it
  *         should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
  * @param hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
1254
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
1255 1256
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1257

1258 1259
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1260

1261 1262
  /* Process locked */
  __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1263

1264 1265
  /* 1. Stop potential conversion on going, on ADC group regular */
  tmp_hal_status = ADC_ConversionStop(hadc);
M
Mr.Tiger 已提交
1266

1267 1268 1269 1270 1271
  /* Disable ADC peripheral if conversions are effectively stopped */
  if (tmp_hal_status == HAL_OK)
  {
    /* 2. Disable the ADC peripheral */
    tmp_hal_status = ADC_Disable(hadc);
M
Mr.Tiger 已提交
1272

1273 1274 1275 1276 1277 1278 1279 1280 1281
    /* Check if ADC is effectively disabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_REG_BUSY,
                        HAL_ADC_STATE_READY);
    }
  }
M
Mr.Tiger 已提交
1282

1283 1284
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1285

1286 1287 1288 1289 1290 1291 1292 1293
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Wait for regular group conversion to be completed.
  * @note   ADC conversion flags EOS (end of sequence) and EOC (end of
  *         conversion) are cleared by this function, with an exception:
M
Mr.Tiger 已提交
1294
  *         if low power feature "LowPowerAutoWait" is enabled, flags are
1295 1296
  *         not cleared to not interfere with this feature until data register
  *         is read using function HAL_ADC_GetValue().
M
Mr.Tiger 已提交
1297
  * @note   This function cannot be used in a particular setup: ADC configured
1298 1299 1300
  *         in DMA mode and polling for end of each conversion (ADC init
  *         parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
  *         In this case, DMA resets the flag EOC and polling cannot be
M
Mr.Tiger 已提交
1301
  *         performed on each conversion. Nevertheless, polling can still
1302 1303 1304 1305 1306 1307
  *         be performed on the complete sequence (ADC init
  *         parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
  * @param hadc ADC handle
  * @param Timeout Timeout value in millisecond.
  * @retval HAL status
  */
M
Mr.Tiger 已提交
1308
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
1309 1310 1311
{
  uint32_t tickstart;
  uint32_t tmp_Flag_End;
M
Mr.Tiger 已提交
1312

1313 1314
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1315

1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
  /* If end of conversion selected to end of sequence conversions */
  if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
  {
    tmp_Flag_End = ADC_FLAG_EOS;
  }
  /* If end of conversion selected to end of unitary conversion */
  else /* ADC_EOC_SINGLE_CONV */
  {
    /* Verification that ADC configuration is compliant with polling for      */
    /* each conversion:                                                       */
    /* Particular case is ADC configured in DMA mode and ADC sequencer with   */
    /* several ranks and polling for end of each conversion.                  */
    /* For code simplicity sake, this particular case is generalized to       */
    /* ADC configured in DMA mode and and polling for end of each conversion. */
    if ((hadc->Instance->CFGR1 & ADC_CFGR1_DMAEN) != 0UL)
    {
      /* Update ADC state machine to error */
      SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
1334

1335 1336 1337 1338 1339 1340 1341
      return HAL_ERROR;
    }
    else
    {
      tmp_Flag_End = (ADC_FLAG_EOC);
    }
  }
M
Mr.Tiger 已提交
1342

1343 1344
  /* Get tick count */
  tickstart = HAL_GetTick();
M
Mr.Tiger 已提交
1345

1346
  /* Wait until End of unitary conversion or sequence conversions flag is raised */
M
Mr.Tiger 已提交
1347
  while ((hadc->Instance->ISR & tmp_Flag_End) == 0UL)
1348 1349
  {
    /* Check if timeout is disabled (set to infinite wait) */
M
Mr.Tiger 已提交
1350
    if (Timeout != HAL_MAX_DELAY)
1351
    {
M
Mr.Tiger 已提交
1352
      if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1353 1354 1355
      {
        /* Update ADC state machine to timeout */
        SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
M
Mr.Tiger 已提交
1356

1357 1358
        /* Process unlocked */
        __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1359

1360 1361 1362 1363
        return HAL_TIMEOUT;
      }
    }
  }
M
Mr.Tiger 已提交
1364

1365 1366
  /* Update ADC state machine */
  SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
M
Mr.Tiger 已提交
1367

1368 1369
  /* Determine whether any further conversion upcoming on group regular       */
  /* by external trigger, continuous mode or scan sequence on going.          */
M
Mr.Tiger 已提交
1370 1371 1372
  if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
      && (hadc->Init.ContinuousConvMode == DISABLE)
     )
1373 1374
  {
    /* Check whether end of sequence is reached */
M
Mr.Tiger 已提交
1375
    if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385
    {
      /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit             */
      /* ADSTART==0 (no conversion on going)                                  */
      if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
      {
        /* Disable ADC end of single conversion interrupt on group regular */
        /* Note: Overrun interrupt was enabled with EOC interrupt in          */
        /* HAL_Start_IT(), but is not disabled here because can be used       */
        /* by overrun IRQ process below.                                      */
        __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
M
Mr.Tiger 已提交
1386

1387 1388 1389 1390 1391 1392 1393 1394 1395
        /* Set ADC state */
        ADC_STATE_CLR_SET(hadc->State,
                          HAL_ADC_STATE_REG_BUSY,
                          HAL_ADC_STATE_READY);
      }
      else
      {
        /* Change ADC state to error state */
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
1396

1397
        /* Set ADC error code to ADC peripheral internal error */
1398 1399 1400 1401
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
      }
    }
  }
M
Mr.Tiger 已提交
1402

1403 1404 1405 1406 1407 1408 1409 1410
  /* Clear end of conversion flag of regular group if low power feature       */
  /* "LowPowerAutoWait " is disabled, to not interfere with this feature      */
  /* until data register is read using function HAL_ADC_GetValue().           */
  if (hadc->Init.LowPowerAutoWait == DISABLE)
  {
    /* Clear regular group conversion flag */
    __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
  }
M
Mr.Tiger 已提交
1411

1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427
  /* Return function status */
  return HAL_OK;
}

/**
  * @brief  Poll for ADC event.
  * @param hadc ADC handle
  * @param EventType the ADC event type.
  *          This parameter can be one of the following values:
  *            @arg @ref ADC_EOSMP_EVENT  ADC End of Sampling event
  *            @arg @ref ADC_AWD1_EVENT   ADC Analog watchdog 1 event (main analog watchdog, present on all STM32 devices)
  *            @arg @ref ADC_AWD2_EVENT   ADC Analog watchdog 2 event (additional analog watchdog, not present on all STM32 families)
  *            @arg @ref ADC_AWD3_EVENT   ADC Analog watchdog 3 event (additional analog watchdog, not present on all STM32 families)
  *            @arg @ref ADC_OVR_EVENT    ADC Overrun event
  * @param Timeout Timeout value in millisecond.
  * @note   The relevant flag is cleared if found to be set, except for ADC_FLAG_OVR.
M
Mr.Tiger 已提交
1428 1429
  *         Indeed, the latter is reset only if hadc->Init.Overrun field is set
  *         to ADC_OVR_DATA_OVERWRITTEN. Otherwise, data register may be potentially overwritten
1430 1431
  *         by a new converted data as soon as OVR is cleared.
  *         To reset OVR flag once the preserved data is retrieved, the user can resort
M
Mr.Tiger 已提交
1432
  *         to macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1433 1434
  * @retval HAL status
  */
M
Mr.Tiger 已提交
1435
HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout)
1436
{
M
Mr.Tiger 已提交
1437 1438
  uint32_t tickstart;

1439 1440 1441
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_EVENT_TYPE(EventType));
M
Mr.Tiger 已提交
1442

1443 1444
  /* Get tick count */
  tickstart = HAL_GetTick();
M
Mr.Tiger 已提交
1445

1446
  /* Check selected event flag */
M
Mr.Tiger 已提交
1447
  while (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
1448 1449
  {
    /* Check if timeout is disabled (set to infinite wait) */
M
Mr.Tiger 已提交
1450
    if (Timeout != HAL_MAX_DELAY)
1451
    {
M
Mr.Tiger 已提交
1452
      if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1453 1454 1455
      {
        /* Update ADC state machine to timeout */
        SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
M
Mr.Tiger 已提交
1456

1457 1458
        /* Process unlocked */
        __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1459

1460 1461 1462 1463
        return HAL_TIMEOUT;
      }
    }
  }
M
Mr.Tiger 已提交
1464 1465

  switch (EventType)
1466
  {
M
Mr.Tiger 已提交
1467 1468
    /* End Of Sampling event */
    case ADC_EOSMP_EVENT:
1469
      /* Set ADC state */
M
Mr.Tiger 已提交
1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537
      SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);

      /* Clear the End Of Sampling flag */
      __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);

      break;

    /* Analog watchdog (level out of window) event */
    /* Note: In case of several analog watchdog enabled, if needed to know      */
    /* which one triggered and on which ADCx, test ADC state of analog watchdog */
    /* flags HAL_ADC_STATE_AWD1/2/3 using function "HAL_ADC_GetState()".        */
    /* For example:                                                             */
    /*  " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) "          */
    /*  " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD2) != 0UL) "          */
    /*  " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD3) != 0UL) "          */

    /* Check analog watchdog 1 flag */
    case ADC_AWD_EVENT:
      /* Set ADC state */
      SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);

      /* Clear ADC analog watchdog flag */
      __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);

      break;

    /* Check analog watchdog 2 flag */
    case ADC_AWD2_EVENT:
      /* Set ADC state */
      SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);

      /* Clear ADC analog watchdog flag */
      __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);

      break;

    /* Check analog watchdog 3 flag */
    case ADC_AWD3_EVENT:
      /* Set ADC state */
      SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);

      /* Clear ADC analog watchdog flag */
      __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);

      break;

    /* Overrun event */
    default: /* Case ADC_OVR_EVENT */
      /* If overrun is set to overwrite previous data, overrun event is not     */
      /* considered as an error.                                                */
      /* (cf ref manual "Managing conversions without using the DMA and without */
      /* overrun ")                                                             */
      if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
      {
        /* Set ADC state */
        SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);

        /* Set ADC error code to overrun */
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
      }
      else
      {
        /* Clear ADC Overrun flag only if Overrun is set to ADC_OVR_DATA_OVERWRITTEN
           otherwise, data register is potentially overwritten by new converted data as soon
           as OVR is cleared. */
        __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
      }
      break;
1538
  }
M
Mr.Tiger 已提交
1539

1540 1541 1542 1543 1544 1545 1546
  /* Return function status */
  return HAL_OK;
}

/**
  * @brief  Enable ADC, start conversion of regular group with interruption.
  * @note   Interruptions enabled in this function according to initialization
M
Mr.Tiger 已提交
1547
  *         setting : EOC (end of conversion), EOS (end of sequence),
1548 1549 1550
  *         OVR overrun.
  *         Each of these interruptions has its dedicated callback function.
  * @note   To guarantee a proper reset of all interruptions once all the needed
M
Mr.Tiger 已提交
1551
  *         conversions are obtained, HAL_ADC_Stop_IT() must be called to ensure
1552
  *         a correct stop of the IT-based conversions.
M
Mr.Tiger 已提交
1553
  * @note   By default, HAL_ADC_Start_IT() does not enable the End Of Sampling
1554 1555
  *         interruption. If required (e.g. in case of oversampling with trigger
  *         mode), the user must:
M
Mr.Tiger 已提交
1556 1557
  *          1. first clear the EOSMP flag if set with macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP)
  *          2. then enable the EOSMP interrupt with macro __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOSMP)
1558 1559 1560 1561
  *          before calling HAL_ADC_Start_IT().
  * @param hadc ADC handle
  * @retval HAL status
  */
M
Mr.Tiger 已提交
1562
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
1563 1564
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1565

1566 1567
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1568

1569 1570 1571 1572 1573
  /* Perform ADC enable and conversion start if no conversion is on going */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  {
    /* Process locked */
    __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1574

1575 1576
    /* Enable the ADC peripheral */
    tmp_hal_status = ADC_Enable(hadc);
M
Mr.Tiger 已提交
1577

1578 1579 1580 1581 1582 1583 1584 1585 1586
    /* Start conversion if ADC is effectively enabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state                                                        */
      /* - Clear state bitfield related to regular group conversion results   */
      /* - Set state bitfield related to regular operation                    */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
                        HAL_ADC_STATE_REG_BUSY);
M
Mr.Tiger 已提交
1587 1588


1589 1590 1591
      /* Set ADC error code */
      /* Reset all ADC error code fields */
      ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
1592

1593 1594 1595
      /* Clear ADC group regular conversion flag and overrun flag               */
      /* (To ensure of no unknown state from potential previous ADC operations) */
      __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
M
Mr.Tiger 已提交
1596

1597 1598 1599 1600
      /* Process unlocked */
      /* Unlock before starting ADC conversions: in case of potential         */
      /* interruption, to let the process to ADC IRQ Handler.                 */
      __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1601

1602 1603
      /* Disable all interruptions before enabling the desired ones */
      __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
M
Mr.Tiger 已提交
1604

1605
      /* Enable ADC end of conversion interrupt */
M
Mr.Tiger 已提交
1606
      switch (hadc->Init.EOCSelection)
1607 1608 1609 1610 1611 1612 1613 1614 1615
      {
        case ADC_EOC_SEQ_CONV:
          __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOS);
          break;
        /* case ADC_EOC_SINGLE_CONV */
        default:
          __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOC);
          break;
      }
M
Mr.Tiger 已提交
1616

1617 1618 1619 1620 1621 1622
      /* Enable ADC overrun interrupt */
      /* If hadc->Init.Overrun is set to ADC_OVR_DATA_PRESERVED, only then is
         ADC_IT_OVR enabled; otherwise data overwrite is considered as normal
         behavior and no CPU time is lost for a non-processed interruption */
      if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
      {
M
Mr.Tiger 已提交
1623
        __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
1624
      }
M
Mr.Tiger 已提交
1625

1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637
      /* Enable conversion of regular group.                                  */
      /* If software start has been selected, conversion starts immediately.  */
      /* If external trigger has been selected, conversion will start at next */
      /* trigger event.                                                       */
      /* Start ADC group regular conversion */
      LL_ADC_REG_StartConversion(hadc->Instance);
    }
    else
    {
      /* Process unlocked */
      __HAL_UNLOCK(hadc);
    }
M
Mr.Tiger 已提交
1638

1639 1640 1641 1642 1643
  }
  else
  {
    tmp_hal_status = HAL_BUSY;
  }
M
Mr.Tiger 已提交
1644

1645 1646 1647 1648 1649
  /* Return function status */
  return tmp_hal_status;
}

/**
M
Mr.Tiger 已提交
1650 1651
  * @brief  Stop ADC conversion of regular group (and injected group in
  *         case of auto_injection mode), disable interrution of
1652 1653 1654 1655
  *         end-of-conversion, disable ADC peripheral.
  * @param hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
1656
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
1657 1658
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1659

1660 1661
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1662

1663 1664
  /* Process locked */
  __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1665

1666 1667
  /* 1. Stop potential conversion on going, on ADC group regular */
  tmp_hal_status = ADC_ConversionStop(hadc);
M
Mr.Tiger 已提交
1668

1669 1670 1671 1672 1673 1674
  /* Disable ADC peripheral if conversions are effectively stopped */
  if (tmp_hal_status == HAL_OK)
  {
    /* Disable ADC end of conversion interrupt for regular group */
    /* Disable ADC overrun interrupt */
    __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
M
Mr.Tiger 已提交
1675

1676 1677
    /* 2. Disable the ADC peripheral */
    tmp_hal_status = ADC_Disable(hadc);
M
Mr.Tiger 已提交
1678

1679 1680 1681 1682 1683 1684 1685 1686 1687
    /* Check if ADC is effectively disabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_REG_BUSY,
                        HAL_ADC_STATE_READY);
    }
  }
M
Mr.Tiger 已提交
1688

1689 1690
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1691

1692 1693 1694 1695 1696 1697 1698
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Enable ADC, start conversion of regular group and transfer result through DMA.
  * @note   Interruptions enabled in this function:
M
Mr.Tiger 已提交
1699
  *         overrun (if applicable), DMA half transfer, DMA transfer complete.
1700 1701 1702 1703 1704 1705
  *         Each of these interruptions has its dedicated callback function.
  * @param hadc ADC handle
  * @param pData Destination Buffer address.
  * @param Length Number of data to be transferred from ADC peripheral to memory
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
1706
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
1707 1708
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1709

1710 1711
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1712

1713 1714 1715 1716 1717
  /* Perform ADC enable and conversion start if no conversion is on going */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  {
    /* Process locked */
    __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1718

1719 1720 1721 1722 1723 1724 1725 1726 1727 1728
    /* Specific case for first call occurrence of this function (DMA transfer */
    /* not activated and ADC disabled), DMA transfer must be activated        */
    /* with ADC disabled.                                                     */
    if ((hadc->Instance->CFGR1 & ADC_CFGR1_DMAEN) == 0UL)
    {
      if (LL_ADC_IsEnabled(hadc->Instance) != 0UL)
      {
        /* Disable ADC */
        LL_ADC_Disable(hadc->Instance);
      }
M
Mr.Tiger 已提交
1729

1730 1731 1732
      /* Enable ADC DMA mode */
      hadc->Instance->CFGR1 |= ADC_CFGR1_DMAEN;
    }
M
Mr.Tiger 已提交
1733

1734 1735
    /* Enable the ADC peripheral */
    tmp_hal_status = ADC_Enable(hadc);
M
Mr.Tiger 已提交
1736

1737 1738 1739 1740 1741 1742 1743 1744 1745
    /* Start conversion if ADC is effectively enabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state                                                        */
      /* - Clear state bitfield related to regular group conversion results   */
      /* - Set state bitfield related to regular operation                    */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
                        HAL_ADC_STATE_REG_BUSY);
M
Mr.Tiger 已提交
1746

1747 1748 1749
      /* Set ADC error code */
      /* Reset all ADC error code fields */
      ADC_CLEAR_ERRORCODE(hadc);
M
Mr.Tiger 已提交
1750

1751 1752
      /* Set the DMA transfer complete callback */
      hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
M
Mr.Tiger 已提交
1753

1754 1755
      /* Set the DMA half transfer complete callback */
      hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
M
Mr.Tiger 已提交
1756

1757 1758
      /* Set the DMA error callback */
      hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
M
Mr.Tiger 已提交
1759 1760


1761 1762
      /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC   */
      /* start (in case of SW start):                                         */
M
Mr.Tiger 已提交
1763

1764 1765 1766 1767
      /* Clear regular group conversion flag and overrun flag */
      /* (To ensure of no unknown state from potential previous ADC           */
      /* operations)                                                          */
      __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
M
Mr.Tiger 已提交
1768

1769 1770 1771 1772
      /* Process unlocked */
      /* Unlock before starting ADC conversions: in case of potential         */
      /* interruption, to let the process to ADC IRQ Handler.                 */
      __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1773

1774 1775
      /* Enable ADC overrun interrupt */
      __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
M
Mr.Tiger 已提交
1776

1777 1778
      /* Start the DMA channel */
      tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
M
Mr.Tiger 已提交
1779

1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791
      /* Enable conversion of regular group.                                  */
      /* If software start has been selected, conversion starts immediately.  */
      /* If external trigger has been selected, conversion will start at next */
      /* trigger event.                                                       */
      /* Start ADC group regular conversion */
      LL_ADC_REG_StartConversion(hadc->Instance);
    }
  }
  else
  {
    tmp_hal_status = HAL_BUSY;
  }
M
Mr.Tiger 已提交
1792

1793 1794 1795 1796 1797
  /* Return function status */
  return tmp_hal_status;
}

/**
M
Mr.Tiger 已提交
1798 1799
  * @brief  Stop ADC conversion of regular group (and injected group in
  *         case of auto_injection mode), disable ADC DMA transfer, disable
1800 1801 1802 1803
  *         ADC peripheral.
  * @param hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
1804
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)
1805 1806
{
  HAL_StatusTypeDef tmp_hal_status;
M
Mr.Tiger 已提交
1807

1808 1809
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
1810

1811 1812
  /* Process locked */
  __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
1813

1814 1815
  /* 1. Stop potential ADC group regular conversion on going */
  tmp_hal_status = ADC_ConversionStop(hadc);
M
Mr.Tiger 已提交
1816

1817 1818 1819 1820 1821
  /* Disable ADC peripheral if conversions are effectively stopped */
  if (tmp_hal_status == HAL_OK)
  {
    /* Disable the DMA channel (in case of DMA in circular mode or stop       */
    /* while DMA transfer is on going)                                        */
M
Mr.Tiger 已提交
1822
    if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
1823 1824
    {
      tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
M
Mr.Tiger 已提交
1825

1826 1827 1828 1829 1830 1831 1832
      /* Check if DMA channel effectively disabled */
      if (tmp_hal_status != HAL_OK)
      {
        /* Update ADC state machine to error */
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
      }
    }
M
Mr.Tiger 已提交
1833

1834 1835
    /* Disable ADC overrun interrupt */
    __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
M
Mr.Tiger 已提交
1836

1837
    /* 2. Disable the ADC peripheral */
M
Mr.Tiger 已提交
1838 1839
    /* Update "tmp_hal_status" only if DMA channel disabling passed,          */
    /* to keep in memory a potential failing status.                          */
1840 1841 1842 1843 1844 1845 1846 1847
    if (tmp_hal_status == HAL_OK)
    {
      tmp_hal_status = ADC_Disable(hadc);
    }
    else
    {
      (void)ADC_Disable(hadc);
    }
M
Mr.Tiger 已提交
1848

1849 1850 1851 1852 1853 1854 1855 1856
    /* Check if ADC is effectively disabled */
    if (tmp_hal_status == HAL_OK)
    {
      /* Set ADC state */
      ADC_STATE_CLR_SET(hadc->State,
                        HAL_ADC_STATE_REG_BUSY,
                        HAL_ADC_STATE_READY);
    }
M
Mr.Tiger 已提交
1857

1858 1859 1860
    /* Disable ADC DMA (ADC DMA configuration of continuous requests is kept) */
    CLEAR_BIT(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN);
  }
M
Mr.Tiger 已提交
1861

1862 1863
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
1864

1865 1866 1867 1868 1869 1870 1871 1872
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Get ADC regular group conversion result.
  * @note   Reading register DR automatically clears ADC flag EOC
  *         (ADC group regular end of unitary conversion).
M
Mr.Tiger 已提交
1873
  * @note   This function does not clear ADC flag EOS
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887
  *         (ADC group regular end of sequence conversion).
  *         Occurrence of flag EOS rising:
  *          - If sequencer is composed of 1 rank, flag EOS is equivalent
  *            to flag EOC.
  *          - If sequencer is composed of several ranks, during the scan
  *            sequence flag EOC only is raised, at the end of the scan sequence
  *            both flags EOC and EOS are raised.
  *         To clear this flag, either use function:
  *         in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
  *         model polling: @ref HAL_ADC_PollForConversion()
  *         or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
  * @param hadc ADC handle
  * @retval ADC group regular conversion data
  */
M
Mr.Tiger 已提交
1888
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)
1889 1890 1891 1892 1893 1894
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));

  /* Note: EOC flag is not cleared here by software because automatically     */
  /*       cleared by hardware when reading register DR.                      */
M
Mr.Tiger 已提交
1895 1896

  /* Return ADC converted value */
1897 1898 1899 1900 1901 1902 1903 1904
  return hadc->Instance->DR;
}

/**
  * @brief  Handle ADC interrupt request.
  * @param hadc ADC handle
  * @retval None
  */
M
Mr.Tiger 已提交
1905
void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc)
1906 1907 1908 1909
{
  uint32_t overrun_error = 0UL; /* flag set if overrun occurrence has to be considered as an error */
  uint32_t tmp_isr = hadc->Instance->ISR;
  uint32_t tmp_ier = hadc->Instance->IER;
M
Mr.Tiger 已提交
1910

1911 1912 1913
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
M
Mr.Tiger 已提交
1914

1915
  /* ========== Check End of Sampling flag for ADC group regular ========== */
M
Mr.Tiger 已提交
1916
  if (((tmp_isr & ADC_FLAG_EOSMP) == ADC_FLAG_EOSMP) && ((tmp_ier & ADC_IT_EOSMP) == ADC_IT_EOSMP))
1917 1918 1919 1920 1921 1922 1923
  {
    /* Update state machine on end of sampling status if not in error state */
    if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
    {
      /* Set ADC state */
      SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
    }
M
Mr.Tiger 已提交
1924

1925 1926 1927 1928 1929 1930
    /* End Of Sampling callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->EndOfSamplingCallback(hadc);
#else
    HAL_ADCEx_EndOfSamplingCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
1931

1932
    /* Clear regular group conversion flag */
M
Mr.Tiger 已提交
1933
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
1934
  }
M
Mr.Tiger 已提交
1935

1936
  /* ====== Check ADC group regular end of unitary conversion sequence conversions ===== */
M
Mr.Tiger 已提交
1937 1938
  if ((((tmp_isr & ADC_FLAG_EOC) == ADC_FLAG_EOC) && ((tmp_ier & ADC_IT_EOC) == ADC_IT_EOC)) ||
      (((tmp_isr & ADC_FLAG_EOS) == ADC_FLAG_EOS) && ((tmp_ier & ADC_IT_EOS) == ADC_IT_EOS)))
1939 1940 1941 1942 1943 1944 1945
  {
    /* Update state machine on conversion status if not in error state */
    if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
    {
      /* Set ADC state */
      SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
    }
M
Mr.Tiger 已提交
1946

1947 1948 1949
    /* Determine whether any further conversion upcoming on group regular     */
    /* by external trigger, continuous mode or scan sequence on going         */
    /* to disable interruption.                                               */
M
Mr.Tiger 已提交
1950 1951 1952
    if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
        && (hadc->Init.ContinuousConvMode == DISABLE)
       )
1953 1954
    {
      /* If End of Sequence is reached, disable interrupts */
M
Mr.Tiger 已提交
1955
      if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
1956 1957 1958 1959 1960 1961 1962 1963 1964 1965
      {
        /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit           */
        /* ADSTART==0 (no conversion on going)                                */
        if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
        {
          /* Disable ADC end of single conversion interrupt on group regular */
          /* Note: Overrun interrupt was enabled with EOC interrupt in        */
          /* HAL_Start_IT(), but is not disabled here because can be used     */
          /* by overrun IRQ process below.                                    */
          __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
M
Mr.Tiger 已提交
1966

1967 1968 1969 1970 1971 1972 1973 1974 1975
          /* Set ADC state */
          ADC_STATE_CLR_SET(hadc->State,
                            HAL_ADC_STATE_REG_BUSY,
                            HAL_ADC_STATE_READY);
        }
        else
        {
          /* Change ADC state to error state */
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
1976

1977
          /* Set ADC error code to ADC peripheral internal error */
1978 1979 1980 1981
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
        }
      }
    }
M
Mr.Tiger 已提交
1982

1983 1984 1985 1986
    /* Conversion complete callback */
    /* Note: Into callback function "HAL_ADC_ConvCpltCallback()",             */
    /*       to determine if conversion has been triggered from EOC or EOS,   */
    /*       possibility to use:                                              */
M
Mr.Tiger 已提交
1987
    /*        " if ( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) "               */
1988 1989 1990 1991 1992
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->ConvCpltCallback(hadc);
#else
    HAL_ADC_ConvCpltCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
1993

1994 1995 1996 1997 1998
    /* Clear regular group conversion flag */
    /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of         */
    /*       conversion flags clear induces the release of the preserved data.*/
    /*       Therefore, if the preserved data value is needed, it must be     */
    /*       read preliminarily into HAL_ADC_ConvCpltCallback().              */
M
Mr.Tiger 已提交
1999
    __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
2000
  }
M
Mr.Tiger 已提交
2001

2002
  /* ========== Check Analog watchdog 1 flag ========== */
M
Mr.Tiger 已提交
2003
  if (((tmp_isr & ADC_FLAG_AWD1) == ADC_FLAG_AWD1) && ((tmp_ier & ADC_IT_AWD1) == ADC_IT_AWD1))
2004 2005 2006
  {
    /* Set ADC state */
    SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
M
Mr.Tiger 已提交
2007

2008 2009 2010 2011 2012 2013
    /* Level out of window 1 callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->LevelOutOfWindowCallback(hadc);
#else
    HAL_ADC_LevelOutOfWindowCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
2014 2015

    /* Clear ADC analog watchdog flag */
2016 2017
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
  }
M
Mr.Tiger 已提交
2018

2019
  /* ========== Check analog watchdog 2 flag ========== */
M
Mr.Tiger 已提交
2020
  if (((tmp_isr & ADC_FLAG_AWD2) == ADC_FLAG_AWD2) && ((tmp_ier & ADC_IT_AWD2) == ADC_IT_AWD2))
2021 2022 2023
  {
    /* Set ADC state */
    SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
M
Mr.Tiger 已提交
2024

2025 2026 2027 2028 2029 2030
    /* Level out of window 2 callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->LevelOutOfWindow2Callback(hadc);
#else
    HAL_ADCEx_LevelOutOfWindow2Callback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
2031 2032

    /* Clear ADC analog watchdog flag */
2033 2034
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
  }
M
Mr.Tiger 已提交
2035

2036
  /* ========== Check analog watchdog 3 flag ========== */
M
Mr.Tiger 已提交
2037
  if (((tmp_isr & ADC_FLAG_AWD3) == ADC_FLAG_AWD3) && ((tmp_ier & ADC_IT_AWD3) == ADC_IT_AWD3))
2038 2039 2040
  {
    /* Set ADC state */
    SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
M
Mr.Tiger 已提交
2041

2042 2043 2044 2045 2046 2047
    /* Level out of window 3 callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->LevelOutOfWindow3Callback(hadc);
#else
    HAL_ADCEx_LevelOutOfWindow3Callback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
M
Mr.Tiger 已提交
2048 2049

    /* Clear ADC analog watchdog flag */
2050 2051
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
  }
M
Mr.Tiger 已提交
2052

2053
  /* ========== Check Overrun flag ========== */
M
Mr.Tiger 已提交
2054
  if (((tmp_isr & ADC_FLAG_OVR) == ADC_FLAG_OVR) && ((tmp_ier & ADC_IT_OVR) == ADC_IT_OVR))
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073
  {
    /* If overrun is set to overwrite previous data (default setting),        */
    /* overrun event is not considered as an error.                           */
    /* (cf ref manual "Managing conversions without using the DMA and without */
    /* overrun ")                                                             */
    /* Exception for usage with DMA overrun event always considered as an     */
    /* error.                                                                 */
    if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
    {
      overrun_error = 1UL;
    }
    else
    {
      /* Check DMA configuration */
      if (LL_ADC_REG_GetDMATransfer(hadc->Instance) != LL_ADC_REG_DMA_TRANSFER_NONE)
      {
        overrun_error = 1UL;
      }
    }
M
Mr.Tiger 已提交
2074

2075 2076 2077 2078
    if (overrun_error == 1UL)
    {
      /* Change ADC state to error state */
      SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
M
Mr.Tiger 已提交
2079

2080 2081
      /* Set ADC error code to overrun */
      SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
M
Mr.Tiger 已提交
2082

2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093
      /* Error callback */
      /* Note: In case of overrun, ADC conversion data is preserved until     */
      /*       flag OVR is reset.                                             */
      /*       Therefore, old ADC conversion data can be retrieved in         */
      /*       function "HAL_ADC_ErrorCallback()".                            */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
      hadc->ErrorCallback(hadc);
#else
      HAL_ADC_ErrorCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
    }
M
Mr.Tiger 已提交
2094

2095 2096 2097
    /* Clear ADC overrun flag */
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
  }
M
Mr.Tiger 已提交
2098

2099 2100 2101 2102 2103
  /* ========== Check channel configuration ready flag ========== */
  if (((tmp_isr & ADC_FLAG_CCRDY) == ADC_FLAG_CCRDY) && ((tmp_ier & ADC_IT_CCRDY) == ADC_IT_CCRDY))
  {
    /* Level out of window 1 callback */
    HAL_ADCEx_ChannelConfigReadyCallback(hadc);
M
Mr.Tiger 已提交
2104 2105

    /* Clear ADC analog watchdog flag */
2106 2107 2108 2109 2110 2111 2112 2113 2114
    __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_CCRDY);
  }
}

/**
  * @brief  Conversion complete callback in non-blocking mode.
  * @param hadc ADC handle
  * @retval None
  */
M
Mr.Tiger 已提交
2115
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_ConvCpltCallback must be implemented in the user file.
   */
}

/**
  * @brief  Conversion DMA half-transfer callback in non-blocking mode.
  * @param hadc ADC handle
  * @retval None
  */
M
Mr.Tiger 已提交
2130
__weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
  */
}

/**
  * @brief  Analog watchdog 1 callback in non-blocking mode.
  * @param hadc ADC handle
  * @retval None
  */
M
Mr.Tiger 已提交
2145
__weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc)
2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
  */
}

/**
  * @brief  ADC error callback in non-blocking mode
  *         (ADC conversion with interruption or transfer by DMA).
M
Mr.Tiger 已提交
2158
  * @note   In case of error due to overrun when using ADC with DMA transfer
2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181
  *         (HAL ADC handle parameter "ErrorCode" to state "HAL_ADC_ERROR_OVR"):
  *         - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()".
  *         - If needed, restart a new ADC conversion using function
  *           "HAL_ADC_Start_DMA()"
  *           (this function is also clearing overrun flag)
  * @param hadc ADC handle
  * @retval None
  */
__weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_ErrorCallback must be implemented in the user file.
  */
}

/**
  * @}
  */

/** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
M
Mr.Tiger 已提交
2182 2183 2184
  * @brief    Peripheral Control functions
  *
@verbatim
2185 2186
 ===============================================================================
             ##### Peripheral Control functions #####
M
Mr.Tiger 已提交
2187
 ===============================================================================
2188 2189 2190
    [..]  This section provides functions allowing to:
      (+) Configure channels on regular group
      (+) Configure the analog watchdog
M
Mr.Tiger 已提交
2191

2192 2193 2194 2195 2196 2197 2198 2199
@endverbatim
  * @{
  */

/**
  * @brief  Configure a channel to be assigned to ADC group regular.
  * @note   In case of usage of internal measurement channels:
  *         Vbat/VrefInt/TempSensor.
M
Mr.Tiger 已提交
2200
  *         These internal paths can be disabled using function
2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212
  *         HAL_ADC_DeInit().
  * @note   Possibility to update parameters on the fly:
  *         This function initializes channel into ADC group regular,
  *         following calls to this function can be used to reconfigure
  *         some parameters of structure "ADC_ChannelConfTypeDef" on the fly,
  *         without resetting the ADC.
  *         The setting of these parameters is conditioned to ADC state:
  *         Refer to comments of structure "ADC_ChannelConfTypeDef".
  * @param hadc ADC handle
  * @param sConfig Structure of ADC channel assigned to ADC group regular.
  * @retval HAL status
  */
M
Mr.Tiger 已提交
2213
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig)
2214 2215 2216 2217
{
  HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  uint32_t tmp_config_internal_channel;
  __IO uint32_t wait_loop_index = 0UL;
M
Mr.Tiger 已提交
2218

2219 2220 2221 2222
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_CHANNEL(sConfig->Channel));
  assert_param(IS_ADC_SAMPLING_TIME_COMMON(sConfig->SamplingTime));
M
Mr.Tiger 已提交
2223 2224 2225

  if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED)       ||
      (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
2226 2227 2228 2229 2230 2231
  {
    assert_param(IS_ADC_REGULAR_RANK_SEQ_FIXED(sConfig->Rank));
  }
  else
  {
    assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
M
Mr.Tiger 已提交
2232

2233 2234
    assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank));
  }
M
Mr.Tiger 已提交
2235

2236 2237
  /* Process locked */
  __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
2238

2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253
  /* Parameters update conditioned to ADC state:                              */
  /* Parameters that can be updated when ADC is disabled or enabled without   */
  /* conversion on going on regular group:                                    */
  /*  - Channel number                                                        */
  /*  - Channel sampling time                                                 */
  /*  - Management of internal measurement channels: VrefInt/TempSensor/Vbat  */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  {
    /* Configure channel: depending on rank setting, add it or remove it from */
    /* ADC sequencer.                                                         */
    /* If sequencer set to not fully configurable with channel rank set to    */
    /* none, remove the channel from the sequencer.                           */
    /* Otherwise (sequencer set to fully configurable or to to not fully      */
    /* configurable with channel rank to be set), configure the selected      */
    /* channel.                                                               */
M
Mr.Tiger 已提交
2254
    if (sConfig->Rank != ADC_RANK_NONE)
2255 2256 2257 2258 2259 2260 2261
    {
      /* Regular sequence configuration */
      /* Note: ADC channel configuration requires few ADC clock cycles        */
      /*       to be ready. Processing of ADC settings in this function       */
      /*       induce that a specific wait time is not necessary.             */
      /*       For more details on ADC channel configuration ready,           */
      /*       refer to function "LL_ADC_IsActiveFlag_CCRDY()".               */
M
Mr.Tiger 已提交
2262 2263
      if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED)       ||
          (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
2264 2265 2266 2267 2268 2269 2270 2271 2272
      {
        /* Sequencer set to not fully configurable:                           */
        /* Set the channel by enabling the corresponding bitfield.            */
        LL_ADC_REG_SetSequencerChAdd(hadc->Instance, sConfig->Channel);
      }
      else
      {
        /* Sequencer set to fully configurable:                               */
        /* Set the channel by entering it into the selected rank.             */
M
Mr.Tiger 已提交
2273

2274 2275 2276 2277
        /* Memorize the channel set into variable in HAL ADC handle */
        MODIFY_REG(hadc->ADCGroupRegularSequencerRanks,
                   ADC_CHSELR_SQ1 << (sConfig->Rank & 0x1FUL),
                   __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel) << (sConfig->Rank & 0x1FUL));
M
Mr.Tiger 已提交
2278

2279 2280 2281
        /* If the selected rank is below ADC group regular sequencer length,  */
        /* apply the configuration in ADC register.                           */
        /* Note: Otherwise, configuration is not applied.                     */
M
Mr.Tiger 已提交
2282 2283
        /*       To apply it, parameter'NbrOfConversion' must be increased.   */
        if (((sConfig->Rank >> 2UL) + 1UL) <= hadc->Init.NbrOfConversion)
2284 2285 2286 2287
        {
          LL_ADC_REG_SetSequencerRanks(hadc->Instance, sConfig->Rank, sConfig->Channel);
        }
      }
M
Mr.Tiger 已提交
2288

2289 2290
      /* Set sampling time of the selected ADC channel */
      LL_ADC_SetChannelSamplingTime(hadc->Instance, sConfig->Channel, sConfig->SamplingTime);
M
Mr.Tiger 已提交
2291

2292 2293 2294 2295 2296 2297
      /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
      /* internal measurement paths enable: If internal channel selected,     */
      /* enable dedicated internal buffers and path.                          */
      /* Note: these internal measurement paths can be disabled using         */
      /*       HAL_ADC_DeInit() or removing the channel from sequencer with   */
      /*       channel configuration parameter "Rank".                        */
M
Mr.Tiger 已提交
2298
      if (__LL_ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
2299 2300
      {
        tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
2301

2302 2303
        /* If the requested internal measurement path has already been enabled,   */
        /* bypass the configuration processing.                                   */
M
Mr.Tiger 已提交
2304 2305
        if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) &&
            ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_TEMPSENSOR) == 0UL))
2306
        {
M
Mr.Tiger 已提交
2307 2308 2309
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         LL_ADC_PATH_INTERNAL_TEMPSENSOR | tmp_config_internal_channel);

2310 2311 2312 2313 2314
          /* Delay for temperature sensor stabilization time */
          /* Wait loop initialization and execution */
          /* Note: Variable divided by 2 to compensate partially              */
          /*       CPU processing cycles, scaling in us split to not          */
          /*       exceed 32 bits register capacity and handle low frequency. */
M
Mr.Tiger 已提交
2315 2316
          wait_loop_index = (((LL_ADC_DELAY_TEMPSENSOR_STAB_US / 10UL) * (SystemCoreClock / (100000UL * 2UL))) + 1UL);
          while (wait_loop_index != 0UL)
2317 2318 2319 2320 2321 2322
          {
            wait_loop_index--;
          }
        }
        else if ((sConfig->Channel == ADC_CHANNEL_VBAT) && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VBAT) == 0UL))
        {
M
Mr.Tiger 已提交
2323 2324
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         LL_ADC_PATH_INTERNAL_VBAT | tmp_config_internal_channel);
2325
        }
M
Mr.Tiger 已提交
2326 2327
        else if ((sConfig->Channel == ADC_CHANNEL_VREFINT) &&
                 ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VREFINT) == 0UL))
2328
        {
M
Mr.Tiger 已提交
2329 2330
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         LL_ADC_PATH_INTERNAL_VREFINT | tmp_config_internal_channel);
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344
        }
        else
        {
          /* nothing to do */
        }
      }
    }
    else
    {
      /* Regular sequencer configuration */
      /* Note: Case of sequencer set to fully configurable:                   */
      /*       Sequencer rank cannot be disabled, only affected to            */
      /*       another channel.                                               */
      /*       To remove a rank, use parameter 'NbrOfConversion".             */
M
Mr.Tiger 已提交
2345 2346
      if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED)       ||
          (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
2347 2348 2349 2350 2351
      {
        /* Sequencer set to not fully configurable:                           */
        /* Reset the channel by disabling the corresponding bitfield.         */
        LL_ADC_REG_SetSequencerChRem(hadc->Instance, sConfig->Channel);
      }
M
Mr.Tiger 已提交
2352

2353 2354 2355
      /* Management of internal measurement channels: Vbat/VrefInt/TempSensor.  */
      /* If internal channel selected, enable dedicated internal buffers and    */
      /* paths.                                                                 */
M
Mr.Tiger 已提交
2356
      if (__LL_ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
2357 2358
      {
        tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
2359

2360 2361
        if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
        {
M
Mr.Tiger 已提交
2362 2363
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         ~LL_ADC_PATH_INTERNAL_TEMPSENSOR & tmp_config_internal_channel);
2364 2365 2366
        }
        else if (sConfig->Channel == ADC_CHANNEL_VBAT)
        {
M
Mr.Tiger 已提交
2367 2368
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         ~LL_ADC_PATH_INTERNAL_VBAT & tmp_config_internal_channel);
2369 2370 2371
        }
        else if (sConfig->Channel == ADC_CHANNEL_VREFINT)
        {
M
Mr.Tiger 已提交
2372 2373
          LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
                                         ~LL_ADC_PATH_INTERNAL_VREFINT & tmp_config_internal_channel);
2374 2375 2376 2377 2378 2379 2380 2381
        }
        else
        {
          /* nothing to do */
        }
      }
    }
  }
M
Mr.Tiger 已提交
2382

2383 2384 2385 2386 2387 2388 2389
  /* If a conversion is on going on regular group, no update on regular       */
  /* channel could be done on neither of the channel configuration structure  */
  /* parameters.                                                              */
  else
  {
    /* Update ADC state machine to error */
    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
2390

2391 2392
    tmp_hal_status = HAL_ERROR;
  }
M
Mr.Tiger 已提交
2393

2394 2395
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
2396

2397 2398 2399 2400 2401 2402 2403
  /* Return function status */
  return tmp_hal_status;
}

/**
  * @brief  Configure the analog watchdog.
  * @note   Possibility to update parameters on the fly:
M
Mr.Tiger 已提交
2404 2405 2406
  *         This function initializes the selected analog watchdog, successive
  *         calls to this function can be used to reconfigure some parameters
  *         of structure "ADC_AnalogWDGConfTypeDef" on the fly, without resetting
2407 2408
  *         the ADC.
  *         The setting of these parameters is conditioned to ADC state.
M
Mr.Tiger 已提交
2409
  *         For parameters constraints, see comments of structure
2410
  *         "ADC_AnalogWDGConfTypeDef".
M
Mr.Tiger 已提交
2411
  * @note   On this STM32 series, analog watchdog thresholds can be modified
2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422
  *         while ADC conversion is on going.
  *         In this case, some constraints must be taken into account:
  *         the programmed threshold values are effective from the next
  *         ADC EOC (end of unitary conversion).
  *         Considering that registers write delay may happen due to
  *         bus activity, this might cause an uncertainty on the
  *         effective timing of the new programmed threshold values.
  * @param hadc ADC handle
  * @param AnalogWDGConfig Structure of ADC analog watchdog configuration
  * @retval HAL status
  */
M
Mr.Tiger 已提交
2423
HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, ADC_AnalogWDGConfTypeDef *AnalogWDGConfig)
2424 2425 2426 2427
{
  HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  uint32_t tmpAWDHighThresholdShifted;
  uint32_t tmpAWDLowThresholdShifted;
M
Mr.Tiger 已提交
2428

2429 2430 2431 2432 2433
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_ANALOG_WATCHDOG_NUMBER(AnalogWDGConfig->WatchdogNumber));
  assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
  assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
M
Mr.Tiger 已提交
2434 2435

  if (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG)
2436 2437 2438
  {
    assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel));
  }
M
Mr.Tiger 已提交
2439

2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454
  /* Verify thresholds range */
  if (hadc->Init.OversamplingMode == ENABLE)
  {
    /* Case of oversampling enabled: depending on ratio and shift configuration,
       analog watchdog thresholds can be higher than ADC resolution.
       Verify if thresholds are within maximum thresholds range. */
    assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->HighThreshold));
    assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->LowThreshold));
  }
  else
  {
    /* Verify if thresholds are within the selected ADC resolution */
    assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
    assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
  }
M
Mr.Tiger 已提交
2455

2456 2457
  /* Process locked */
  __HAL_LOCK(hadc);
M
Mr.Tiger 已提交
2458

2459 2460 2461 2462 2463 2464 2465
  /* Parameters update conditioned to ADC state:                              */
  /* Parameters that can be updated when ADC is disabled or enabled without   */
  /* conversion on going on ADC group regular:                                */
  /*  - Analog watchdog channels                                              */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  {
    /* Analog watchdog configuration */
M
Mr.Tiger 已提交
2466
    if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
2467 2468 2469 2470
    {
      /* Configuration of analog watchdog:                                    */
      /*  - Set the analog watchdog enable mode: one or overall group of      */
      /*    channels.                                                         */
M
Mr.Tiger 已提交
2471
      switch (AnalogWDGConfig->WatchdogMode)
2472 2473
      {
        case ADC_ANALOGWATCHDOG_SINGLE_REG:
M
Mr.Tiger 已提交
2474 2475
          LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1,
                                          __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel, LL_ADC_GROUP_REGULAR));
2476
          break;
M
Mr.Tiger 已提交
2477

2478 2479 2480
        case ADC_ANALOGWATCHDOG_ALL_REG:
          LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG);
          break;
M
Mr.Tiger 已提交
2481

2482 2483 2484 2485
        default: /* ADC_ANALOGWATCHDOG_NONE */
          LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_DISABLE);
          break;
      }
M
Mr.Tiger 已提交
2486

2487 2488
      /* Update state, clear previous result related to AWD1 */
      CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD1);
M
Mr.Tiger 已提交
2489

2490 2491 2492 2493 2494
      /* Clear flag ADC analog watchdog */
      /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready  */
      /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent()          */
      /* (in case left enabled by previous ADC operations).                 */
      LL_ADC_ClearFlag_AWD1(hadc->Instance);
M
Mr.Tiger 已提交
2495

2496
      /* Configure ADC analog watchdog interrupt */
M
Mr.Tiger 已提交
2497
      if (AnalogWDGConfig->ITMode == ENABLE)
2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508
      {
        LL_ADC_EnableIT_AWD1(hadc->Instance);
      }
      else
      {
        LL_ADC_DisableIT_AWD1(hadc->Instance);
      }
    }
    /* Case of ADC_ANALOGWATCHDOG_2 or ADC_ANALOGWATCHDOG_3 */
    else
    {
M
Mr.Tiger 已提交
2509
      switch (AnalogWDGConfig->WatchdogMode)
2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522
      {
        case ADC_ANALOGWATCHDOG_SINGLE_REG:
          /* Update AWD by bitfield to keep the possibility to monitor        */
          /* several channels by successive calls of this function.           */
          if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
          {
            SET_BIT(hadc->Instance->AWD2CR, (1UL << __LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel)));
          }
          else
          {
            SET_BIT(hadc->Instance->AWD3CR, (1UL << __LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel)));
          }
          break;
M
Mr.Tiger 已提交
2523

2524 2525 2526
        case ADC_ANALOGWATCHDOG_ALL_REG:
          LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_ALL_CHANNELS_REG);
          break;
M
Mr.Tiger 已提交
2527

2528 2529 2530 2531
        default: /* ADC_ANALOGWATCHDOG_NONE */
          LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_DISABLE);
          break;
      }
M
Mr.Tiger 已提交
2532

2533 2534 2535 2536
      if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
      {
        /* Update state, clear previous result related to AWD2 */
        CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD2);
M
Mr.Tiger 已提交
2537

2538 2539 2540 2541 2542
        /* Clear flag ADC analog watchdog */
        /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready  */
        /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent()          */
        /* (in case left enabled by previous ADC operations).                 */
        LL_ADC_ClearFlag_AWD2(hadc->Instance);
M
Mr.Tiger 已提交
2543

2544
        /* Configure ADC analog watchdog interrupt */
M
Mr.Tiger 已提交
2545
        if (AnalogWDGConfig->ITMode == ENABLE)
2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558
        {
          LL_ADC_EnableIT_AWD2(hadc->Instance);
        }
        else
        {
          LL_ADC_DisableIT_AWD2(hadc->Instance);
        }
      }
      /* (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_3) */
      else
      {
        /* Update state, clear previous result related to AWD3 */
        CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD3);
M
Mr.Tiger 已提交
2559

2560 2561 2562 2563 2564
        /* Clear flag ADC analog watchdog */
        /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready  */
        /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent()          */
        /* (in case left enabled by previous ADC operations).                 */
        LL_ADC_ClearFlag_AWD3(hadc->Instance);
M
Mr.Tiger 已提交
2565

2566
        /* Configure ADC analog watchdog interrupt */
M
Mr.Tiger 已提交
2567
        if (AnalogWDGConfig->ITMode == ENABLE)
2568 2569 2570 2571 2572 2573 2574 2575 2576
        {
          LL_ADC_EnableIT_AWD3(hadc->Instance);
        }
        else
        {
          LL_ADC_DisableIT_AWD3(hadc->Instance);
        }
      }
    }
M
Mr.Tiger 已提交
2577

2578
  }
M
Mr.Tiger 已提交
2579

2580
  /* Analog watchdog thresholds configuration */
M
Mr.Tiger 已提交
2581
  if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
2582 2583 2584
  {
    /* Shift the offset with respect to the selected ADC resolution:        */
    /* Thresholds have to be left-aligned on bit 11, the LSB (right bits)   */
M
Mr.Tiger 已提交
2585
    /* are set to 0.                                                        */
2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597
    tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
    tmpAWDLowThresholdShifted  = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
  }
  /* Case of ADC_ANALOGWATCHDOG_2 and ADC_ANALOGWATCHDOG_3 */
  else
  {
    /* No need to shift the offset with respect to the selected ADC resolution: */
    /* Thresholds have to be left-aligned on bit 11, the LSB (right bits)   */
    /* are set to 0.                                                        */
    tmpAWDHighThresholdShifted = AnalogWDGConfig->HighThreshold;
    tmpAWDLowThresholdShifted  = AnalogWDGConfig->LowThreshold;
  }
M
Mr.Tiger 已提交
2598

2599
  /* Set ADC analog watchdog thresholds value of both thresholds high and low */
M
Mr.Tiger 已提交
2600 2601 2602
  LL_ADC_ConfigAnalogWDThresholds(hadc->Instance, AnalogWDGConfig->WatchdogNumber, tmpAWDHighThresholdShifted,
                                  tmpAWDLowThresholdShifted);

2603 2604
  /* Process unlocked */
  __HAL_UNLOCK(hadc);
M
Mr.Tiger 已提交
2605

2606 2607 2608 2609 2610 2611 2612 2613 2614 2615
  /* Return function status */
  return tmp_hal_status;
}


/**
  * @}
  */

/** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
M
Mr.Tiger 已提交
2616 2617
  *  @brief    ADC Peripheral State functions
  *
2618 2619 2620 2621 2622
@verbatim
 ===============================================================================
            ##### Peripheral state and errors functions #####
 ===============================================================================
    [..]
M
Mr.Tiger 已提交
2623
    This subsection provides functions to get in run-time the status of the
2624 2625 2626 2627 2628 2629 2630 2631 2632 2633
    peripheral.
      (+) Check the ADC state
      (+) Check the ADC error code

@endverbatim
  * @{
  */

/**
  * @brief  Return the ADC handle state.
M
Mr.Tiger 已提交
2634
  * @note   ADC state machine is managed by bitfields, ADC status must be
2635
  *         compared with states bits.
M
Mr.Tiger 已提交
2636
  *         For example:
2637 2638 2639 2640 2641
  *           " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_REG_BUSY) != 0UL) "
  *           " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) "
  * @param hadc ADC handle
  * @retval ADC handle state (bitfield on 32 bits)
  */
M
Mr.Tiger 已提交
2642
uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc)
2643 2644 2645
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
2646

2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659
  /* Return ADC handle state */
  return hadc->State;
}

/**
  * @brief  Return the ADC error code.
  * @param hadc ADC handle
  * @retval ADC error code (bitfield on 32 bits)
  */
uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
2660

2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682
  return hadc->ErrorCode;
}

/**
  * @}
  */

/**
  * @}
  */

/** @defgroup ADC_Private_Functions ADC Private Functions
  * @{
  */

/**
  * @brief  Stop ADC conversion.
  * @note   Prerequisite condition to use this function: ADC conversions must be
  *         stopped to disable the ADC.
  * @param  hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
2683
HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef *hadc)
2684 2685
{
  uint32_t tickstart;
M
Mr.Tiger 已提交
2686

2687 2688
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
M
Mr.Tiger 已提交
2689

2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700
  /* Verification if ADC is not already stopped on regular group to bypass    */
  /* this function if not needed.                                             */
  if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) != 0UL)
  {
    /* Stop potential conversion on going on regular group */
    /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
    if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
    {
      /* Stop ADC group regular conversion */
      LL_ADC_REG_StopConversion(hadc->Instance);
    }
M
Mr.Tiger 已提交
2701

2702 2703 2704
    /* Wait for conversion effectively stopped */
    /* Get tick count */
    tickstart = HAL_GetTick();
M
Mr.Tiger 已提交
2705 2706

    while ((hadc->Instance->CR & ADC_CR_ADSTART) != 0UL)
2707
    {
M
Mr.Tiger 已提交
2708
      if ((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
2709 2710 2711
      {
        /* Update ADC state machine to error */
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2712

2713
        /* Set ADC error code to ADC peripheral internal error */
2714
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2715

2716 2717 2718
        return HAL_ERROR;
      }
    }
M
Mr.Tiger 已提交
2719

2720
  }
M
Mr.Tiger 已提交
2721

2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
  /* Return HAL status */
  return HAL_OK;
}

/**
  * @brief  Enable the selected ADC.
  * @note   Prerequisite condition to use this function: ADC must be disabled
  *         and voltage regulator must be enabled (done into HAL_ADC_Init()).
  * @param hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
2733
HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef *hadc)
2734 2735
{
  uint32_t tickstart;
M
Mr.Tiger 已提交
2736 2737
  __IO uint32_t wait_loop_index = 0UL;

2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748
  /* ADC enable and wait for ADC ready (in case of ADC is disabled or         */
  /* enabling phase not yet completed: flag ADC ready not yet set).           */
  /* Timeout implemented to not be stuck if ADC cannot be enabled (possible   */
  /* causes: ADC clock not running, ...).                                     */
  if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
  {
    /* Check if conditions to enable the ADC are fulfilled */
    if ((hadc->Instance->CR & (ADC_CR_ADCAL | ADC_CR_ADSTP | ADC_CR_ADSTART | ADC_CR_ADDIS | ADC_CR_ADEN)) != 0UL)
    {
      /* Update ADC state machine to error */
      SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2749

2750
      /* Set ADC error code to ADC peripheral internal error */
2751
      SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2752

2753 2754
      return HAL_ERROR;
    }
M
Mr.Tiger 已提交
2755

2756 2757
    /* Enable the ADC peripheral */
    LL_ADC_Enable(hadc->Instance);
M
Mr.Tiger 已提交
2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772

    if ((LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) & LL_ADC_PATH_INTERNAL_TEMPSENSOR) != 0UL)
    {
      /* Delay for temperature sensor buffer stabilization time */
      /* Wait loop initialization and execution */
      /* Note: Variable divided by 2 to compensate partially              */
      /*       CPU processing cycles, scaling in us split to not          */
      /*       exceed 32 bits register capacity and handle low frequency. */
      wait_loop_index = (((LL_ADC_DELAY_TEMPSENSOR_BUFFER_STAB_US / 10UL) * (SystemCoreClock / (100000UL * 2UL))) + 1UL);
      while (wait_loop_index != 0UL)
      {
        wait_loop_index--;
      }
    }

2773 2774 2775 2776 2777 2778
    /* If low power mode AutoPowerOff is enabled, power-on/off phases are     */
    /* performed automatically by hardware and flag ADC ready is not set.     */
    if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
    {
      /* Wait for ADC effectively enabled */
      tickstart = HAL_GetTick();
M
Mr.Tiger 已提交
2779 2780

      while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
2781
      {
M
Mr.Tiger 已提交
2782 2783
        /*  If ADEN bit is set less than 4 ADC clock cycles after the ADCAL bit
            has been cleared (after a calibration), ADEN bit is reset by the
2784 2785 2786 2787 2788 2789
            calibration logic.
            The workaround is to continue setting ADEN until ADRDY is becomes 1.
            Additionally, ADC_ENABLE_TIMEOUT is defined to encompass this
            4 ADC clock cycle duration */
        /* Note: Test of ADC enabled required due to hardware constraint to     */
        /*       not enable ADC if already enabled.                             */
M
Mr.Tiger 已提交
2790
        if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
2791 2792 2793
        {
          LL_ADC_Enable(hadc->Instance);
        }
M
Mr.Tiger 已提交
2794 2795

        if ((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
2796 2797 2798
        {
          /* Update ADC state machine to error */
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2799

2800
          /* Set ADC error code to ADC peripheral internal error */
2801
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2802

2803 2804 2805 2806 2807
          return HAL_ERROR;
        }
      }
    }
  }
M
Mr.Tiger 已提交
2808

2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819
  /* Return HAL status */
  return HAL_OK;
}

/**
  * @brief  Disable the selected ADC.
  * @note   Prerequisite condition to use this function: ADC conversions must be
  *         stopped.
  * @param hadc ADC handle
  * @retval HAL status.
  */
M
Mr.Tiger 已提交
2820
HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef *hadc)
2821 2822 2823
{
  uint32_t tickstart;
  const uint32_t tmp_adc_is_disable_on_going = LL_ADC_IsDisableOngoing(hadc->Instance);
M
Mr.Tiger 已提交
2824

2825 2826 2827
  /* Verification if ADC is not already disabled:                             */
  /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already  */
  /*       disabled.                                                          */
M
Mr.Tiger 已提交
2828
  if ((LL_ADC_IsEnabled(hadc->Instance) != 0UL)
2829 2830 2831 2832
      && (tmp_adc_is_disable_on_going == 0UL)
     )
  {
    /* Check if conditions to disable the ADC are fulfilled */
M
Mr.Tiger 已提交
2833
    if ((hadc->Instance->CR & (ADC_CR_ADSTART | ADC_CR_ADEN)) == ADC_CR_ADEN)
2834 2835 2836 2837 2838 2839 2840 2841 2842
    {
      /* Disable the ADC peripheral */
      LL_ADC_Disable(hadc->Instance);
      __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOSMP | ADC_FLAG_RDY));
    }
    else
    {
      /* Update ADC state machine to error */
      SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2843

2844
      /* Set ADC error code to ADC peripheral internal error */
2845
      SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2846

2847 2848
      return HAL_ERROR;
    }
M
Mr.Tiger 已提交
2849

2850 2851 2852
    /* Wait for ADC effectively disabled */
    /* Get tick count */
    tickstart = HAL_GetTick();
M
Mr.Tiger 已提交
2853 2854

    while ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
2855
    {
M
Mr.Tiger 已提交
2856
      if ((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
2857 2858 2859
      {
        /* Update ADC state machine to error */
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2860

2861
        /* Set ADC error code to ADC peripheral internal error */
2862
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
M
Mr.Tiger 已提交
2863

2864 2865 2866 2867
        return HAL_ERROR;
      }
    }
  }
M
Mr.Tiger 已提交
2868

2869 2870 2871 2872 2873
  /* Return HAL status */
  return HAL_OK;
}

/**
M
Mr.Tiger 已提交
2874
  * @brief  DMA transfer complete callback.
2875 2876 2877 2878 2879 2880
  * @param hdma pointer to DMA handle.
  * @retval None
  */
static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
{
  /* Retrieve ADC handle corresponding to current DMA handle */
M
Mr.Tiger 已提交
2881 2882
  ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

2883 2884 2885 2886 2887
  /* Update state machine on conversion status if not in error state */
  if ((hadc->State & (HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) == 0UL)
  {
    /* Set ADC state */
    SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
M
Mr.Tiger 已提交
2888

2889 2890 2891
    /* Determine whether any further conversion upcoming on group regular     */
    /* by external trigger, continuous mode or scan sequence on going         */
    /* to disable interruption.                                               */
M
Mr.Tiger 已提交
2892 2893 2894
    if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
        && (hadc->Init.ContinuousConvMode == DISABLE)
       )
2895 2896
    {
      /* If End of Sequence is reached, disable interrupts */
M
Mr.Tiger 已提交
2897
      if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
2898 2899 2900 2901 2902 2903 2904 2905 2906 2907
      {
        /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit           */
        /* ADSTART==0 (no conversion on going)                                */
        if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
        {
          /* Disable ADC end of single conversion interrupt on group regular */
          /* Note: Overrun interrupt was enabled with EOC interrupt in        */
          /* HAL_Start_IT(), but is not disabled here because can be used     */
          /* by overrun IRQ process below.                                    */
          __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
M
Mr.Tiger 已提交
2908

2909 2910 2911 2912 2913 2914 2915 2916 2917
          /* Set ADC state */
          ADC_STATE_CLR_SET(hadc->State,
                            HAL_ADC_STATE_REG_BUSY,
                            HAL_ADC_STATE_READY);
        }
        else
        {
          /* Change ADC state to error state */
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
M
Mr.Tiger 已提交
2918

2919
          /* Set ADC error code to ADC peripheral internal error */
2920 2921 2922 2923
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
        }
      }
    }
M
Mr.Tiger 已提交
2924

2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951
    /* Conversion complete callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->ConvCpltCallback(hadc);
#else
    HAL_ADC_ConvCpltCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  }
  else /* DMA and-or internal error occurred */
  {
    if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL)
    {
      /* Call HAL ADC Error Callback function */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
      hadc->ErrorCallback(hadc);
#else
      HAL_ADC_ErrorCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
    }
    else
    {
      /* Call ADC DMA error callback */
      hadc->DMA_Handle->XferErrorCallback(hdma);
    }
  }
}

/**
M
Mr.Tiger 已提交
2952
  * @brief  DMA half transfer complete callback.
2953 2954 2955 2956 2957 2958
  * @param hdma pointer to DMA handle.
  * @retval None
  */
static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
{
  /* Retrieve ADC handle corresponding to current DMA handle */
M
Mr.Tiger 已提交
2959 2960
  ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
  /* Half conversion callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  hadc->ConvHalfCpltCallback(hadc);
#else
  HAL_ADC_ConvHalfCpltCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
}

/**
  * @brief  DMA error callback.
  * @param hdma pointer to DMA handle.
  * @retval None
  */
static void ADC_DMAError(DMA_HandleTypeDef *hdma)
{
  /* Retrieve ADC handle corresponding to current DMA handle */
M
Mr.Tiger 已提交
2977 2978
  ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

2979 2980
  /* Set ADC state */
  SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
M
Mr.Tiger 已提交
2981

2982 2983
  /* Set ADC error code to DMA error */
  SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
M
Mr.Tiger 已提交
2984

2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006
  /* Error callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  hadc->ErrorCallback(hadc);
#else
  HAL_ADC_ErrorCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
}

/**
  * @}
  */

#endif /* HAL_ADC_MODULE_ENABLED */
/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/