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