1 /**
2   ******************************************************************************
3   * @file    stm32l1xx_hal_adc.c
4   * @author  MCD Application Team
5   * @brief   This file provides firmware functions to manage the following
6   *          functionalities of the Analog to Digital Convertor (ADC)
7   *          peripheral:
8   *           + Initialization and de-initialization functions
9   *             ++ Initialization and Configuration of ADC
10   *           + Operation functions
11   *             ++ Start, stop, get result of conversions of regular
12   *                group, using 3 possible modes: polling, interruption or DMA.
13   *           + Control functions
14   *             ++ Channels configuration on regular group
15   *             ++ Channels configuration on injected group
16   *             ++ Analog Watchdog configuration
17   *           + State functions
18   *             ++ ADC state machine management
19   *             ++ Interrupts and flags management
20   *          Other functions (extended functions) are available in file
21   *          "stm32l1xx_hal_adc_ex.c".
22   *
23   @verbatim
24   ==============================================================================
25                      ##### ADC peripheral features #####
26   ==============================================================================
27   [..]
28   (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution
29 
30   (+) Interrupt generation at the end of regular conversion, end of injected
31       conversion, and in case of analog watchdog or overrun events.
32 
33   (+) Single and continuous conversion modes.
34 
35   (+) Scan mode for conversion of several channels sequentially.
36 
37   (+) Data alignment with in-built data coherency.
38 
39   (+) Programmable sampling time (channel wise)
40 
41   (+) ADC conversion of regular group and injected group.
42 
43   (+) External trigger (timer or EXTI) with configurable polarity
44       for both regular and injected groups.
45 
46   (+) DMA request generation for transfer of conversions data of regular group.
47 
48   (+) ADC offset on injected channels
49 
50   (+) ADC supply requirements: 2.4 V to 3.6 V at full speed and down to 1.8 V at
51       slower speed.
52 
53   (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
54       Vdda or to an external voltage reference).
55 
56 
57                      ##### How to use this driver #####
58   ==============================================================================
59     [..]
60 
61      *** Configuration of top level parameters related to ADC ***
62      ============================================================
63      [..]
64 
65     (#) Enable the ADC interface
66       (++) As prerequisite, ADC clock must be configured at RCC top level.
67            Caution: On STM32L1, ADC clock frequency max is 16MHz (refer
68                     to device datasheet).
69                     Therefore, ADC clock prescaler must be configured in
70                     function of ADC clock source frequency to remain below
71                     this maximum frequency.
72 
73         (++) Two clock settings are mandatory:
74              (+++) ADC clock (core clock).
75              (+++) ADC clock (conversions clock).
76                    Only one possible clock source: derived from HSI RC 16MHz oscillator
77                    (HSI).
78                    ADC is connected directly to HSI RC 16MHz oscillator.
79                    Therefore, RCC PLL setting has no impact on ADC.
80                    PLL can be disabled (".PLL.PLLState = RCC_PLL_NONE") or
81                    enabled with HSI16 as clock source
82                    (".PLL.PLLSource = RCC_PLLSOURCE_HSI") to be used as device
83                    main clock source SYSCLK.
84                    The only mandatory setting is ".HSIState = RCC_HSI_ON"
85 
86              (+++) Example:
87                    Into HAL_ADC_MspInit() (recommended code location) or with
88                    other device clock parameters configuration:
89                (+++) __HAL_RCC_ADC1_CLK_ENABLE();
90 
91                (+++) HAL_RCC_GetOscConfig(&RCC_OscInitStructure);
92                (+++) RCC_OscInitStructure.OscillatorType = (... | RCC_OSCILLATORTYPE_HSI);
93                (+++) RCC_OscInitStructure.HSIState = RCC_HSI_ON;
94                (+++) RCC_OscInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
95                (+++) RCC_OscInitStructure.PLL.PLLState = RCC_PLL_NONE;
96                (+++) RCC_OscInitStructure.PLL.PLLSource = ...
97                (+++) RCC_OscInitStructure.PLL...
98                (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
99 
100         (++) ADC clock prescaler is configured at ADC level with
101              parameter "ClockPrescaler" using function HAL_ADC_Init().
102 
103     (#) ADC pins configuration
104          (++) Enable the clock for the ADC GPIOs
105               using macro __HAL_RCC_GPIOx_CLK_ENABLE()
106          (++) Configure these ADC pins in analog mode
107               using function HAL_GPIO_Init()
108 
109     (#) Optionally, in case of usage of ADC with interruptions:
110          (++) Configure the NVIC for ADC
111               using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
112          (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
113               into the function of corresponding ADC interruption vector
114               ADCx_IRQHandler().
115 
116     (#) Optionally, in case of usage of DMA:
117          (++) Configure the DMA (DMA channel, mode normal or circular, ...)
118               using function HAL_DMA_Init().
119          (++) Configure the NVIC for DMA
120               using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
121          (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
122               into the function of corresponding DMA interruption vector
123               DMAx_Channelx_IRQHandler().
124 
125      *** Configuration of ADC, groups regular/injected, channels parameters ***
126      ==========================================================================
127      [..]
128 
129     (#) Configure the ADC parameters (resolution, data alignment, ...)
130         and regular group parameters (conversion trigger, sequencer, ...)
131         using function HAL_ADC_Init().
132 
133     (#) Configure the channels for regular group parameters (channel number,
134         channel rank into sequencer, ..., into regular group)
135         using function HAL_ADC_ConfigChannel().
136 
137     (#) Optionally, configure the injected group parameters (conversion trigger,
138         sequencer, ..., of injected group)
139         and the channels for injected group parameters (channel number,
140         channel rank into sequencer, ..., into injected group)
141         using function HAL_ADCEx_InjectedConfigChannel().
142 
143     (#) Optionally, configure the analog watchdog parameters (channels
144         monitored, thresholds, ...)
145         using function HAL_ADC_AnalogWDGConfig().
146 
147     (#) Optionally, for devices with several ADC instances: configure the
148         multimode parameters
149         using function HAL_ADCEx_MultiModeConfigChannel().
150 
151      *** Execution of ADC conversions ***
152      ====================================
153      [..]
154 
155     (#) ADC driver can be used among three modes: polling, interruption,
156         transfer by DMA.
157 
158         (++) ADC conversion by polling:
159           (+++) Activate the ADC peripheral and start conversions
160                 using function HAL_ADC_Start()
161           (+++) Wait for ADC conversion completion
162                 using function HAL_ADC_PollForConversion()
163                 (or for injected group: HAL_ADCEx_InjectedPollForConversion() )
164           (+++) Retrieve conversion results
165                 using function HAL_ADC_GetValue()
166                 (or for injected group: HAL_ADCEx_InjectedGetValue() )
167           (+++) Stop conversion and disable the ADC peripheral
168                 using function HAL_ADC_Stop()
169 
170         (++) ADC conversion by interruption:
171           (+++) Activate the ADC peripheral and start conversions
172                 using function HAL_ADC_Start_IT()
173           (+++) Wait for ADC conversion completion by call of function
174                 HAL_ADC_ConvCpltCallback()
175                 (this function must be implemented in user program)
176                 (or for injected group: HAL_ADCEx_InjectedConvCpltCallback() )
177           (+++) Retrieve conversion results
178                 using function HAL_ADC_GetValue()
179                 (or for injected group: HAL_ADCEx_InjectedGetValue() )
180           (+++) Stop conversion and disable the ADC peripheral
181                 using function HAL_ADC_Stop_IT()
182 
183         (++) ADC conversion with transfer by DMA:
184           (+++) Activate the ADC peripheral and start conversions
185                 using function HAL_ADC_Start_DMA()
186           (+++) Wait for ADC conversion completion by call of function
187                 HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
188                 (these functions must be implemented in user program)
189           (+++) Conversion results are automatically transferred by DMA into
190                 destination variable address.
191           (+++) Stop conversion and disable the ADC peripheral
192                 using function HAL_ADC_Stop_DMA()
193 
194         (++) For devices with several ADCs: ADC multimode conversion
195              with transfer by DMA:
196           (+++) Activate the ADC peripheral (slave) and start conversions
197                 using function HAL_ADC_Start()
198           (+++) Activate the ADC peripheral (master) and start conversions
199                 using function HAL_ADCEx_MultiModeStart_DMA()
200           (+++) Wait for ADC conversion completion by call of function
201                 HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
202                 (these functions must be implemented in user program)
203           (+++) Conversion results are automatically transferred by DMA into
204                 destination variable address.
205           (+++) Stop conversion and disable the ADC peripheral (master)
206                 using function HAL_ADCEx_MultiModeStop_DMA()
207           (+++) Stop conversion and disable the ADC peripheral (slave)
208                 using function HAL_ADC_Stop_IT()
209 
210      [..]
211 
212     (@) Callback functions must be implemented in user program:
213       (+@) HAL_ADC_ErrorCallback()
214       (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
215       (+@) HAL_ADC_ConvCpltCallback()
216       (+@) HAL_ADC_ConvHalfCpltCallback
217       (+@) HAL_ADCEx_InjectedConvCpltCallback()
218 
219      *** Deinitialization of ADC ***
220      ============================================================
221      [..]
222 
223     (#) Disable the ADC interface
224       (++) ADC clock can be hard reset and disabled at RCC top level.
225         (++) Hard reset of ADC peripherals
226              using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
227         (++) ADC clock disable
228              using the equivalent macro/functions as configuration step.
229              (+++) Example:
230                    Into HAL_ADC_MspDeInit() (recommended code location) or with
231                    other device clock parameters configuration:
232                (+++) HAL_RCC_GetOscConfig(&RCC_OscInitStructure);
233                (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;
234                (+++) RCC_OscInitStructure.HSIState = RCC_HSI_OFF; (if not used for system clock)
235                (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
236 
237     (#) ADC pins configuration
238          (++) Disable the clock for the ADC GPIOs
239               using macro __HAL_RCC_GPIOx_CLK_DISABLE()
240 
241     (#) Optionally, in case of usage of ADC with interruptions:
242          (++) Disable the NVIC for ADC
243               using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
244 
245     (#) Optionally, in case of usage of DMA:
246          (++) Deinitialize the DMA
247               using function HAL_DMA_Init().
248          (++) Disable the NVIC for DMA
249               using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
250 
251     [..]
252 
253     *** Callback registration ***
254     =============================================
255     [..]
256 
257      The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
258      allows the user to configure dynamically the driver callbacks.
259      Use Functions @ref HAL_ADC_RegisterCallback()
260      to register an interrupt callback.
261     [..]
262 
263      Function @ref HAL_ADC_RegisterCallback() allows to register following callbacks:
264        (+) ConvCpltCallback               : ADC conversion complete callback
265        (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
266        (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
267        (+) ErrorCallback                  : ADC error callback
268        (+) InjectedConvCpltCallback       : ADC group injected conversion complete callback
269        (+) MspInitCallback                : ADC Msp Init callback
270        (+) MspDeInitCallback              : ADC Msp DeInit callback
271      This function takes as parameters the HAL peripheral handle, the Callback ID
272      and a pointer to the user callback function.
273     [..]
274 
275      Use function @ref HAL_ADC_UnRegisterCallback to reset a callback to the default
276      weak function.
277     [..]
278 
279      @ref HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
280      and the Callback ID.
281      This function allows to reset following callbacks:
282        (+) ConvCpltCallback               : ADC conversion complete callback
283        (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
284        (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
285        (+) ErrorCallback                  : ADC error callback
286        (+) InjectedConvCpltCallback       : ADC group injected conversion complete callback
287        (+) MspInitCallback                : ADC Msp Init callback
288        (+) MspDeInitCallback              : ADC Msp DeInit callback
289      [..]
290 
291      By default, after the @ref HAL_ADC_Init() and when the state is @ref HAL_ADC_STATE_RESET
292      all callbacks are set to the corresponding weak functions:
293      examples @ref HAL_ADC_ConvCpltCallback(), @ref HAL_ADC_ErrorCallback().
294      Exception done for MspInit and MspDeInit functions that are
295      reset to the legacy weak functions in the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit() only when
296      these callbacks are null (not registered beforehand).
297     [..]
298 
299      If MspInit or MspDeInit are not null, the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit()
300      keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
301      [..]
302 
303      Callbacks can be registered/unregistered in @ref HAL_ADC_STATE_READY state only.
304      Exception done MspInit/MspDeInit functions that can be registered/unregistered
305      in @ref HAL_ADC_STATE_READY or @ref HAL_ADC_STATE_RESET state,
306      thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
307     [..]
308 
309      Then, the user first registers the MspInit/MspDeInit user callbacks
310      using @ref HAL_ADC_RegisterCallback() before calling @ref HAL_ADC_DeInit()
311      or @ref HAL_ADC_Init() function.
312      [..]
313 
314      When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
315      not defined, the callback registration feature is not available and all callbacks
316      are set to the corresponding weak functions.
317 
318   @endverbatim
319   ******************************************************************************
320   * @attention
321   *
322   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
323   * All rights reserved.</center></h2>
324   *
325   * This software component is licensed by ST under BSD 3-Clause license,
326   * the "License"; You may not use this file except in compliance with the
327   * License. You may obtain a copy of the License at:
328   *                        opensource.org/licenses/BSD-3-Clause
329   *
330   ******************************************************************************
331   */
332 
333 /* Includes ------------------------------------------------------------------*/
334 #include "stm32l1xx_hal.h"
335 
336 /** @addtogroup STM32L1xx_HAL_Driver
337   * @{
338   */
339 
340 /** @defgroup ADC ADC
341   * @brief ADC HAL module driver
342   * @{
343   */
344 
345 #ifdef HAL_ADC_MODULE_ENABLED
346 
347 /* Private typedef -----------------------------------------------------------*/
348 /* Private define ------------------------------------------------------------*/
349 /** @defgroup ADC_Private_Constants ADC Private Constants
350   * @{
351   */
352 
353   /* Timeout values for ADC enable and disable settling time.                 */
354   /* Values defined to be higher than worst cases: low clocks freq,           */
355   /* maximum prescaler.                                                       */
356   /* Ex of profile low frequency : Clock source at 0.1 MHz, ADC clock         */
357   /* prescaler 4, sampling time 7.5 ADC clock cycles, resolution 12 bits.     */
358   /* Unit: ms                                                                 */
359   #define ADC_ENABLE_TIMEOUT              (2U)
360   #define ADC_DISABLE_TIMEOUT             (2U)
361 
362   /* Delay for ADC stabilization time.                                        */
363   /* Maximum delay is 1us (refer to device datasheet, parameter tSTAB).       */
364   /* Unit: us                                                                 */
365   #define ADC_STAB_DELAY_US               (3U)
366 
367   /* Delay for temperature sensor stabilization time.                         */
368   /* Maximum delay is 10us (refer to device datasheet, parameter tSTART).     */
369   /* Unit: us                                                                 */
370   #define ADC_TEMPSENSOR_DELAY_US         (10U)
371 
372 /**
373   * @}
374   */
375 
376 /* Private macro -------------------------------------------------------------*/
377 /* Private variables ---------------------------------------------------------*/
378 /* Private function prototypes -----------------------------------------------*/
379 /** @defgroup ADC_Private_Functions ADC Private Functions
380   * @{
381   */
382 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
383 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
384 static void ADC_DMAError(DMA_HandleTypeDef *hdma);
385 /**
386   * @}
387   */
388 
389 /* Exported functions --------------------------------------------------------*/
390 
391 /** @defgroup ADC_Exported_Functions ADC Exported Functions
392   * @{
393   */
394 
395 /** @defgroup ADC_Exported_Functions_Group1 ADC Initialization/de-initialization functions
396   * @brief    ADC Initialization and Configuration functions
397   *
398 @verbatim
399  ===============================================================================
400               ##### Initialization and de-initialization functions #####
401  ===============================================================================
402     [..]  This section provides functions allowing to:
403       (+) Initialize and configure the ADC.
404       (+) De-initialize the ADC.
405 @endverbatim
406   * @{
407   */
408 
409 /**
410   * @brief  Initializes the ADC peripheral and regular group according to
411   *         parameters specified in structure "ADC_InitTypeDef".
412   * @note   As prerequisite, ADC clock must be configured at RCC top level
413   *         (clock source APB2).
414   *         See commented example code below that can be copied and uncommented
415   *         into HAL_ADC_MspInit().
416   * @note   Possibility to update parameters on the fly:
417   *         This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
418   *         coming from ADC state reset. Following calls to this function can
419   *         be used to reconfigure some parameters of ADC_InitTypeDef
420   *         structure on the fly, without modifying MSP configuration. If ADC
421   *         MSP has to be modified again, HAL_ADC_DeInit() must be called
422   *         before HAL_ADC_Init().
423   *         The setting of these parameters is conditioned to ADC state.
424   *         For parameters constraints, see comments of structure
425   *         "ADC_InitTypeDef".
426   * @note   This function configures the ADC within 2 scopes: scope of entire
427   *         ADC and scope of regular group. For parameters details, see comments
428   *         of structure "ADC_InitTypeDef".
429   * @param  hadc ADC handle
430   * @retval HAL status
431   */
HAL_ADC_Init(ADC_HandleTypeDef * hadc)432 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
433 {
434   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
435   uint32_t tmp_cr1 = 0;
436   uint32_t tmp_cr2 = 0;
437 
438   /* Check ADC handle */
439   if(hadc == NULL)
440   {
441     return HAL_ERROR;
442   }
443 
444   /* Check the parameters */
445   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
446   assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
447   assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
448   assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
449   assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
450   assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
451   assert_param(IS_ADC_AUTOWAIT(hadc->Init.LowPowerAutoWait));
452   assert_param(IS_ADC_AUTOPOWEROFF(hadc->Init.LowPowerAutoPowerOff));
453   assert_param(IS_ADC_CHANNELSBANK(hadc->Init.ChannelsBank));
454   assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
455   assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
456   assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
457 
458   if(hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
459   {
460     assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
461     assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
462     if(hadc->Init.DiscontinuousConvMode != DISABLE)
463     {
464       assert_param(IS_ADC_REGULAR_DISCONT_NUMBER(hadc->Init.NbrOfDiscConversion));
465     }
466   }
467 
468   if(hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
469   {
470     assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
471   }
472 
473 
474   /* As prerequisite, into HAL_ADC_MspInit(), ADC clock must be configured    */
475   /* at RCC top level.                                                        */
476   /* Refer to header of this file for more details on clock enabling          */
477   /* procedure.                                                               */
478 
479   /* Actions performed only if ADC is coming from state reset:                */
480   /* - Initialization of ADC MSP                                              */
481   if (hadc->State == HAL_ADC_STATE_RESET)
482   {
483     /* Initialize ADC error code */
484     ADC_CLEAR_ERRORCODE(hadc);
485 
486     /* Allocate lock resource and initialize it */
487     hadc->Lock = HAL_UNLOCKED;
488 
489     /* Enable SYSCFG clock to control the routing Interface (RI) */
490     __HAL_RCC_SYSCFG_CLK_ENABLE();
491 
492 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
493     /* Init the ADC Callback settings */
494     hadc->ConvCpltCallback              = HAL_ADC_ConvCpltCallback;                 /* Legacy weak callback */
495     hadc->ConvHalfCpltCallback          = HAL_ADC_ConvHalfCpltCallback;             /* Legacy weak callback */
496     hadc->LevelOutOfWindowCallback      = HAL_ADC_LevelOutOfWindowCallback;         /* Legacy weak callback */
497     hadc->ErrorCallback                 = HAL_ADC_ErrorCallback;                    /* Legacy weak callback */
498     hadc->InjectedConvCpltCallback      = HAL_ADCEx_InjectedConvCpltCallback;       /* Legacy weak callback */
499 
500     if (hadc->MspInitCallback == NULL)
501     {
502       hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit  */
503     }
504 
505     /* Init the low level hardware */
506     hadc->MspInitCallback(hadc);
507 #else
508     /* Init the low level hardware */
509     HAL_ADC_MspInit(hadc);
510 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
511   }
512 
513   /* Configuration of ADC parameters if previous preliminary actions are      */
514   /* correctly completed.                                                     */
515   if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
516   {
517     /* Set ADC state */
518     ADC_STATE_CLR_SET(hadc->State,
519                       HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
520                       HAL_ADC_STATE_BUSY_INTERNAL);
521 
522     /* Set ADC parameters */
523 
524     /* Configuration of common ADC clock: clock source HSI with selectable    */
525     /* prescaler                                                              */
526     MODIFY_REG(ADC->CCR                 ,
527                ADC_CCR_ADCPRE           ,
528                hadc->Init.ClockPrescaler );
529 
530     /* Configuration of ADC:                                                  */
531     /*  - external trigger polarity                                           */
532     /*  - End of conversion selection                                         */
533     /*  - DMA continuous request                                              */
534     /*  - Channels bank (Banks availability depends on devices categories)    */
535     /*  - continuous conversion mode                                          */
536     tmp_cr2 |= (hadc->Init.DataAlign                                           |
537                 hadc->Init.EOCSelection                                        |
538                 ADC_CR2_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests) |
539                 hadc->Init.ChannelsBank                                        |
540                 ADC_CR2_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode)     );
541 
542     /* Enable external trigger if trigger selection is different of software  */
543     /* start.                                                                 */
544     /* Note: This configuration keeps the hardware feature of parameter       */
545     /*       ExternalTrigConvEdge "trigger edge none" equivalent to           */
546     /*       software start.                                                  */
547     if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
548     {
549       tmp_cr2 |= ( hadc->Init.ExternalTrigConv    |
550                   hadc->Init.ExternalTrigConvEdge );
551     }
552 
553     /* Parameters update conditioned to ADC state:                            */
554     /* Parameters that can be updated only when ADC is disabled:              */
555     /*  - delay selection (LowPowerAutoWait mode)                             */
556     /*  - resolution                                                          */
557     /*  - auto power off (LowPowerAutoPowerOff mode)                          */
558     /*  - scan mode                                                           */
559     /*  - discontinuous mode disable/enable                                   */
560     /*  - discontinuous mode number of conversions                            */
561     if ((ADC_IS_ENABLE(hadc) == RESET))
562     {
563       tmp_cr2 |= hadc->Init.LowPowerAutoWait;
564 
565       tmp_cr1 |= (hadc->Init.Resolution                     |
566                   hadc->Init.LowPowerAutoPowerOff           |
567                   ADC_CR1_SCAN_SET(hadc->Init.ScanConvMode)  );
568 
569       /* Enable discontinuous mode only if continuous mode is disabled */
570       /* Note: If parameter "Init.ScanConvMode" is set to disable, parameter  */
571       /*       discontinuous is set anyway, but has no effect on ADC HW.      */
572       if (hadc->Init.DiscontinuousConvMode == ENABLE)
573       {
574         if (hadc->Init.ContinuousConvMode == DISABLE)
575         {
576           /* Enable the selected ADC regular discontinuous mode */
577           /* Set the number of channels to be converted in discontinuous mode */
578           SET_BIT(tmp_cr1, ADC_CR1_DISCEN                                            |
579                            ADC_CR1_DISCONTINUOUS_NUM(hadc->Init.NbrOfDiscConversion)  );
580         }
581         else
582         {
583           /* ADC regular group settings continuous and sequencer discontinuous*/
584           /* cannot be enabled simultaneously.                                */
585 
586           /* Update ADC state machine to error */
587           SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
588 
589           /* Set ADC error code to ADC IP internal error */
590           SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
591         }
592       }
593 
594       /* Update ADC configuration register CR1 with previous settings */
595         MODIFY_REG(hadc->Instance->CR1,
596                    ADC_CR1_RES     |
597                    ADC_CR1_PDI     |
598                    ADC_CR1_PDD     |
599                    ADC_CR1_DISCNUM |
600                    ADC_CR1_DISCEN  |
601                    ADC_CR1_SCAN     ,
602                    tmp_cr1           );
603     }
604 
605     /* Update ADC configuration register CR2 with previous settings */
606     MODIFY_REG(hadc->Instance->CR2    ,
607                ADC_CR2_MASK_ADCINIT() ,
608                tmp_cr2                 );
609 
610     /* Configuration of regular group sequencer:                              */
611     /* - if scan mode is disabled, regular channels sequence length is set to */
612     /*   0x00: 1 channel converted (channel on regular rank 1)                */
613     /*   Parameter "NbrOfConversion" is discarded.                            */
614     /*   Note: Scan mode is present by hardware on this device and, if        */
615     /*   disabled, discards automatically nb of conversions. Anyway, nb of    */
616     /*   conversions is forced to 0x00 for alignment over all STM32 devices.  */
617     /* - if scan mode is enabled, regular channels sequence length is set to  */
618     /*   parameter "NbrOfConversion"                                          */
619     if (ADC_CR1_SCAN_SET(hadc->Init.ScanConvMode) == ADC_SCAN_ENABLE)
620     {
621       MODIFY_REG(hadc->Instance->SQR1                         ,
622                  ADC_SQR1_L                                   ,
623                  ADC_SQR1_L_SHIFT(hadc->Init.NbrOfConversion)  );
624     }
625     else
626     {
627       MODIFY_REG(hadc->Instance->SQR1,
628                  ADC_SQR1_L          ,
629                  0x00000000           );
630     }
631 
632     /* Check back that ADC registers have effectively been configured to      */
633     /* ensure of no potential problem of ADC core IP clocking.                */
634     /* Check through register CR2 (excluding execution control bits ADON,     */
635     /* JSWSTART, SWSTART and injected trigger bits JEXTEN and JEXTSEL).       */
636     if ((READ_REG(hadc->Instance->CR2) & ~(ADC_CR2_ADON |
637                                            ADC_CR2_SWSTART | ADC_CR2_JSWSTART |
638                                            ADC_CR2_JEXTEN  | ADC_CR2_JEXTSEL   ))
639          == tmp_cr2)
640     {
641       /* Set ADC error code to none */
642       ADC_CLEAR_ERRORCODE(hadc);
643 
644       /* Set the ADC state */
645       ADC_STATE_CLR_SET(hadc->State,
646                         HAL_ADC_STATE_BUSY_INTERNAL,
647                         HAL_ADC_STATE_READY);
648     }
649     else
650     {
651       /* Update ADC state machine to error */
652       ADC_STATE_CLR_SET(hadc->State,
653                         HAL_ADC_STATE_BUSY_INTERNAL,
654                         HAL_ADC_STATE_ERROR_INTERNAL);
655 
656       /* Set ADC error code to ADC IP internal error */
657       SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
658 
659       tmp_hal_status = HAL_ERROR;
660     }
661 
662   }
663   else
664   {
665     tmp_hal_status = HAL_ERROR;
666   }
667 
668   /* Return function status */
669   return tmp_hal_status;
670 }
671 
672 /**
673   * @brief  Deinitialize the ADC peripheral registers to its default reset values.
674   * @note   To not impact other ADCs, reset of common ADC registers have been
675   *         left commented below.
676   *         If needed, the example code can be copied and uncommented into
677   *         function HAL_ADC_MspDeInit().
678   * @param  hadc ADC handle
679   * @retval HAL status
680   */
HAL_ADC_DeInit(ADC_HandleTypeDef * hadc)681 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc)
682 {
683   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
684 
685   /* Check ADC handle */
686   if(hadc == NULL)
687   {
688     return HAL_ERROR;
689   }
690 
691   /* Check the parameters */
692   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
693 
694   /* Set ADC state */
695   SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
696 
697   /* Stop potential conversion on going, on regular and injected groups */
698   /* Disable ADC peripheral */
699   tmp_hal_status = ADC_ConversionStop_Disable(hadc);
700 
701 
702   /* Configuration of ADC parameters if previous preliminary actions are      */
703   /* correctly completed.                                                     */
704   if (tmp_hal_status == HAL_OK)
705   {
706     /* ========== Reset ADC registers ========== */
707     /* Reset register SR */
708     __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD | ADC_FLAG_JEOC | ADC_FLAG_EOC |
709                                 ADC_FLAG_JSTRT | ADC_FLAG_STRT));
710 
711     /* Reset register CR1 */
712     CLEAR_BIT(hadc->Instance->CR1, (ADC_CR1_OVRIE   | ADC_CR1_RES     | ADC_CR1_AWDEN  |
713                                     ADC_CR1_JAWDEN  | ADC_CR1_PDI     | ADC_CR1_PDD    |
714                                     ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN |
715                                     ADC_CR1_JAUTO   | ADC_CR1_AWDSGL  | ADC_CR1_SCAN   |
716                                     ADC_CR1_JEOCIE  | ADC_CR1_AWDIE   | ADC_CR1_EOCIE  |
717                                     ADC_CR1_AWDCH                                       ));
718 
719     /* Reset register CR2 */
720     ADC_CR2_CLEAR(hadc);
721 
722     /* Reset register SMPR0 */
723     ADC_SMPR0_CLEAR(hadc);
724 
725     /* Reset register SMPR1 */
726     ADC_SMPR1_CLEAR(hadc);
727 
728     /* Reset register SMPR2 */
729     CLEAR_BIT(hadc->Instance->SMPR2, (ADC_SMPR2_SMP19 | ADC_SMPR2_SMP18 | ADC_SMPR2_SMP17 |
730                                       ADC_SMPR2_SMP16 | ADC_SMPR2_SMP15 | ADC_SMPR2_SMP14 |
731                                       ADC_SMPR2_SMP13 | ADC_SMPR2_SMP12 | ADC_SMPR2_SMP11 |
732                                       ADC_SMPR2_SMP10                                      ));
733 
734     /* Reset register SMPR3 */
735     CLEAR_BIT(hadc->Instance->SMPR3, (ADC_SMPR3_SMP9 | ADC_SMPR3_SMP8 | ADC_SMPR3_SMP7 |
736                                       ADC_SMPR3_SMP6 | ADC_SMPR3_SMP5 | ADC_SMPR3_SMP4 |
737                                       ADC_SMPR3_SMP3 | ADC_SMPR3_SMP2 | ADC_SMPR3_SMP1 |
738                                       ADC_SMPR3_SMP0                                    ));
739 
740     /* Reset register JOFR1 */
741     CLEAR_BIT(hadc->Instance->JOFR1, ADC_JOFR1_JOFFSET1);
742     /* Reset register JOFR2 */
743     CLEAR_BIT(hadc->Instance->JOFR2, ADC_JOFR2_JOFFSET2);
744     /* Reset register JOFR3 */
745     CLEAR_BIT(hadc->Instance->JOFR3, ADC_JOFR3_JOFFSET3);
746     /* Reset register JOFR4 */
747     CLEAR_BIT(hadc->Instance->JOFR4, ADC_JOFR4_JOFFSET4);
748 
749     /* Reset register HTR */
750     CLEAR_BIT(hadc->Instance->HTR, ADC_HTR_HT);
751     /* Reset register LTR */
752     CLEAR_BIT(hadc->Instance->LTR, ADC_LTR_LT);
753 
754     /* Reset register SQR1 */
755     CLEAR_BIT(hadc->Instance->SQR1, (ADC_SQR1_L | __ADC_SQR1_SQXX));
756 
757     /* Reset register SQR2 */
758     CLEAR_BIT(hadc->Instance->SQR2, (ADC_SQR2_SQ24 | ADC_SQR2_SQ23 | ADC_SQR2_SQ22 |
759                                      ADC_SQR2_SQ21 | ADC_SQR2_SQ20 | ADC_SQR2_SQ19  ));
760 
761     /* Reset register SQR3 */
762     CLEAR_BIT(hadc->Instance->SQR3, (ADC_SQR3_SQ18 | ADC_SQR3_SQ17 | ADC_SQR3_SQ16 |
763                                      ADC_SQR3_SQ15 | ADC_SQR3_SQ14 | ADC_SQR3_SQ13  ));
764 
765     /* Reset register SQR4 */
766     CLEAR_BIT(hadc->Instance->SQR4, (ADC_SQR4_SQ12 | ADC_SQR4_SQ11 | ADC_SQR4_SQ10 |
767                                      ADC_SQR4_SQ9  | ADC_SQR4_SQ8  | ADC_SQR4_SQ7   ));
768 
769     /* Reset register SQR5 */
770     CLEAR_BIT(hadc->Instance->SQR5, (ADC_SQR5_SQ6 | ADC_SQR5_SQ5 | ADC_SQR5_SQ4 |
771                                      ADC_SQR5_SQ3 | ADC_SQR5_SQ2 | ADC_SQR5_SQ1  ));
772 
773 
774     /* Reset register JSQR */
775     CLEAR_BIT(hadc->Instance->JSQR, (ADC_JSQR_JL |
776                                      ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3 |
777                                      ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1  ));
778 
779     /* Reset register DR */
780     /* bits in access mode read only, no direct reset applicable*/
781 
782     /* Reset registers JDR1, JDR2, JDR3, JDR4 */
783     /* bits in access mode read only, no direct reset applicable*/
784 
785     /* Reset register CCR */
786     CLEAR_BIT(ADC->CCR, ADC_CCR_TSVREFE);
787 
788     /* ========== Hard reset ADC peripheral ========== */
789     /* Performs a global reset of the entire ADC peripheral: ADC state is     */
790     /* forced to a similar state after device power-on.                       */
791     /* If needed, copy-paste and uncomment the following reset code into      */
792     /* function "void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)":              */
793     /*                                                                        */
794     /*  __HAL_RCC_ADC1_FORCE_RESET()                                          */
795     /*  __HAL_RCC_ADC1_RELEASE_RESET()                                        */
796 
797 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
798     if (hadc->MspDeInitCallback == NULL)
799     {
800       hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit  */
801     }
802 
803     /* DeInit the low level hardware */
804     hadc->MspDeInitCallback(hadc);
805 #else
806     /* DeInit the low level hardware */
807     HAL_ADC_MspDeInit(hadc);
808 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
809 
810     /* Set ADC error code to none */
811     ADC_CLEAR_ERRORCODE(hadc);
812 
813     /* Set ADC state */
814     hadc->State = HAL_ADC_STATE_RESET;
815 
816   }
817 
818   /* Process unlocked */
819   __HAL_UNLOCK(hadc);
820 
821   /* Return function status */
822   return tmp_hal_status;
823 }
824 
825 /**
826   * @brief  Initializes the ADC MSP.
827   * @param  hadc ADC handle
828   * @retval None
829   */
HAL_ADC_MspInit(ADC_HandleTypeDef * hadc)830 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
831 {
832   /* Prevent unused argument(s) compilation warning */
833   UNUSED(hadc);
834 
835   /* NOTE : This function should not be modified. When the callback is needed,
836             function HAL_ADC_MspInit must be implemented in the user file.
837    */
838 }
839 
840 /**
841   * @brief  DeInitializes the ADC MSP.
842   * @param  hadc ADC handle
843   * @retval None
844   */
HAL_ADC_MspDeInit(ADC_HandleTypeDef * hadc)845 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
846 {
847   /* Prevent unused argument(s) compilation warning */
848   UNUSED(hadc);
849 
850   /* NOTE : This function should not be modified. When the callback is needed,
851             function HAL_ADC_MspDeInit must be implemented in the user file.
852    */
853 }
854 
855 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
856 /**
857   * @brief  Register a User ADC Callback
858   *         To be used instead of the weak predefined callback
859   * @param  hadc Pointer to a ADC_HandleTypeDef structure that contains
860   *                the configuration information for the specified ADC.
861   * @param  CallbackID ID of the callback to be registered
862   *         This parameter can be one of the following values:
863   *          @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID      ADC conversion complete callback ID
864   *          @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID          ADC conversion complete callback ID
865   *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID    ADC analog watchdog 1 callback ID
866   *          @arg @ref HAL_ADC_ERROR_CB_ID                    ADC error callback ID
867   *          @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID  ADC group injected conversion complete callback ID
868   *          @arg @ref HAL_ADC_MSPINIT_CB_ID                  ADC Msp Init callback ID
869   *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID                ADC Msp DeInit callback ID
870   *          @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
871   *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
872   * @param  pCallback pointer to the Callback function
873   * @retval HAL status
874   */
HAL_ADC_RegisterCallback(ADC_HandleTypeDef * hadc,HAL_ADC_CallbackIDTypeDef CallbackID,pADC_CallbackTypeDef pCallback)875 HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback)
876 {
877   HAL_StatusTypeDef status = HAL_OK;
878 
879   if (pCallback == NULL)
880   {
881     /* Update the error code */
882     hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
883 
884     return HAL_ERROR;
885   }
886 
887   if ((hadc->State & HAL_ADC_STATE_READY) != 0)
888   {
889     switch (CallbackID)
890     {
891       case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
892         hadc->ConvCpltCallback = pCallback;
893         break;
894 
895       case HAL_ADC_CONVERSION_HALF_CB_ID :
896         hadc->ConvHalfCpltCallback = pCallback;
897         break;
898 
899       case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
900         hadc->LevelOutOfWindowCallback = pCallback;
901         break;
902 
903       case HAL_ADC_ERROR_CB_ID :
904         hadc->ErrorCallback = pCallback;
905         break;
906 
907       case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
908         hadc->InjectedConvCpltCallback = pCallback;
909         break;
910 
911       case HAL_ADC_MSPINIT_CB_ID :
912         hadc->MspInitCallback = pCallback;
913         break;
914 
915       case HAL_ADC_MSPDEINIT_CB_ID :
916         hadc->MspDeInitCallback = pCallback;
917         break;
918 
919       default :
920         /* Update the error code */
921         hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
922 
923         /* Return error status */
924         status = HAL_ERROR;
925         break;
926     }
927   }
928   else if (HAL_ADC_STATE_RESET == hadc->State)
929   {
930     switch (CallbackID)
931     {
932       case HAL_ADC_MSPINIT_CB_ID :
933         hadc->MspInitCallback = pCallback;
934         break;
935 
936       case HAL_ADC_MSPDEINIT_CB_ID :
937         hadc->MspDeInitCallback = pCallback;
938         break;
939 
940       default :
941         /* Update the error code */
942         hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
943 
944         /* Return error status */
945         status = HAL_ERROR;
946         break;
947     }
948   }
949   else
950   {
951     /* Update the error code */
952     hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
953 
954     /* Return error status */
955     status =  HAL_ERROR;
956   }
957 
958   return status;
959 }
960 
961 /**
962   * @brief  Unregister a ADC Callback
963   *         ADC callback is redirected to the weak predefined callback
964   * @param  hadc Pointer to a ADC_HandleTypeDef structure that contains
965   *                the configuration information for the specified ADC.
966   * @param  CallbackID ID of the callback to be unregistered
967   *         This parameter can be one of the following values:
968   *          @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID      ADC conversion complete callback ID
969   *          @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID          ADC conversion complete callback ID
970   *          @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID    ADC analog watchdog 1 callback ID
971   *          @arg @ref HAL_ADC_ERROR_CB_ID                    ADC error callback ID
972   *          @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID  ADC group injected conversion complete callback ID
973   *          @arg @ref HAL_ADC_MSPINIT_CB_ID                  ADC Msp Init callback ID
974   *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID                ADC Msp DeInit callback ID
975   *          @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
976   *          @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
977   * @retval HAL status
978   */
HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef * hadc,HAL_ADC_CallbackIDTypeDef CallbackID)979 HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID)
980 {
981   HAL_StatusTypeDef status = HAL_OK;
982 
983   if ((hadc->State & HAL_ADC_STATE_READY) != 0)
984   {
985     switch (CallbackID)
986     {
987       case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
988         hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback;
989         break;
990 
991       case HAL_ADC_CONVERSION_HALF_CB_ID :
992         hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback;
993         break;
994 
995       case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
996         hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback;
997         break;
998 
999       case HAL_ADC_ERROR_CB_ID :
1000         hadc->ErrorCallback = HAL_ADC_ErrorCallback;
1001         break;
1002 
1003       case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
1004         hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback;
1005         break;
1006 
1007       case HAL_ADC_MSPINIT_CB_ID :
1008         hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit              */
1009         break;
1010 
1011       case HAL_ADC_MSPDEINIT_CB_ID :
1012         hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit            */
1013         break;
1014 
1015       default :
1016         /* Update the error code */
1017         hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1018 
1019         /* Return error status */
1020         status =  HAL_ERROR;
1021         break;
1022     }
1023   }
1024   else if (HAL_ADC_STATE_RESET == hadc->State)
1025   {
1026     switch (CallbackID)
1027     {
1028       case HAL_ADC_MSPINIT_CB_ID :
1029         hadc->MspInitCallback = HAL_ADC_MspInit;                   /* Legacy weak MspInit              */
1030         break;
1031 
1032       case HAL_ADC_MSPDEINIT_CB_ID :
1033         hadc->MspDeInitCallback = HAL_ADC_MspDeInit;               /* Legacy weak MspDeInit            */
1034         break;
1035 
1036       default :
1037         /* Update the error code */
1038         hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1039 
1040         /* Return error status */
1041         status =  HAL_ERROR;
1042         break;
1043     }
1044   }
1045   else
1046   {
1047     /* Update the error code */
1048     hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1049 
1050     /* Return error status */
1051     status =  HAL_ERROR;
1052   }
1053 
1054   return status;
1055 }
1056 
1057 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1058 
1059 /**
1060   * @}
1061   */
1062 
1063 /** @defgroup ADC_Exported_Functions_Group2 ADC Input and Output operation functions
1064  *  @brief    ADC IO operation functions
1065  *
1066 @verbatim
1067  ===============================================================================
1068                       ##### IO operation functions #####
1069  ===============================================================================
1070     [..]  This section provides functions allowing to:
1071       (+) Start conversion of regular group.
1072       (+) Stop conversion of regular group.
1073       (+) Poll for conversion complete on regular group.
1074       (+) Poll for conversion event.
1075       (+) Get result of regular channel conversion.
1076       (+) Start conversion of regular group and enable interruptions.
1077       (+) Stop conversion of regular group and disable interruptions.
1078       (+) Handle ADC interrupt request
1079       (+) Start conversion of regular group and enable DMA transfer.
1080       (+) Stop conversion of regular group and disable ADC DMA transfer.
1081 @endverbatim
1082   * @{
1083   */
1084 
1085 /**
1086   * @brief  Enables ADC, starts conversion of regular group.
1087   *         Interruptions enabled in this function: None.
1088   * @param  hadc ADC handle
1089   * @retval HAL status
1090   */
HAL_ADC_Start(ADC_HandleTypeDef * hadc)1091 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
1092 {
1093   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1094 
1095   /* Check the parameters */
1096   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1097 
1098   /* Process locked */
1099   __HAL_LOCK(hadc);
1100 
1101   /* Enable the ADC peripheral */
1102   tmp_hal_status = ADC_Enable(hadc);
1103 
1104   /* Start conversion if ADC is effectively enabled */
1105   if (tmp_hal_status == HAL_OK)
1106   {
1107     /* Set ADC state                                                          */
1108     /* - Clear state bitfield related to regular group conversion results     */
1109     /* - Set state bitfield related to regular group operation                */
1110     ADC_STATE_CLR_SET(hadc->State,
1111                       HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
1112                       HAL_ADC_STATE_REG_BUSY);
1113 
1114     /* If conversions on group regular are also triggering group injected,    */
1115     /* update ADC state.                                                      */
1116     if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET)
1117     {
1118       ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1119     }
1120 
1121     /* State machine update: Check if an injected conversion is ongoing */
1122     if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1123     {
1124       /* Reset ADC error code fields related to conversions on group regular */
1125       CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
1126     }
1127     else
1128     {
1129       /* Reset ADC all error code fields */
1130       ADC_CLEAR_ERRORCODE(hadc);
1131     }
1132 
1133     /* Process unlocked */
1134     /* Unlock before starting ADC conversions: in case of potential           */
1135     /* interruption, to let the process to ADC IRQ Handler.                   */
1136     __HAL_UNLOCK(hadc);
1137 
1138     /* Clear regular group conversion flag and overrun flag */
1139     /* (To ensure of no unknown state from potential previous ADC operations) */
1140     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR);
1141 
1142     /* Enable conversion of regular group.                                    */
1143     /* If software start has been selected, conversion starts immediately.    */
1144     /* If external trigger has been selected, conversion will start at next   */
1145     /* trigger event.                                                         */
1146     if (ADC_IS_SOFTWARE_START_REGULAR(hadc))
1147     {
1148       /* Start ADC conversion on regular group */
1149       SET_BIT(hadc->Instance->CR2, ADC_CR2_SWSTART);
1150     }
1151   }
1152 
1153   /* Return function status */
1154   return tmp_hal_status;
1155 }
1156 
1157 /**
1158   * @brief  Stop ADC conversion of regular group (and injected channels in
1159   *         case of auto_injection mode), disable ADC peripheral.
1160   * @note:  ADC peripheral disable is forcing stop of potential
1161   *         conversion on injected group. If injected group is under use, it
1162   *         should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
1163   * @param  hadc ADC handle
1164   * @retval HAL status.
1165   */
HAL_ADC_Stop(ADC_HandleTypeDef * hadc)1166 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
1167 {
1168   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1169 
1170   /* Check the parameters */
1171   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1172 
1173   /* Process locked */
1174   __HAL_LOCK(hadc);
1175 
1176   /* Stop potential conversion on going, on regular and injected groups */
1177   /* Disable ADC peripheral */
1178   tmp_hal_status = ADC_ConversionStop_Disable(hadc);
1179 
1180   /* Check if ADC is effectively disabled */
1181   if (tmp_hal_status == HAL_OK)
1182   {
1183     /* Set ADC state */
1184     ADC_STATE_CLR_SET(hadc->State,
1185                       HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
1186                       HAL_ADC_STATE_READY);
1187   }
1188 
1189   /* Process unlocked */
1190   __HAL_UNLOCK(hadc);
1191 
1192   /* Return function status */
1193   return tmp_hal_status;
1194 }
1195 
1196 /**
1197   * @brief  Wait for regular group conversion to be completed.
1198   * @note   ADC conversion flags EOS (end of sequence) and EOC (end of
1199   *         conversion) are cleared by this function, with an exception:
1200   *         if low power feature "LowPowerAutoWait" is enabled, flags are
1201   *         not cleared to not interfere with this feature until data register
1202   *         is read using function HAL_ADC_GetValue().
1203   * @note   This function cannot be used in a particular setup: ADC configured
1204   *         in DMA mode and polling for end of each conversion (ADC init
1205   *         parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
1206   *         In this case, DMA resets the flag EOC and polling cannot be
1207   *         performed on each conversion. Nevertheless, polling can still
1208   *         be performed on the complete sequence (ADC init
1209   *         parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
1210   * @param  hadc ADC handle
1211   * @param  Timeout Timeout value in millisecond.
1212   * @retval HAL status
1213   */
HAL_ADC_PollForConversion(ADC_HandleTypeDef * hadc,uint32_t Timeout)1214 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
1215 {
1216   uint32_t tickstart = 0;
1217 
1218   /* Check the parameters */
1219   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1220 
1221   /* Verification that ADC configuration is compliant with polling for      */
1222   /* each conversion:                                                       */
1223   /* Particular case is ADC configured in DMA mode and ADC sequencer with   */
1224   /* several ranks and polling for end of each conversion.                  */
1225   /* For code simplicity sake, this particular case is generalized to       */
1226   /* ADC configured in DMA mode and and polling for end of each conversion. */
1227   if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_EOCS) &&
1228       HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_DMA)    )
1229   {
1230     /* Update ADC state machine to error */
1231     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
1232 
1233     /* Process unlocked */
1234     __HAL_UNLOCK(hadc);
1235 
1236     return HAL_ERROR;
1237   }
1238 
1239   /* Get tick count */
1240   tickstart = HAL_GetTick();
1241 
1242   /* Wait until End of Conversion flag is raised */
1243   while(HAL_IS_BIT_CLR(hadc->Instance->SR, ADC_FLAG_EOC))
1244   {
1245     /* Check if timeout is disabled (set to infinite wait) */
1246     if(Timeout != HAL_MAX_DELAY)
1247     {
1248       if((Timeout == 0) || ((HAL_GetTick() - tickstart ) > Timeout))
1249       {
1250         /* New check to avoid false timeout detection in case of preemption */
1251         if(HAL_IS_BIT_CLR(hadc->Instance->SR, ADC_FLAG_EOC))
1252         {
1253           /* Update ADC state machine to timeout */
1254           SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1255 
1256           /* Process unlocked */
1257           __HAL_UNLOCK(hadc);
1258 
1259           return HAL_TIMEOUT;
1260         }
1261       }
1262     }
1263   }
1264 
1265   /* Clear end of conversion flag of regular group if low power feature     */
1266   /* "Auto Wait" is disabled, to not interfere with this feature until data */
1267   /* register is read using function HAL_ADC_GetValue().                    */
1268   if (hadc->Init.LowPowerAutoWait == DISABLE)
1269   {
1270     /* Clear regular group conversion flag */
1271     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC);
1272   }
1273 
1274   /* Update ADC state machine */
1275   SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
1276 
1277   /* Determine whether any further conversion upcoming on group regular       */
1278   /* by external trigger, continuous mode or scan sequence on going.          */
1279   /* Note: On STM32L1, there is no independent flag of end of sequence.       */
1280   /*       The test of scan sequence on going is done either with scan        */
1281   /*       sequence disabled or with end of conversion flag set to            */
1282   /*       of end of sequence.                                                */
1283   if(ADC_IS_SOFTWARE_START_REGULAR(hadc)                   &&
1284      (hadc->Init.ContinuousConvMode == DISABLE)            &&
1285      (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) ||
1286       HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)  )   )
1287   {
1288     /* Set ADC state */
1289     CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
1290 
1291     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1292     {
1293       SET_BIT(hadc->State, HAL_ADC_STATE_READY);
1294     }
1295   }
1296 
1297   /* Return ADC state */
1298   return HAL_OK;
1299 }
1300 
1301 /**
1302   * @brief  Poll for conversion event.
1303   * @param  hadc ADC handle
1304   * @param  EventType the ADC event type.
1305   *          This parameter can be one of the following values:
1306   *            @arg ADC_AWD_EVENT: ADC Analog watchdog event.
1307   *            @arg ADC_OVR_EVENT: ADC Overrun event.
1308   * @param  Timeout Timeout value in millisecond.
1309   * @retval HAL status
1310   */
HAL_ADC_PollForEvent(ADC_HandleTypeDef * hadc,uint32_t EventType,uint32_t Timeout)1311 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout)
1312 {
1313   uint32_t tickstart = 0;
1314 
1315   /* Check the parameters */
1316   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1317   assert_param(IS_ADC_EVENT_TYPE(EventType));
1318 
1319   /* Get tick count */
1320   tickstart = HAL_GetTick();
1321 
1322   /* Check selected event flag */
1323   while(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET)
1324   {
1325     /* Check if timeout is disabled (set to infinite wait) */
1326     if(Timeout != HAL_MAX_DELAY)
1327     {
1328       if((Timeout == 0) || ((HAL_GetTick() - tickstart ) > Timeout))
1329       {
1330         /* New check to avoid false timeout detection in case of preemption */
1331         if(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET)
1332         {
1333           /* Update ADC state machine to timeout */
1334           SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1335 
1336           /* Process unlocked */
1337           __HAL_UNLOCK(hadc);
1338 
1339           return HAL_TIMEOUT;
1340         }
1341       }
1342     }
1343   }
1344 
1345   switch(EventType)
1346   {
1347   /* Analog watchdog (level out of window) event */
1348   case ADC_AWD_EVENT:
1349     /* Set ADC state */
1350     SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
1351 
1352     /* Clear ADC analog watchdog flag */
1353     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
1354     break;
1355 
1356   /* Overrun event */
1357   default: /* Case ADC_OVR_EVENT */
1358     /* Note: On STM32L1, ADC overrun can be set through other parameters      */
1359     /*       refer to description of parameter "EOCSelection" for more        */
1360     /*       details.                                                         */
1361 
1362     /* Set ADC state */
1363     SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
1364     /* Set ADC error code to overrun */
1365     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
1366 
1367     /* Clear ADC overrun flag */
1368     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1369     break;
1370   }
1371 
1372   /* Return ADC state */
1373   return HAL_OK;
1374 }
1375 
1376 /**
1377   * @brief  Enables ADC, starts conversion of regular group with interruption.
1378   *         Interruptions enabled in this function:
1379   *          - EOC (end of conversion of regular group)
1380   *          - overrun
1381   *         Each of these interruptions has its dedicated callback function.
1382   * @param  hadc ADC handle
1383   * @retval HAL status
1384   */
HAL_ADC_Start_IT(ADC_HandleTypeDef * hadc)1385 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc)
1386 {
1387   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1388 
1389   /* Check the parameters */
1390   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1391 
1392   /* Process locked */
1393   __HAL_LOCK(hadc);
1394 
1395   /* Enable the ADC peripheral */
1396   tmp_hal_status = ADC_Enable(hadc);
1397 
1398   /* Start conversion if ADC is effectively enabled */
1399   if (tmp_hal_status == HAL_OK)
1400   {
1401     /* Set ADC state                                                          */
1402     /* - Clear state bitfield related to regular group conversion results     */
1403     /* - Set state bitfield related to regular group operation                */
1404     ADC_STATE_CLR_SET(hadc->State,
1405                       HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
1406                       HAL_ADC_STATE_REG_BUSY);
1407 
1408     /* If conversions on group regular are also triggering group injected,    */
1409     /* update ADC state.                                                      */
1410     if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET)
1411     {
1412       ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1413     }
1414 
1415     /* State machine update: Check if an injected conversion is ongoing */
1416     if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1417     {
1418       /* Reset ADC error code fields related to conversions on group regular */
1419       CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
1420     }
1421     else
1422     {
1423       /* Reset ADC all error code fields */
1424       ADC_CLEAR_ERRORCODE(hadc);
1425     }
1426 
1427     /* Process unlocked */
1428     /* Unlock before starting ADC conversions: in case of potential           */
1429     /* interruption, to let the process to ADC IRQ Handler.                   */
1430     __HAL_UNLOCK(hadc);
1431 
1432     /* Clear regular group conversion flag and overrun flag */
1433     /* (To ensure of no unknown state from potential previous ADC operations) */
1434     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR);
1435 
1436     /* Enable end of conversion interrupt for regular group */
1437     __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_OVR));
1438 
1439     /* Enable conversion of regular group.                                    */
1440     /* If software start has been selected, conversion starts immediately.    */
1441     /* If external trigger has been selected, conversion will start at next   */
1442     /* trigger event.                                                         */
1443     if (ADC_IS_SOFTWARE_START_REGULAR(hadc))
1444     {
1445       /* Start ADC conversion on regular group */
1446       SET_BIT(hadc->Instance->CR2, ADC_CR2_SWSTART);
1447     }
1448   }
1449 
1450   /* Return function status */
1451   return tmp_hal_status;
1452 }
1453 
1454 /**
1455   * @brief  Stop ADC conversion of regular group (and injected group in
1456   *         case of auto_injection mode), disable interrution of
1457   *         end-of-conversion, disable ADC peripheral.
1458   * @param  hadc ADC handle
1459   * @retval None
1460   */
HAL_ADC_Stop_IT(ADC_HandleTypeDef * hadc)1461 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc)
1462 {
1463   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1464 
1465   /* Check the parameters */
1466   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1467 
1468   /* Process locked */
1469   __HAL_LOCK(hadc);
1470 
1471   /* Stop potential conversion on going, on regular and injected groups */
1472   /* Disable ADC peripheral */
1473   tmp_hal_status = ADC_ConversionStop_Disable(hadc);
1474 
1475   /* Check if ADC is effectively disabled */
1476   if (tmp_hal_status == HAL_OK)
1477   {
1478     /* Disable ADC end of conversion interrupt for regular group */
1479     __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
1480 
1481     /* Set ADC state */
1482     ADC_STATE_CLR_SET(hadc->State,
1483                       HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
1484                       HAL_ADC_STATE_READY);
1485   }
1486 
1487   /* Process unlocked */
1488   __HAL_UNLOCK(hadc);
1489 
1490   /* Return function status */
1491   return tmp_hal_status;
1492 }
1493 
1494 /**
1495   * @brief  Enables ADC, starts conversion of regular group and transfers result
1496   *         through DMA.
1497   *         Interruptions enabled in this function:
1498   *          - DMA transfer complete
1499   *          - DMA half transfer
1500   *          - overrun
1501   *         Each of these interruptions has its dedicated callback function.
1502   * @param  hadc ADC handle
1503   * @param  pData The destination Buffer address.
1504   * @param  Length The length of data to be transferred from ADC peripheral to memory.
1505   * @retval None
1506   */
HAL_ADC_Start_DMA(ADC_HandleTypeDef * hadc,uint32_t * pData,uint32_t Length)1507 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
1508 {
1509   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1510 
1511   /* Check the parameters */
1512   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1513 
1514   /* Process locked */
1515   __HAL_LOCK(hadc);
1516 
1517   /* Enable the ADC peripheral */
1518   tmp_hal_status = ADC_Enable(hadc);
1519 
1520   /* Start conversion if ADC is effectively enabled */
1521   if (tmp_hal_status == HAL_OK)
1522   {
1523     /* Set ADC state                                                          */
1524     /* - Clear state bitfield related to regular group conversion results     */
1525     /* - Set state bitfield related to regular group operation                */
1526     ADC_STATE_CLR_SET(hadc->State,
1527                       HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
1528                       HAL_ADC_STATE_REG_BUSY);
1529 
1530     /* If conversions on group regular are also triggering group injected,    */
1531     /* update ADC state.                                                      */
1532     if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET)
1533     {
1534       ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1535     }
1536 
1537     /* State machine update: Check if an injected conversion is ongoing */
1538     if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1539     {
1540       /* Reset ADC error code fields related to conversions on group regular */
1541       CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
1542     }
1543     else
1544     {
1545       /* Reset ADC all error code fields */
1546       ADC_CLEAR_ERRORCODE(hadc);
1547     }
1548 
1549     /* Process unlocked */
1550     /* Unlock before starting ADC conversions: in case of potential           */
1551     /* interruption, to let the process to ADC IRQ Handler.                   */
1552     __HAL_UNLOCK(hadc);
1553 
1554     /* Set the DMA transfer complete callback */
1555     hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
1556 
1557     /* Set the DMA half transfer complete callback */
1558     hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
1559 
1560     /* Set the DMA error callback */
1561     hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
1562 
1563 
1564     /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC     */
1565     /* start (in case of SW start):                                           */
1566 
1567     /* Clear regular group conversion flag and overrun flag */
1568     /* (To ensure of no unknown state from potential previous ADC operations) */
1569     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR);
1570 
1571     /* Enable ADC overrun interrupt */
1572     __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
1573 
1574     /* Enable ADC DMA mode */
1575     hadc->Instance->CR2 |= ADC_CR2_DMA;
1576 
1577     /* Start the DMA channel */
1578     HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
1579 
1580     /* Enable conversion of regular group.                                    */
1581     /* If software start has been selected, conversion starts immediately.    */
1582     /* If external trigger has been selected, conversion will start at next   */
1583     /* trigger event.                                                         */
1584     /* Note: Alternate trigger for single conversion could be to force an     */
1585     /*       additional set of bit ADON "hadc->Instance->CR2 |= ADC_CR2_ADON;"*/
1586     if (ADC_IS_SOFTWARE_START_REGULAR(hadc))
1587     {
1588       /* Start ADC conversion on regular group */
1589       SET_BIT(hadc->Instance->CR2, ADC_CR2_SWSTART);
1590     }
1591   }
1592 
1593   /* Return function status */
1594   return tmp_hal_status;
1595 }
1596 
1597 /**
1598   * @brief  Stop ADC conversion of regular group (and injected group in
1599   *         case of auto_injection mode), disable ADC DMA transfer, disable
1600   *         ADC peripheral.
1601   * @note:  ADC peripheral disable is forcing stop of potential
1602   *         conversion on injected group. If injected group is under use, it
1603   *         should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
1604   * @param  hadc ADC handle
1605   * @retval HAL status.
1606   */
HAL_ADC_Stop_DMA(ADC_HandleTypeDef * hadc)1607 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc)
1608 {
1609   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1610 
1611   /* Check the parameters */
1612   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1613 
1614   /* Process locked */
1615   __HAL_LOCK(hadc);
1616 
1617   /* Stop potential conversion on going, on regular and injected groups */
1618   /* Disable ADC peripheral */
1619   tmp_hal_status = ADC_ConversionStop_Disable(hadc);
1620 
1621   /* Check if ADC is effectively disabled */
1622   if (tmp_hal_status == HAL_OK)
1623   {
1624     /* Disable ADC DMA mode */
1625     hadc->Instance->CR2 &= ~ADC_CR2_DMA;
1626 
1627     /* Disable the DMA channel (in case of DMA in circular mode or stop while */
1628     /* DMA transfer is on going)                                              */
1629     if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
1630     {
1631       HAL_DMA_Abort(hadc->DMA_Handle);
1632 
1633       /* Check if DMA channel effectively disabled */
1634       if (tmp_hal_status != HAL_OK)
1635       {
1636         /* Update ADC state machine to error */
1637         SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
1638       }
1639     }
1640 
1641     /* Set ADC state */
1642     ADC_STATE_CLR_SET(hadc->State,
1643                       HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
1644                       HAL_ADC_STATE_READY);
1645 
1646     /* Disable ADC overrun interrupt */
1647     __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
1648   }
1649 
1650   /* Process unlocked */
1651   __HAL_UNLOCK(hadc);
1652 
1653   /* Return function status */
1654   return tmp_hal_status;
1655 }
1656 
1657 /**
1658   * @brief  Get ADC regular group conversion result.
1659   * @note   Reading register DR automatically clears ADC flag EOC
1660   *         (ADC group regular end of unitary conversion).
1661   * @note   This function does not clear ADC flag EOS
1662   *         (ADC group regular end of sequence conversion).
1663   *         Occurrence of flag EOS rising:
1664   *          - If sequencer is composed of 1 rank, flag EOS is equivalent
1665   *            to flag EOC.
1666   *          - If sequencer is composed of several ranks, during the scan
1667   *            sequence flag EOC only is raised, at the end of the scan sequence
1668   *            both flags EOC and EOS are raised.
1669   *         To clear this flag, either use function:
1670   *         in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
1671   *         model polling: @ref HAL_ADC_PollForConversion()
1672   *         or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
1673   * @param  hadc ADC handle
1674   * @retval ADC group regular conversion data
1675   */
HAL_ADC_GetValue(ADC_HandleTypeDef * hadc)1676 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
1677 {
1678   /* Check the parameters */
1679   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1680 
1681   /* Note: EOC flag is not cleared here by software because automatically     */
1682   /*       cleared by hardware when reading register DR.                      */
1683 
1684   /* Return ADC converted value */
1685   return hadc->Instance->DR;
1686 }
1687 
1688 /**
1689   * @brief  Handles ADC interrupt request
1690   * @param  hadc ADC handle
1691   * @retval None
1692   */
HAL_ADC_IRQHandler(ADC_HandleTypeDef * hadc)1693 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)
1694 {
1695   /* Check the parameters */
1696   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1697   assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
1698   assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
1699 
1700 
1701   /* ========== Check End of Conversion flag for regular group ========== */
1702   if(__HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOC))
1703   {
1704     if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC) )
1705     {
1706       /* Update state machine on conversion status if not in error state */
1707       if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
1708       {
1709         /* Set ADC state */
1710         SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
1711       }
1712 
1713       /* Determine whether any further conversion upcoming on group regular   */
1714       /* by external trigger, continuous mode or scan sequence on going.      */
1715       /* Note: On STM32L1, there is no independent flag of end of sequence.   */
1716       /*       The test of scan sequence on going is done either with scan    */
1717       /*       sequence disabled or with end of conversion flag set to        */
1718       /*       of end of sequence.                                            */
1719       if(ADC_IS_SOFTWARE_START_REGULAR(hadc)                   &&
1720          (hadc->Init.ContinuousConvMode == DISABLE)            &&
1721          (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) ||
1722           HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)  )   )
1723       {
1724         /* Disable ADC end of single conversion interrupt on group regular */
1725         /* Note: Overrun interrupt was enabled with EOC interrupt in          */
1726         /* HAL_ADC_Start_IT(), but is not disabled here because can be used   */
1727         /* by overrun IRQ process below.                                      */
1728         __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
1729 
1730         /* Set ADC state */
1731         CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
1732 
1733         if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1734         {
1735           SET_BIT(hadc->State, HAL_ADC_STATE_READY);
1736         }
1737       }
1738 
1739 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1740       hadc->ConvCpltCallback(hadc);
1741 #else
1742       HAL_ADC_ConvCpltCallback(hadc);
1743 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1744 
1745       /* Clear regular group conversion flag */
1746       __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC);
1747     }
1748   }
1749 
1750   /* ========== Check End of Conversion flag for injected group ========== */
1751   if(__HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_JEOC))
1752   {
1753     if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC))
1754     {
1755       /* Update state machine on conversion status if not in error state */
1756       if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
1757       {
1758         /* Set ADC state */
1759         SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC);
1760       }
1761 
1762       /* Determine whether any further conversion upcoming on group injected  */
1763       /* by external trigger, scan sequence on going or by automatic injected */
1764       /* conversion from group regular (same conditions as group regular      */
1765       /* interruption disabling above).                                       */
1766       if(ADC_IS_SOFTWARE_START_INJECTED(hadc)                    &&
1767          (HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JL)  ||
1768           HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)    ) &&
1769          (HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) &&
1770           (ADC_IS_SOFTWARE_START_REGULAR(hadc)       &&
1771           (hadc->Init.ContinuousConvMode == DISABLE)   )       )   )
1772       {
1773         /* Disable ADC end of single conversion interrupt on group injected */
1774         __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
1775 
1776         /* Set ADC state */
1777         CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY);
1778 
1779         if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
1780         {
1781           SET_BIT(hadc->State, HAL_ADC_STATE_READY);
1782         }
1783       }
1784 
1785 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1786       hadc->InjectedConvCpltCallback(hadc);
1787 #else
1788       HAL_ADCEx_InjectedConvCpltCallback(hadc);
1789 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1790 
1791       /* Clear injected group conversion flag */
1792       __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_JSTRT | ADC_FLAG_JEOC));
1793     }
1794   }
1795 
1796   /* ========== Check Analog watchdog flags ========== */
1797   if(__HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_AWD))
1798   {
1799     if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD))
1800     {
1801       /* Set ADC state */
1802       SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
1803 
1804 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1805       hadc->LevelOutOfWindowCallback(hadc);
1806 #else
1807       HAL_ADC_LevelOutOfWindowCallback(hadc);
1808 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1809 
1810       /* Clear the ADC analog watchdog flag */
1811       __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
1812     }
1813   }
1814 
1815   /* ========== Check Overrun flag ========== */
1816   if(__HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_OVR))
1817   {
1818     if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_OVR))
1819     {
1820       /* Note: On STM32L1, ADC overrun can be set through other parameters    */
1821       /*       refer to description of parameter "EOCSelection" for more      */
1822       /*       details.                                                       */
1823 
1824       /* Set ADC error code to overrun */
1825       SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
1826 
1827       /* Clear ADC overrun flag */
1828       __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1829 
1830 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1831       hadc->ErrorCallback(hadc);
1832 #else
1833       HAL_ADC_ErrorCallback(hadc);
1834 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1835 
1836       /* Clear the Overrun flag */
1837       __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1838     }
1839   }
1840 
1841 }
1842 
1843 /**
1844   * @brief  Conversion complete callback in non blocking mode
1845   * @param  hadc ADC handle
1846   * @retval None
1847   */
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef * hadc)1848 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
1849 {
1850   /* Prevent unused argument(s) compilation warning */
1851   UNUSED(hadc);
1852 
1853   /* NOTE : This function should not be modified. When the callback is needed,
1854             function HAL_ADC_ConvCpltCallback must be implemented in the user file.
1855    */
1856 }
1857 
1858 /**
1859   * @brief  Conversion DMA half-transfer callback in non blocking mode
1860   * @param  hadc ADC handle
1861   * @retval None
1862   */
HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef * hadc)1863 __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
1864 {
1865   /* Prevent unused argument(s) compilation warning */
1866   UNUSED(hadc);
1867 
1868   /* NOTE : This function should not be modified. When the callback is needed,
1869             function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
1870   */
1871 }
1872 
1873 /**
1874   * @brief  Analog watchdog callback in non blocking mode.
1875   * @param  hadc ADC handle
1876   * @retval None
1877   */
HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef * hadc)1878 __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
1879 {
1880   /* Prevent unused argument(s) compilation warning */
1881   UNUSED(hadc);
1882 
1883   /* NOTE : This function should not be modified. When the callback is needed,
1884             function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
1885   */
1886 }
1887 
1888 /**
1889   * @brief  ADC error callback in non blocking mode
1890   *         (ADC conversion with interruption or transfer by DMA)
1891   * @note   In case of error due to overrun when using ADC with DMA transfer
1892   *         (HAL ADC handle paramater "ErrorCode" to state "HAL_ADC_ERROR_OVR"):
1893   *         - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()".
1894   *         - If needed, restart a new ADC conversion using function
1895   *           "HAL_ADC_Start_DMA()"
1896   *           (this function is also clearing overrun flag)
1897   * @param  hadc ADC handle
1898   * @retval None
1899   */
HAL_ADC_ErrorCallback(ADC_HandleTypeDef * hadc)1900 __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
1901 {
1902   /* Prevent unused argument(s) compilation warning */
1903   UNUSED(hadc);
1904 
1905   /* NOTE : This function should not be modified. When the callback is needed,
1906             function HAL_ADC_ErrorCallback must be implemented in the user file.
1907   */
1908 }
1909 
1910 
1911 /**
1912   * @}
1913   */
1914 
1915 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
1916  *  @brief    Peripheral Control functions
1917  *
1918 @verbatim
1919  ===============================================================================
1920              ##### Peripheral Control functions #####
1921  ===============================================================================
1922     [..]  This section provides functions allowing to:
1923       (+) Configure channels on regular group
1924       (+) Configure the analog watchdog
1925 
1926 @endverbatim
1927   * @{
1928   */
1929 
1930 /**
1931   * @brief  Configures the the selected channel to be linked to the regular
1932   *         group.
1933   * @note   In case of usage of internal measurement channels:
1934   *         Vbat/VrefInt/TempSensor.
1935   *         These internal paths can be be disabled using function
1936   *         HAL_ADC_DeInit().
1937   * @note   Possibility to update parameters on the fly:
1938   *         This function initializes channel into regular group, following
1939   *         calls to this function can be used to reconfigure some parameters
1940   *         of structure "ADC_ChannelConfTypeDef" on the fly, without reseting
1941   *         the ADC.
1942   *         The setting of these parameters is conditioned to ADC state.
1943   *         For parameters constraints, see comments of structure
1944   *         "ADC_ChannelConfTypeDef".
1945   * @param  hadc ADC handle
1946   * @param  sConfig Structure of ADC channel for regular group.
1947   * @retval HAL status
1948   */
HAL_ADC_ConfigChannel(ADC_HandleTypeDef * hadc,ADC_ChannelConfTypeDef * sConfig)1949 HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
1950 {
1951   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
1952   __IO uint32_t wait_loop_index = 0;
1953 
1954   /* Check the parameters */
1955   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1956   assert_param(IS_ADC_CHANNEL(sConfig->Channel));
1957   assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank));
1958   assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));
1959 
1960   /* Process locked */
1961   __HAL_LOCK(hadc);
1962 
1963 
1964   /* Regular sequence configuration */
1965   /* For Rank 1 to 6 */
1966   if (sConfig->Rank < 7)
1967   {
1968     MODIFY_REG(hadc->Instance->SQR5,
1969                ADC_SQR5_RK(ADC_SQR5_SQ1, sConfig->Rank),
1970                ADC_SQR5_RK(sConfig->Channel, sConfig->Rank) );
1971   }
1972   /* For Rank 7 to 12 */
1973   else if (sConfig->Rank < 13)
1974   {
1975     MODIFY_REG(hadc->Instance->SQR4,
1976                ADC_SQR4_RK(ADC_SQR4_SQ7, sConfig->Rank),
1977                ADC_SQR4_RK(sConfig->Channel, sConfig->Rank) );
1978   }
1979   /* For Rank 13 to 18 */
1980   else if (sConfig->Rank < 19)
1981   {
1982     MODIFY_REG(hadc->Instance->SQR3,
1983                ADC_SQR3_RK(ADC_SQR3_SQ13, sConfig->Rank),
1984                ADC_SQR3_RK(sConfig->Channel, sConfig->Rank) );
1985   }
1986   /* For Rank 19 to 24 */
1987   else if (sConfig->Rank < 25)
1988   {
1989     MODIFY_REG(hadc->Instance->SQR2,
1990                ADC_SQR2_RK(ADC_SQR2_SQ19, sConfig->Rank),
1991                ADC_SQR2_RK(sConfig->Channel, sConfig->Rank) );
1992   }
1993   /* For Rank 25 to 28 */
1994   else
1995   {
1996     MODIFY_REG(hadc->Instance->SQR1,
1997                ADC_SQR1_RK(ADC_SQR1_SQ25, sConfig->Rank),
1998                ADC_SQR1_RK(sConfig->Channel, sConfig->Rank) );
1999   }
2000 
2001 
2002   /* Channel sampling time configuration */
2003   /* For channels 0 to 9 */
2004   if (sConfig->Channel < ADC_CHANNEL_10)
2005   {
2006     MODIFY_REG(hadc->Instance->SMPR3,
2007                ADC_SMPR3(ADC_SMPR3_SMP0, sConfig->Channel),
2008                ADC_SMPR3(sConfig->SamplingTime, sConfig->Channel) );
2009   }
2010   /* For channels 10 to 19 */
2011   else if (sConfig->Channel < ADC_CHANNEL_20)
2012   {
2013     MODIFY_REG(hadc->Instance->SMPR2,
2014                ADC_SMPR2(ADC_SMPR2_SMP10, sConfig->Channel),
2015                ADC_SMPR2(sConfig->SamplingTime, sConfig->Channel) );
2016   }
2017   /* For channels 20 to 26 for devices Cat.1, Cat.2, Cat.3 */
2018   /* For channels 20 to 29 for devices Cat4, Cat.5 */
2019   else if (sConfig->Channel <= ADC_SMPR1_CHANNEL_MAX)
2020   {
2021     MODIFY_REG(hadc->Instance->SMPR1,
2022                ADC_SMPR1(ADC_SMPR1_SMP20, sConfig->Channel),
2023                ADC_SMPR1(sConfig->SamplingTime, sConfig->Channel) );
2024   }
2025   /* For channels 30 to 31 for devices Cat4, Cat.5 */
2026   else
2027   {
2028     ADC_SMPR0_CHANNEL_SET(hadc, sConfig->SamplingTime, sConfig->Channel);
2029   }
2030 
2031   /* If ADC1 Channel_16 or Channel_17 is selected, enable Temperature sensor  */
2032   /* and VREFINT measurement path.                                            */
2033   if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) ||
2034       (sConfig->Channel == ADC_CHANNEL_VREFINT)      )
2035   {
2036       if (READ_BIT(ADC->CCR, ADC_CCR_TSVREFE) == RESET)
2037       {
2038         SET_BIT(ADC->CCR, ADC_CCR_TSVREFE);
2039 
2040         if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
2041         {
2042           /* Delay for temperature sensor stabilization time */
2043           /* Compute number of CPU cycles to wait for */
2044           wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000));
2045           while(wait_loop_index != 0)
2046           {
2047             wait_loop_index--;
2048           }
2049         }
2050     }
2051   }
2052 
2053   /* Process unlocked */
2054   __HAL_UNLOCK(hadc);
2055 
2056   /* Return function status */
2057   return tmp_hal_status;
2058 }
2059 
2060 /**
2061   * @brief  Configures the analog watchdog.
2062   * @note   Analog watchdog thresholds can be modified while ADC conversion
2063   *         is on going.
2064   *         In this case, some constraints must be taken into account:
2065   *         the programmed threshold values are effective from the next
2066   *         ADC EOC (end of unitary conversion).
2067   *         Considering that registers write delay may happen due to
2068   *         bus activity, this might cause an uncertainty on the
2069   *         effective timing of the new programmed threshold values.
2070   * @param  hadc ADC handle
2071   * @param  AnalogWDGConfig Structure of ADC analog watchdog configuration
2072   * @retval HAL status
2073   */
HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef * hadc,ADC_AnalogWDGConfTypeDef * AnalogWDGConfig)2074 HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig)
2075 {
2076   /* Check the parameters */
2077   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2078   assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
2079   assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
2080   assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->HighThreshold));
2081   assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->LowThreshold));
2082 
2083   if((AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG)     ||
2084      (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_INJEC)   ||
2085      (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REGINJEC)  )
2086   {
2087     assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel));
2088   }
2089 
2090   /* Process locked */
2091   __HAL_LOCK(hadc);
2092 
2093   /* Analog watchdog configuration */
2094 
2095   /* Configure ADC Analog watchdog interrupt */
2096   if(AnalogWDGConfig->ITMode == ENABLE)
2097   {
2098     /* Enable the ADC Analog watchdog interrupt */
2099     __HAL_ADC_ENABLE_IT(hadc, ADC_IT_AWD);
2100   }
2101   else
2102   {
2103     /* Disable the ADC Analog watchdog interrupt */
2104     __HAL_ADC_DISABLE_IT(hadc, ADC_IT_AWD);
2105   }
2106 
2107   /* Configuration of analog watchdog:                                        */
2108   /*  - Set the analog watchdog enable mode: regular and/or injected groups,  */
2109   /*    one or all channels.                                                  */
2110   /*  - Set the Analog watchdog channel (is not used if watchdog              */
2111   /*    mode "all channels": ADC_CFGR_AWD1SGL=0).                             */
2112   hadc->Instance->CR1 &= ~( ADC_CR1_AWDSGL |
2113                             ADC_CR1_JAWDEN |
2114                             ADC_CR1_AWDEN  |
2115                             ADC_CR1_AWDCH   );
2116 
2117   hadc->Instance->CR1 |= ( AnalogWDGConfig->WatchdogMode |
2118                            AnalogWDGConfig->Channel       );
2119 
2120   /* Set the high threshold */
2121   hadc->Instance->HTR = AnalogWDGConfig->HighThreshold;
2122 
2123   /* Set the low threshold */
2124   hadc->Instance->LTR = AnalogWDGConfig->LowThreshold;
2125 
2126   /* Process unlocked */
2127   __HAL_UNLOCK(hadc);
2128 
2129   /* Return function status */
2130   return HAL_OK;
2131 }
2132 
2133 
2134 /**
2135   * @}
2136   */
2137 
2138 
2139 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
2140  *  @brief    Peripheral State functions
2141  *
2142 @verbatim
2143  ===============================================================================
2144             ##### Peripheral State and Errors functions #####
2145  ===============================================================================
2146     [..]
2147     This subsection provides functions to get in run-time the status of the
2148     peripheral.
2149       (+) Check the ADC state
2150       (+) Check the ADC error code
2151 
2152 @endverbatim
2153   * @{
2154   */
2155 
2156 /**
2157   * @brief  return the ADC state
2158   * @param  hadc ADC handle
2159   * @retval HAL state
2160   */
HAL_ADC_GetState(ADC_HandleTypeDef * hadc)2161 uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc)
2162 {
2163   /* Return ADC state */
2164   return hadc->State;
2165 }
2166 
2167 /**
2168   * @brief  Return the ADC error code
2169   * @param  hadc ADC handle
2170   * @retval ADC Error Code
2171   */
HAL_ADC_GetError(ADC_HandleTypeDef * hadc)2172 uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
2173 {
2174   return hadc->ErrorCode;
2175 }
2176 
2177 /**
2178   * @}
2179   */
2180 
2181 /**
2182   * @}
2183   */
2184 
2185 /** @defgroup ADC_Private_Functions ADC Private Functions
2186   * @{
2187   */
2188 
2189 /**
2190   * @brief  Enable the selected ADC.
2191   * @note   Prerequisite condition to use this function: ADC must be disabled
2192   *         and voltage regulator must be enabled (done into HAL_ADC_Init()).
2193   * @note   If low power mode AutoPowerOff is enabled, power-on/off phases are
2194   *         performed automatically by hardware.
2195   *         In this mode, this function is useless and must not be called because
2196   *         flag ADC_FLAG_RDY is not usable.
2197   *         Therefore, this function must be called under condition of
2198   *         "if (hadc->Init.LowPowerAutoPowerOff != ENABLE)".
2199   * @param  hadc ADC handle
2200   * @retval HAL status.
2201   */
ADC_Enable(ADC_HandleTypeDef * hadc)2202 HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc)
2203 {
2204   uint32_t tickstart = 0;
2205   __IO uint32_t wait_loop_index = 0;
2206 
2207   /* ADC enable and wait for ADC ready (in case of ADC is disabled or         */
2208   /* enabling phase not yet completed: flag ADC ready not yet set).           */
2209   /* Timeout implemented to not be stuck if ADC cannot be enabled (possible   */
2210   /* causes: ADC clock not running, ...).                                     */
2211   if (ADC_IS_ENABLE(hadc) == RESET)
2212   {
2213     /* Enable the Peripheral */
2214     __HAL_ADC_ENABLE(hadc);
2215 
2216     /* Delay for ADC stabilization time */
2217     /* Compute number of CPU cycles to wait for */
2218     wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
2219     while(wait_loop_index != 0)
2220     {
2221       wait_loop_index--;
2222     }
2223 
2224     /* Get tick count */
2225     tickstart = HAL_GetTick();
2226 
2227     /* Wait for ADC effectively enabled */
2228     while(ADC_IS_ENABLE(hadc) == RESET)
2229     {
2230       if((HAL_GetTick() - tickstart ) > ADC_ENABLE_TIMEOUT)
2231       {
2232         /* New check to avoid false timeout detection in case of preemption */
2233         if(ADC_IS_ENABLE(hadc) == RESET)
2234         {
2235           /* Update ADC state machine to error */
2236           SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2237 
2238           /* Set ADC error code to ADC IP internal error */
2239           SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2240 
2241           /* Process unlocked */
2242           __HAL_UNLOCK(hadc);
2243 
2244           return HAL_ERROR;
2245         }
2246       }
2247     }
2248   }
2249 
2250   /* Return HAL status */
2251   return HAL_OK;
2252 }
2253 
2254 /**
2255   * @brief  Stop ADC conversion and disable the selected ADC
2256   * @note   Prerequisite condition to use this function: ADC conversions must be
2257   *         stopped to disable the ADC.
2258   * @param  hadc ADC handle
2259   * @retval HAL status.
2260   */
ADC_ConversionStop_Disable(ADC_HandleTypeDef * hadc)2261 HAL_StatusTypeDef ADC_ConversionStop_Disable(ADC_HandleTypeDef* hadc)
2262 {
2263   uint32_t tickstart = 0;
2264 
2265   /* Verification if ADC is not already disabled */
2266   if (ADC_IS_ENABLE(hadc) != RESET)
2267   {
2268     /* Disable the ADC peripheral */
2269     __HAL_ADC_DISABLE(hadc);
2270 
2271     /* Get tick count */
2272     tickstart = HAL_GetTick();
2273 
2274     /* Wait for ADC effectively disabled */
2275     while(ADC_IS_ENABLE(hadc) != RESET)
2276     {
2277       if((HAL_GetTick() - tickstart ) > ADC_DISABLE_TIMEOUT)
2278       {
2279         /* New check to avoid false timeout detection in case of preemption */
2280         if(ADC_IS_ENABLE(hadc) != RESET)
2281         {
2282           /* Update ADC state machine to error */
2283           SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2284 
2285           /* Set ADC error code to ADC IP internal error */
2286           SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2287 
2288           return HAL_ERROR;
2289         }
2290       }
2291     }
2292   }
2293 
2294   /* Return HAL status */
2295   return HAL_OK;
2296 }
2297 
2298 /**
2299   * @brief  DMA transfer complete callback.
2300   * @param  hdma pointer to DMA handle.
2301   * @retval None
2302   */
ADC_DMAConvCplt(DMA_HandleTypeDef * hdma)2303 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
2304 {
2305   /* Retrieve ADC handle corresponding to current DMA handle */
2306   ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2307 
2308   /* Update state machine on conversion status if not in error state */
2309   if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
2310   {
2311     /* Update ADC state machine */
2312     SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
2313 
2314     /* Determine whether any further conversion upcoming on group regular   */
2315     /* by external trigger, continuous mode or scan sequence on going.      */
2316     /* Note: On STM32L1, there is no independent flag of end of sequence.   */
2317     /*       The test of scan sequence on going is done either with scan    */
2318     /*       sequence disabled or with end of conversion flag set to        */
2319     /*       of end of sequence.                                            */
2320     if(ADC_IS_SOFTWARE_START_REGULAR(hadc)                   &&
2321        (hadc->Init.ContinuousConvMode == DISABLE)            &&
2322        (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) ||
2323         HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)  )   )
2324     {
2325       /* Disable ADC end of single conversion interrupt on group regular */
2326       /* Note: Overrun interrupt was enabled with EOC interrupt in          */
2327       /* HAL_ADC_Start_IT(), but is not disabled here because can be used   */
2328       /* by overrun IRQ process below.                                      */
2329       __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
2330 
2331       /* Set ADC state */
2332       CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
2333 
2334       if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY))
2335       {
2336         SET_BIT(hadc->State, HAL_ADC_STATE_READY);
2337       }
2338     }
2339 
2340     /* Conversion complete callback */
2341 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2342     hadc->ConvCpltCallback(hadc);
2343 #else
2344     HAL_ADC_ConvCpltCallback(hadc);
2345 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2346   }
2347   else
2348   {
2349     /* Call DMA error callback */
2350     hadc->DMA_Handle->XferErrorCallback(hdma);
2351   }
2352 }
2353 
2354 /**
2355   * @brief  DMA half transfer complete callback.
2356   * @param  hdma pointer to DMA handle.
2357   * @retval None
2358   */
ADC_DMAHalfConvCplt(DMA_HandleTypeDef * hdma)2359 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
2360 {
2361   /* Retrieve ADC handle corresponding to current DMA handle */
2362   ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2363 
2364   /* Half conversion callback */
2365 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2366     hadc->ConvHalfCpltCallback(hadc);
2367 #else
2368   HAL_ADC_ConvHalfCpltCallback(hadc);
2369 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2370 }
2371 
2372 /**
2373   * @brief  DMA error callback
2374   * @param  hdma pointer to DMA handle.
2375   * @retval None
2376   */
ADC_DMAError(DMA_HandleTypeDef * hdma)2377 static void ADC_DMAError(DMA_HandleTypeDef *hdma)
2378 {
2379   /* Retrieve ADC handle corresponding to current DMA handle */
2380   ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2381 
2382   /* Set ADC state */
2383   SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
2384 
2385   /* Set ADC error code to DMA error */
2386   SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
2387 
2388   /* Error callback */
2389 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2390   hadc->ErrorCallback(hadc);
2391 #else
2392   HAL_ADC_ErrorCallback(hadc);
2393 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2394 }
2395 
2396 /**
2397   * @}
2398   */
2399 
2400 #endif /* HAL_ADC_MODULE_ENABLED */
2401 /**
2402   * @}
2403   */
2404 
2405 /**
2406   * @}
2407   */
2408 
2409 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2410