1 /**
2 ******************************************************************************
3 * @file stm32h7xx_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 Converter (ADC)
7 * peripheral:
8 * + Peripheral Control functions
9 * + Peripheral State functions
10 * Other functions (extended functions) are available in file
11 * "stm32h7xx_hal_adc_ex.c".
12 *
13 ******************************************************************************
14 * @attention
15 *
16 * Copyright (c) 2017 STMicroelectronics.
17 * All rights reserved.
18 *
19 * This software is licensed under terms that can be found in the LICENSE file
20 * in the root directory of this software component.
21 * If no LICENSE file comes with this software, it is provided AS-IS.
22 *
23 ******************************************************************************
24 @verbatim
25 ==============================================================================
26 ##### ADC peripheral features #####
27 ==============================================================================
28 [..]
29 (+) 16-bit, 14-bit, 12-bit, 10-bit or 8-bit configurable resolution.
30 Note: On devices STM32H72xx and STM32H73xx, these resolution are applicable to instances ADC1 and ADC2.
31 ADC3 is featuring resolutions 12-bit, 10-bit, 8-bit, 6-bit.
32
33 (+) Interrupt generation at the end of regular conversion and in case of
34 analog watchdog or overrun events.
35
36 (+) Single and continuous conversion modes.
37
38 (+) Scan mode for conversion of several channels sequentially.
39
40 (+) Data alignment with in-built data coherency.
41
42 (+) Programmable sampling time (channel wise)
43
44 (+) External trigger (timer or EXTI) with configurable polarity
45
46 (+) DMA request generation for transfer of conversions data of regular group.
47
48 (+) Configurable delay between conversions in Dual interleaved mode.
49
50 (+) ADC channels selectable single/differential input.
51
52 (+) ADC offset shared on 4 offset instances.
53 (+) ADC calibration
54
55 (+) ADC conversion of regular group.
56
57 (+) ADC supply requirements: 1.62 V to 3.6 V.
58
59 (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
60 Vdda or to an external voltage reference).
61
62
63 ##### How to use this driver #####
64 ==============================================================================
65 [..]
66
67 *** Configuration of top level parameters related to ADC ***
68 ============================================================
69 [..]
70
71 (#) Enable the ADC interface
72 (++) As prerequisite, ADC clock must be configured at RCC top level.
73
74 (++) Two clock settings are mandatory:
75 (+++) ADC clock (core clock, also possibly conversion clock).
76
77 (+++) ADC clock (conversions clock).
78 Two possible clock sources: synchronous clock derived from AHB clock
79 or asynchronous clock derived from system clock, the PLL2 or the PLL3 running up to 400MHz.
80
81 (+++) Example:
82 Into HAL_ADC_MspInit() (recommended code location) or with
83 other device clock parameters configuration:
84 (+++) __HAL_RCC_ADC_CLK_ENABLE(); (mandatory)
85
86 RCC_ADCCLKSOURCE_PLL2 enable: (optional: if asynchronous clock selected)
87 (+++) RCC_PeriphClkInitTypeDef RCC_PeriphClkInit;
88 (+++) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
89 (+++) PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
90 (+++) HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
91
92 (++) ADC clock source and clock prescaler are configured at ADC level with
93 parameter "ClockPrescaler" using function HAL_ADC_Init().
94
95 (#) ADC pins configuration
96 (++) Enable the clock for the ADC GPIOs
97 using macro __HAL_RCC_GPIOx_CLK_ENABLE()
98 (++) Configure these ADC pins in analog mode
99 using function HAL_GPIO_Init()
100
101 (#) Optionally, in case of usage of ADC with interruptions:
102 (++) Configure the NVIC for ADC
103 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
104 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
105 into the function of corresponding ADC interruption vector
106 ADCx_IRQHandler().
107
108 (#) Optionally, in case of usage of DMA:
109 (++) Configure the DMA (DMA channel, mode normal or circular, ...)
110 using function HAL_DMA_Init().
111 (++) Configure the NVIC for DMA
112 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
113 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
114 into the function of corresponding DMA interruption vector
115 DMAx_Channelx_IRQHandler().
116
117 *** Configuration of ADC, group regular, channels parameters ***
118 ================================================================
119 [..]
120
121 (#) Configure the ADC parameters (resolution, data alignment, ...)
122 and regular group parameters (conversion trigger, sequencer, ...)
123 using function HAL_ADC_Init().
124
125 (#) Configure the channels for regular group parameters (channel number,
126 channel rank into sequencer, ..., into regular group)
127 using function HAL_ADC_ConfigChannel().
128
129 (#) Optionally, configure the analog watchdog parameters (channels
130 monitored, thresholds, ...)
131 using function HAL_ADC_AnalogWDGConfig().
132
133 *** Execution of ADC conversions ***
134 ====================================
135 [..]
136
137 (#) Optionally, perform an automatic ADC calibration to improve the
138 conversion accuracy
139 using function HAL_ADCEx_Calibration_Start().
140
141 (#) ADC driver can be used among three modes: polling, interruption,
142 transfer by DMA.
143
144 (++) ADC conversion by polling:
145 (+++) Activate the ADC peripheral and start conversions
146 using function HAL_ADC_Start()
147 (+++) Wait for ADC conversion completion
148 using function HAL_ADC_PollForConversion()
149 (+++) Retrieve conversion results
150 using function HAL_ADC_GetValue()
151 (+++) Stop conversion and disable the ADC peripheral
152 using function HAL_ADC_Stop()
153
154 (++) ADC conversion by interruption:
155 (+++) Activate the ADC peripheral and start conversions
156 using function HAL_ADC_Start_IT()
157 (+++) Wait for ADC conversion completion by call of function
158 HAL_ADC_ConvCpltCallback()
159 (this function must be implemented in user program)
160 (+++) Retrieve conversion results
161 using function HAL_ADC_GetValue()
162 (+++) Stop conversion and disable the ADC peripheral
163 using function HAL_ADC_Stop_IT()
164
165 (++) ADC conversion with transfer by DMA:
166 (+++) Activate the ADC peripheral and start conversions
167 using function HAL_ADC_Start_DMA()
168 (+++) Wait for ADC conversion completion by call of function
169 HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
170 (these functions must be implemented in user program)
171 (+++) Conversion results are automatically transferred by DMA into
172 destination variable address.
173 (+++) Stop conversion and disable the ADC peripheral
174 using function HAL_ADC_Stop_DMA()
175
176 [..]
177
178 (@) Callback functions must be implemented in user program:
179 (+@) HAL_ADC_ErrorCallback()
180 (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
181 (+@) HAL_ADC_ConvCpltCallback()
182 (+@) HAL_ADC_ConvHalfCpltCallback
183
184 *** Deinitialization of ADC ***
185 ============================================================
186 [..]
187
188 (#) Disable the ADC interface
189 (++) ADC clock can be hard reset and disabled at RCC top level.
190 (++) Hard reset of ADC peripherals
191 using macro __HAL_RCC_ADCx_FORCE_RESET(), __HAL_RCC_ADCx_RELEASE_RESET().
192 (++) ADC clock disable
193 using the equivalent macro/functions as configuration step.
194 (+++) Example:
195 Into HAL_ADC_MspDeInit() (recommended code location) or with
196 other device clock parameters configuration:
197 (+++) __HAL_RCC_ADC_CLK_DISABLE(); (if not used anymore)
198 RCC_ADCCLKSOURCE_CLKP restore: (optional)
199 (+++) RCC_PeriphClkInitTypeDef RCC_PeriphClkInit;
200 (+++) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
201 (+++) PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_CLKP;
202 (+++) HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
203
204 (#) ADC pins configuration
205 (++) Disable the clock for the ADC GPIOs
206 using macro __HAL_RCC_GPIOx_CLK_DISABLE()
207
208 (#) Optionally, in case of usage of ADC with interruptions:
209 (++) Disable the NVIC for ADC
210 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
211
212 (#) Optionally, in case of usage of DMA:
213 (++) Deinitialize the DMA
214 using function HAL_DMA_Init().
215 (++) Disable the NVIC for DMA
216 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
217
218 [..]
219
220 *** Callback registration ***
221 =============================================
222 [..]
223
224 The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
225 allows the user to configure dynamically the driver callbacks.
226 Use Functions HAL_ADC_RegisterCallback()
227 to register an interrupt callback.
228 [..]
229
230 Function HAL_ADC_RegisterCallback() allows to register following callbacks:
231 (+) ConvCpltCallback : ADC conversion complete callback
232 (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
233 (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
234 (+) ErrorCallback : ADC error callback
235 (+) InjectedConvCpltCallback : ADC group injected conversion complete callback
236 (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback
237 (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
238 (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
239 (+) EndOfSamplingCallback : ADC end of sampling callback
240 (+) MspInitCallback : ADC Msp Init callback
241 (+) MspDeInitCallback : ADC Msp DeInit callback
242 This function takes as parameters the HAL peripheral handle, the Callback ID
243 and a pointer to the user callback function.
244 [..]
245
246 Use function HAL_ADC_UnRegisterCallback to reset a callback to the default
247 weak function.
248 [..]
249
250 HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
251 and the Callback ID.
252 This function allows to reset following callbacks:
253 (+) ConvCpltCallback : ADC conversion complete callback
254 (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
255 (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
256 (+) ErrorCallback : ADC error callback
257 (+) InjectedConvCpltCallback : ADC group injected conversion complete callback
258 (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback
259 (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
260 (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
261 (+) EndOfSamplingCallback : ADC end of sampling callback
262 (+) MspInitCallback : ADC Msp Init callback
263 (+) MspDeInitCallback : ADC Msp DeInit callback
264 [..]
265
266 By default, after the HAL_ADC_Init() and when the state is HAL_ADC_STATE_RESET
267 all callbacks are set to the corresponding weak functions:
268 examples HAL_ADC_ConvCpltCallback(), HAL_ADC_ErrorCallback().
269 Exception done for MspInit and MspDeInit functions that are
270 reset to the legacy weak functions in the HAL_ADC_Init()/ HAL_ADC_DeInit() only when
271 these callbacks are null (not registered beforehand).
272 [..]
273
274 If MspInit or MspDeInit are not null, the HAL_ADC_Init()/ HAL_ADC_DeInit()
275 keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
276 [..]
277
278 Callbacks can be registered/unregistered in HAL_ADC_STATE_READY state only.
279 Exception done MspInit/MspDeInit functions that can be registered/unregistered
280 in HAL_ADC_STATE_READY or HAL_ADC_STATE_RESET state,
281 thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
282 [..]
283
284 Then, the user first registers the MspInit/MspDeInit user callbacks
285 using HAL_ADC_RegisterCallback() before calling HAL_ADC_DeInit()
286 or HAL_ADC_Init() function.
287 [..]
288
289 When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
290 not defined, the callback registration feature is not available and all callbacks
291 are set to the corresponding weak functions.
292
293 @endverbatim
294 ******************************************************************************
295 */
296
297 /* Includes ------------------------------------------------------------------*/
298 #include "stm32h7xx_hal.h"
299
300 /** @addtogroup STM32H7xx_HAL_Driver
301 * @{
302 */
303
304 /** @defgroup ADC ADC
305 * @brief ADC HAL module driver
306 * @{
307 */
308
309 #ifdef HAL_ADC_MODULE_ENABLED
310
311 /* Private typedef -----------------------------------------------------------*/
312 /* Private define ------------------------------------------------------------*/
313
314 /** @defgroup ADC_Private_Constants ADC Private Constants
315 * @{
316 */
317 #define ADC_CFGR_FIELDS_1 ((uint32_t)(ADC_CFGR_RES |\
318 ADC_CFGR_CONT | ADC_CFGR_OVRMOD |\
319 ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |\
320 ADC_CFGR_EXTEN | ADC_CFGR_EXTSEL)) /*!< ADC_CFGR fields of parameters that can be updated
321 when no regular conversion is on-going */
322
323 #if defined(ADC_VER_V5_V90)
324 #define ADC3_CFGR_FIELDS_1 ((ADC3_CFGR_RES | ADC3_CFGR_ALIGN |\
325 ADC_CFGR_CONT | ADC_CFGR_OVRMOD |\
326 ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |\
327 ADC_CFGR_EXTEN | ADC_CFGR_EXTSEL)) /*!< ADC_CFGR fields of parameters that can be updated
328 when no regular conversion is on-going */
329 #endif
330
331 #define ADC_CFGR2_FIELDS ((uint32_t)(ADC_CFGR2_ROVSE | ADC_CFGR2_OVSR |\
332 ADC_CFGR2_OVSS | ADC_CFGR2_TROVS |\
333 ADC_CFGR2_ROVSM)) /*!< ADC_CFGR2 fields of parameters that can be updated when no conversion
334 (neither regular nor injected) is on-going */
335
336 /* Timeout values for ADC operations (enable settling time, */
337 /* disable settling time, ...). */
338 /* Values defined to be higher than worst cases: low clock frequency, */
339 /* maximum prescalers. */
340 #define ADC_ENABLE_TIMEOUT (2UL) /*!< ADC enable time-out value */
341 #define ADC_DISABLE_TIMEOUT (2UL) /*!< ADC disable time-out value */
342
343 /* Timeout to wait for current conversion on going to be completed. */
344 /* Timeout fixed to worst case, for 1 channel. */
345 /* - maximum sampling time (830.5 adc_clk) */
346 /* - ADC resolution (Tsar 16 bits= 16.5 adc_clk) */
347 /* - ADC clock with prescaler 256 */
348 /* 823 * 256 = 210688 clock cycles max */
349 /* Unit: cycles of CPU clock. */
350 #define ADC_CONVERSION_TIME_MAX_CPU_CYCLES (210688UL) /*!< ADC conversion completion time-out value */
351
352 /**
353 * @}
354 */
355
356 /* Private macro -------------------------------------------------------------*/
357 /* Private variables ---------------------------------------------------------*/
358 /* Private function prototypes -----------------------------------------------*/
359 /* Exported functions --------------------------------------------------------*/
360
361 /** @defgroup ADC_Exported_Functions ADC Exported Functions
362 * @{
363 */
364
365 /** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions
366 * @brief ADC Initialization and Configuration functions
367 *
368 @verbatim
369 ===============================================================================
370 ##### Initialization and de-initialization functions #####
371 ===============================================================================
372 [..] This section provides functions allowing to:
373 (+) Initialize and configure the ADC.
374 (+) De-initialize the ADC.
375 @endverbatim
376 * @{
377 */
378
379 /**
380 * @brief Initialize the ADC peripheral and regular group according to
381 * parameters specified in structure "ADC_InitTypeDef".
382 * @note As prerequisite, ADC clock must be configured at RCC top level
383 * (refer to description of RCC configuration for ADC
384 * in header of this file).
385 * @note Possibility to update parameters on the fly:
386 * This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
387 * coming from ADC state reset. Following calls to this function can
388 * be used to reconfigure some parameters of ADC_InitTypeDef
389 * structure on the fly, without modifying MSP configuration. If ADC
390 * MSP has to be modified again, HAL_ADC_DeInit() must be called
391 * before HAL_ADC_Init().
392 * The setting of these parameters is conditioned to ADC state.
393 * For parameters constraints, see comments of structure
394 * "ADC_InitTypeDef".
395 * @note This function configures the ADC within 2 scopes: scope of entire
396 * ADC and scope of regular group. For parameters details, see comments
397 * of structure "ADC_InitTypeDef".
398 * @note Parameters related to common ADC registers (ADC clock mode) are set
399 * only if all ADCs are disabled.
400 * If this is not the case, these common parameters setting are
401 * bypassed without error reporting: it can be the intended behaviour in
402 * case of update of a parameter of ADC_InitTypeDef on the fly,
403 * without disabling the other ADCs.
404 * @param hadc ADC handle
405 * @retval HAL status
406 */
HAL_ADC_Init(ADC_HandleTypeDef * hadc)407 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)
408 {
409 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
410 uint32_t tmpCFGR;
411 uint32_t tmp_adc_reg_is_conversion_on_going;
412 __IO uint32_t wait_loop_index = 0UL;
413 uint32_t tmp_adc_is_conversion_on_going_regular;
414 uint32_t tmp_adc_is_conversion_on_going_injected;
415
416 /* Check ADC handle */
417 if (hadc == NULL)
418 {
419 return HAL_ERROR;
420 }
421
422 /* Check the parameters */
423 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
424 assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
425 assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
426 assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
427 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
428 assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
429 assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
430 assert_param(IS_ADC_CONVERSIONDATAMGT(hadc->Init.ConversionDataManagement));
431 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
432 assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
433 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
434 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OversamplingMode));
435
436 if (hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
437 {
438 assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
439 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
440
441 if (hadc->Init.DiscontinuousConvMode == ENABLE)
442 {
443 assert_param(IS_ADC_REGULAR_DISCONT_NUMBER(hadc->Init.NbrOfDiscConversion));
444 }
445 }
446
447 /* DISCEN and CONT bits cannot be set at the same time */
448 assert_param(!((hadc->Init.DiscontinuousConvMode == ENABLE) && (hadc->Init.ContinuousConvMode == ENABLE)));
449
450 /* Actions performed only if ADC is coming from state reset: */
451 /* - Initialization of ADC MSP */
452 if (hadc->State == HAL_ADC_STATE_RESET)
453 {
454 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
455 /* Init the ADC Callback settings */
456 hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */
457 hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */
458 hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */
459 hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */
460 hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; /* Legacy weak callback */
461 hadc->InjectedQueueOverflowCallback = HAL_ADCEx_InjectedQueueOverflowCallback; /* Legacy weak callback */
462 hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback; /* Legacy weak callback */
463 hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback; /* Legacy weak callback */
464 hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback; /* Legacy weak callback */
465
466 if (hadc->MspInitCallback == NULL)
467 {
468 hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
469 }
470
471 /* Init the low level hardware */
472 hadc->MspInitCallback(hadc);
473 #else
474 /* Init the low level hardware */
475 HAL_ADC_MspInit(hadc);
476 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
477
478 /* Set ADC error code to none */
479 ADC_CLEAR_ERRORCODE(hadc);
480
481 /* Initialize Lock */
482 hadc->Lock = HAL_UNLOCKED;
483 }
484
485 /* - Exit from deep-power-down mode and ADC voltage regulator enable */
486 if (LL_ADC_IsDeepPowerDownEnabled(hadc->Instance) != 0UL)
487 {
488 /* Disable ADC deep power down mode */
489 LL_ADC_DisableDeepPowerDown(hadc->Instance);
490
491 /* System was in deep power down mode, calibration must
492 be relaunched or a previously saved calibration factor
493 re-applied once the ADC voltage regulator is enabled */
494 }
495
496 if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
497 {
498 /* Enable ADC internal voltage regulator */
499 LL_ADC_EnableInternalRegulator(hadc->Instance);
500
501 /* Note: Variable divided by 2 to compensate partially */
502 /* CPU processing cycles, scaling in us split to not */
503 /* exceed 32 bits register capacity and handle low frequency. */
504 wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
505 while (wait_loop_index != 0UL)
506 {
507 wait_loop_index--;
508 }
509 }
510
511 /* Verification that ADC voltage regulator is correctly enabled, whether */
512 /* or not ADC is coming from state reset (if any potential problem of */
513 /* clocking, voltage regulator would not be enabled). */
514 if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
515 {
516 /* Update ADC state machine to error */
517 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
518
519 /* Set ADC error code to ADC peripheral internal error */
520 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
521
522 tmp_hal_status = HAL_ERROR;
523 }
524
525 /* Configuration of ADC parameters if previous preliminary actions are */
526 /* correctly completed and if there is no conversion on going on regular */
527 /* group (ADC may already be enabled at this point if HAL_ADC_Init() is */
528 /* called to update a parameter on the fly). */
529 tmp_adc_reg_is_conversion_on_going = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
530
531 if (((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
532 && (tmp_adc_reg_is_conversion_on_going == 0UL)
533 )
534 {
535 /* Set ADC state */
536 ADC_STATE_CLR_SET(hadc->State,
537 HAL_ADC_STATE_REG_BUSY,
538 HAL_ADC_STATE_BUSY_INTERNAL);
539
540 /* Configuration of common ADC parameters */
541
542 /* Parameters update conditioned to ADC state: */
543 /* Parameters that can be updated only when ADC is disabled: */
544 /* - clock configuration */
545 if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
546 {
547 if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) == 0UL)
548 {
549 /* Reset configuration of ADC common register CCR: */
550 /* */
551 /* - ADC clock mode and ACC prescaler (CKMODE and PRESC bits)are set */
552 /* according to adc->Init.ClockPrescaler. It selects the clock */
553 /* source and sets the clock division factor. */
554 /* */
555 /* Some parameters of this register are not reset, since they are set */
556 /* by other functions and must be kept in case of usage of this */
557 /* function on the fly (update of a parameter of ADC_InitTypeDef */
558 /* without needing to reconfigure all other ADC groups/channels */
559 /* parameters): */
560 /* - when multimode feature is available, multimode-related */
561 /* parameters: MDMA, DMACFG, DELAY, DUAL (set by API */
562 /* HAL_ADCEx_MultiModeConfigChannel() ) */
563 /* - internal measurement paths: Vbat, temperature sensor, Vref */
564 /* (set into HAL_ADC_ConfigChannel() or */
565 /* HAL_ADCEx_InjectedConfigChannel() ) */
566 LL_ADC_SetCommonClock(__LL_ADC_COMMON_INSTANCE(hadc->Instance), hadc->Init.ClockPrescaler);
567 }
568 }
569
570 /* Configuration of ADC: */
571 /* - resolution Init.Resolution */
572 /* - external trigger to start conversion Init.ExternalTrigConv */
573 /* - external trigger polarity Init.ExternalTrigConvEdge */
574 /* - continuous conversion mode Init.ContinuousConvMode */
575 /* - overrun Init.Overrun */
576 /* - discontinuous mode Init.DiscontinuousConvMode */
577 /* - discontinuous mode channel count Init.NbrOfDiscConversion */
578 #if defined(ADC_VER_V5_3)
579
580 tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
581 hadc->Init.Overrun |
582 hadc->Init.Resolution |
583 ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
584
585 #elif defined(ADC_VER_V5_V90)
586 if (hadc->Instance == ADC3)
587 {
588 tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
589 hadc->Init.Overrun |
590 hadc->Init.DataAlign |
591 ((__LL_ADC12_RESOLUTION_TO_ADC3(hadc->Init.Resolution) & (ADC_CFGR_RES_1 | ADC_CFGR_RES_0)) << 1UL) |
592 ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
593 }
594 else
595 {
596 tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
597 hadc->Init.Overrun |
598 hadc->Init.Resolution |
599 ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
600 }
601
602 #else
603
604 if ((HAL_GetREVID() > REV_ID_Y) && (ADC_RESOLUTION_8B == hadc->Init.Resolution))
605 {
606 /* for STM32H7 silicon rev.B and above , ADC_CFGR_RES value for 8bits resolution is : b111 */
607 tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
608 hadc->Init.Overrun |
609 hadc->Init.Resolution | (ADC_CFGR_RES_1 | ADC_CFGR_RES_0) |
610 ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
611 }
612 else
613 {
614
615 tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
616 hadc->Init.Overrun |
617 hadc->Init.Resolution |
618 ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
619 }
620
621 #endif /* ADC_VER_V5_3 */
622
623 if (hadc->Init.DiscontinuousConvMode == ENABLE)
624 {
625 tmpCFGR |= ADC_CFGR_DISCONTINUOUS_NUM(hadc->Init.NbrOfDiscConversion);
626 }
627
628 /* Enable external trigger if trigger selection is different of software */
629 /* start. */
630 /* Note: This configuration keeps the hardware feature of parameter */
631 /* ExternalTrigConvEdge "trigger edge none" equivalent to */
632 /* software start. */
633 if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
634 {
635 tmpCFGR |= ((hadc->Init.ExternalTrigConv & ADC_CFGR_EXTSEL)
636 | hadc->Init.ExternalTrigConvEdge
637 );
638 }
639
640
641 #if defined(ADC_VER_V5_V90)
642 if (hadc->Instance == ADC3)
643 {
644 /* Update Configuration Register CFGR */
645 MODIFY_REG(hadc->Instance->CFGR, ADC3_CFGR_FIELDS_1, tmpCFGR);
646 /* Configuration of sampling mode */
647 MODIFY_REG(hadc->Instance->CFGR2, ADC3_CFGR2_BULB | ADC3_CFGR2_SMPTRIG, hadc->Init.SamplingMode);
648 }
649 else
650 {
651 /* Update Configuration Register CFGR */
652 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_1, tmpCFGR);
653 }
654 #else
655 /* Update Configuration Register CFGR */
656 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_1, tmpCFGR);
657 #endif
658
659 /* Parameters update conditioned to ADC state: */
660 /* Parameters that can be updated when ADC is disabled or enabled without */
661 /* conversion on going on regular and injected groups: */
662 /* - Conversion data management Init.ConversionDataManagement */
663 /* - LowPowerAutoWait feature Init.LowPowerAutoWait */
664 /* - Oversampling parameters Init.Oversampling */
665 tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
666 tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
667 if ((tmp_adc_is_conversion_on_going_regular == 0UL)
668 && (tmp_adc_is_conversion_on_going_injected == 0UL)
669 )
670 {
671 #if defined(ADC_VER_V5_V90)
672 if (hadc->Instance == ADC3)
673 {
674 tmpCFGR = (
675 ADC_CFGR_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait) |
676 ADC3_CFGR_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests));
677 }
678 else
679 {
680 tmpCFGR = (
681 ADC_CFGR_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait) |
682 ADC_CFGR_DMACONTREQ((uint32_t)hadc->Init.ConversionDataManagement));
683 }
684 #else
685 tmpCFGR = (
686 ADC_CFGR_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait) |
687 ADC_CFGR_DMACONTREQ((uint32_t)hadc->Init.ConversionDataManagement));
688 #endif
689
690 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_2, tmpCFGR);
691
692 if (hadc->Init.OversamplingMode == ENABLE)
693 {
694 #if defined(ADC_VER_V5_V90)
695 if (hadc->Instance == ADC3)
696 {
697 assert_param(IS_ADC_OVERSAMPLING_RATIO_ADC3(hadc->Init.Oversampling.Ratio));
698 }
699 else
700 {
701 assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio));
702 }
703 #else
704 assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio));
705 #endif
706 assert_param(IS_ADC_RIGHT_BIT_SHIFT(hadc->Init.Oversampling.RightBitShift));
707 assert_param(IS_ADC_TRIGGERED_OVERSAMPLING_MODE(hadc->Init.Oversampling.TriggeredMode));
708 assert_param(IS_ADC_REGOVERSAMPLING_MODE(hadc->Init.Oversampling.OversamplingStopReset));
709
710 if ((hadc->Init.ExternalTrigConv == ADC_SOFTWARE_START)
711 || (hadc->Init.ExternalTrigConvEdge == ADC_EXTERNALTRIGCONVEDGE_NONE))
712 {
713 /* Multi trigger is not applicable to software-triggered conversions */
714 assert_param((hadc->Init.Oversampling.TriggeredMode == ADC_TRIGGEREDMODE_SINGLE_TRIGGER));
715 }
716
717 #if defined(ADC_VER_V5_V90)
718 if (hadc->Instance == ADC3)
719 {
720 /* Configuration of Oversampler: */
721 /* - Oversampling Ratio */
722 /* - Right bit shift */
723 /* - Triggered mode */
724 /* - Oversampling mode (continued/resumed) */
725 MODIFY_REG(hadc->Instance->CFGR2,
726 ADC_CFGR2_OVSR |
727 ADC_CFGR2_OVSS |
728 ADC_CFGR2_TROVS |
729 ADC_CFGR2_ROVSM,
730 ADC_CFGR2_ROVSE |
731 hadc->Init.Oversampling.Ratio |
732 hadc->Init.Oversampling.RightBitShift |
733 hadc->Init.Oversampling.TriggeredMode |
734 hadc->Init.Oversampling.OversamplingStopReset
735 );
736 }
737 else
738 {
739
740 /* Configuration of Oversampler: */
741 /* - Oversampling Ratio */
742 /* - Right bit shift */
743 /* - Left bit shift */
744 /* - Triggered mode */
745 /* - Oversampling mode (continued/resumed) */
746 MODIFY_REG(hadc->Instance->CFGR2, ADC_CFGR2_FIELDS,
747 ADC_CFGR2_ROVSE |
748 ((hadc->Init.Oversampling.Ratio - 1UL) << ADC_CFGR2_OVSR_Pos) |
749 hadc->Init.Oversampling.RightBitShift |
750 hadc->Init.Oversampling.TriggeredMode |
751 hadc->Init.Oversampling.OversamplingStopReset);
752 }
753 #else
754 /* Configuration of Oversampler: */
755 /* - Oversampling Ratio */
756 /* - Right bit shift */
757 /* - Left bit shift */
758 /* - Triggered mode */
759 /* - Oversampling mode (continued/resumed) */
760 MODIFY_REG(hadc->Instance->CFGR2, ADC_CFGR2_FIELDS,
761 ADC_CFGR2_ROVSE |
762 ((hadc->Init.Oversampling.Ratio - 1UL) << ADC_CFGR2_OVSR_Pos) |
763 hadc->Init.Oversampling.RightBitShift |
764 hadc->Init.Oversampling.TriggeredMode |
765 hadc->Init.Oversampling.OversamplingStopReset);
766 #endif
767
768 }
769 else
770 {
771 /* Disable ADC oversampling scope on ADC group regular */
772 CLEAR_BIT(hadc->Instance->CFGR2, ADC_CFGR2_ROVSE);
773 }
774
775 /* Set the LeftShift parameter: it is applied to the final result with or without oversampling */
776 MODIFY_REG(hadc->Instance->CFGR2, ADC_CFGR2_LSHIFT, hadc->Init.LeftBitShift);
777 #if defined(ADC_VER_V5_V90)
778 if (hadc->Instance != ADC3)
779 {
780 /* Configure the BOOST Mode */
781 ADC_ConfigureBoostMode(hadc);
782 }
783 #else
784 /* Configure the BOOST Mode */
785 ADC_ConfigureBoostMode(hadc);
786 #endif
787 }
788
789 /* Configuration of regular group sequencer: */
790 /* - if scan mode is disabled, regular channels sequence length is set to */
791 /* 0x00: 1 channel converted (channel on regular rank 1) */
792 /* Parameter "NbrOfConversion" is discarded. */
793 /* Note: Scan mode is not present by hardware on this device, but */
794 /* emulated by software for alignment over all STM32 devices. */
795 /* - if scan mode is enabled, regular channels sequence length is set to */
796 /* parameter "NbrOfConversion". */
797
798 if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
799 {
800 /* Set number of ranks in regular group sequencer */
801 MODIFY_REG(hadc->Instance->SQR1, ADC_SQR1_L, (hadc->Init.NbrOfConversion - (uint8_t)1));
802 }
803 else
804 {
805 CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_L);
806 }
807
808 /* Initialize the ADC state */
809 /* Clear HAL_ADC_STATE_BUSY_INTERNAL bit, set HAL_ADC_STATE_READY bit */
810 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL, HAL_ADC_STATE_READY);
811 }
812 else
813 {
814 /* Update ADC state machine to error */
815 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
816
817 tmp_hal_status = HAL_ERROR;
818 }
819
820 /* Return function status */
821 return tmp_hal_status;
822 }
823
824 /**
825 * @brief Deinitialize the ADC peripheral registers to their default reset
826 * values, with deinitialization of the ADC MSP.
827 * @note For devices with several ADCs: reset of ADC common registers is done
828 * only if all ADCs sharing the same common group are disabled.
829 * (function "HAL_ADC_MspDeInit()" is also called under the same conditions:
830 * all ADC instances use the same core clock at RCC level, disabling
831 * the core clock reset all ADC instances).
832 * If this is not the case, reset of these common parameters reset is
833 * bypassed without error reporting: it can be the intended behavior in
834 * case of reset of a single ADC while the other ADCs sharing the same
835 * common group is still running.
836 * @note By default, HAL_ADC_DeInit() set ADC in mode deep power-down:
837 * this saves more power by reducing leakage currents
838 * and is particularly interesting before entering MCU low-power modes.
839 * @param hadc ADC handle
840 * @retval HAL status
841 */
HAL_ADC_DeInit(ADC_HandleTypeDef * hadc)842 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc)
843 {
844 HAL_StatusTypeDef tmp_hal_status;
845
846 /* Check ADC handle */
847 if (hadc == NULL)
848 {
849 return HAL_ERROR;
850 }
851
852 /* Check the parameters */
853 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
854
855 /* Set ADC state */
856 SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
857
858 /* Stop potential conversion on going */
859 tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
860
861 /* Disable ADC peripheral if conversions are effectively stopped */
862 /* Flush register JSQR: reset the queue sequencer when injected */
863 /* queue sequencer is enabled and ADC disabled. */
864 /* The software and hardware triggers of the injected sequence are both */
865 /* internally disabled just after the completion of the last valid */
866 /* injected sequence. */
867 SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQM);
868
869 /* Disable ADC peripheral if conversions are effectively stopped */
870 if (tmp_hal_status == HAL_OK)
871 {
872 /* Disable the ADC peripheral */
873 tmp_hal_status = ADC_Disable(hadc);
874
875 /* Check if ADC is effectively disabled */
876 if (tmp_hal_status == HAL_OK)
877 {
878 /* Change ADC state */
879 hadc->State = HAL_ADC_STATE_READY;
880 }
881 }
882
883 /* Note: HAL ADC deInit is done independently of ADC conversion stop */
884 /* and disable return status. In case of status fail, attempt to */
885 /* perform deinitialization anyway and it is up user code in */
886 /* in HAL_ADC_MspDeInit() to reset the ADC peripheral using */
887 /* system RCC hard reset. */
888
889 /* ========== Reset ADC registers ========== */
890 /* Reset register IER */
891 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD3 | ADC_IT_AWD2 | ADC_IT_AWD1 |
892 ADC_IT_JQOVF | ADC_IT_OVR |
893 ADC_IT_JEOS | ADC_IT_JEOC |
894 ADC_IT_EOS | ADC_IT_EOC |
895 ADC_IT_EOSMP | ADC_IT_RDY));
896
897 /* Reset register ISR */
898 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD3 | ADC_FLAG_AWD2 | ADC_FLAG_AWD1 |
899 ADC_FLAG_JQOVF | ADC_FLAG_OVR |
900 ADC_FLAG_JEOS | ADC_FLAG_JEOC |
901 ADC_FLAG_EOS | ADC_FLAG_EOC |
902 ADC_FLAG_EOSMP | ADC_FLAG_RDY));
903
904 /* Reset register CR */
905 /* Bits ADC_CR_JADSTP, ADC_CR_ADSTP, ADC_CR_JADSTART, ADC_CR_ADSTART,
906 ADC_CR_ADCAL, ADC_CR_ADDIS and ADC_CR_ADEN are in access mode "read-set":
907 no direct reset applicable.
908 Update CR register to reset value where doable by software */
909 CLEAR_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN | ADC_CR_ADCALDIF);
910 SET_BIT(hadc->Instance->CR, ADC_CR_DEEPPWD);
911
912 /* Reset register CFGR */
913 CLEAR_BIT(hadc->Instance->CFGR, ADC_CFGR_AWD1CH | ADC_CFGR_JAUTO | ADC_CFGR_JAWD1EN |
914 ADC_CFGR_AWD1EN | ADC_CFGR_AWD1SGL | ADC_CFGR_JQM |
915 ADC_CFGR_JDISCEN | ADC_CFGR_DISCNUM | ADC_CFGR_DISCEN |
916 ADC_CFGR_AUTDLY | ADC_CFGR_CONT | ADC_CFGR_OVRMOD |
917 ADC_CFGR_EXTEN | ADC_CFGR_EXTSEL |
918 ADC_CFGR_RES | ADC_CFGR_DMNGT);
919 SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQDIS);
920
921 /* Reset register CFGR2 */
922 CLEAR_BIT(hadc->Instance->CFGR2, ADC_CFGR2_ROVSM | ADC_CFGR2_TROVS | ADC_CFGR2_OVSS |
923 ADC_CFGR2_OVSR | ADC_CFGR2_JOVSE | ADC_CFGR2_ROVSE);
924
925 /* Reset register SMPR1 */
926 CLEAR_BIT(hadc->Instance->SMPR1, ADC_SMPR1_FIELDS);
927
928 /* Reset register SMPR2 */
929 CLEAR_BIT(hadc->Instance->SMPR2, ADC_SMPR2_SMP18 | ADC_SMPR2_SMP17 | ADC_SMPR2_SMP16 |
930 ADC_SMPR2_SMP15 | ADC_SMPR2_SMP14 | ADC_SMPR2_SMP13 |
931 ADC_SMPR2_SMP12 | ADC_SMPR2_SMP11 | ADC_SMPR2_SMP10);
932
933 #if defined(ADC_VER_V5_V90)
934 if (hadc->Instance == ADC3)
935 {
936 /* Reset register LTR1 and HTR1 */
937 CLEAR_BIT(hadc->Instance->LTR1_TR1, ADC3_TR1_HT1 | ADC3_TR1_LT1);
938 CLEAR_BIT(hadc->Instance->HTR1_TR2, ADC3_TR2_HT2 | ADC3_TR2_LT2);
939
940 /* Reset register LTR3 and HTR3 */
941 CLEAR_BIT(hadc->Instance->RES1_TR3, ADC3_TR3_HT3 | ADC3_TR3_LT3);
942 }
943 else
944 {
945 CLEAR_BIT(hadc->Instance->LTR1_TR1, ADC_LTR_LT);
946 CLEAR_BIT(hadc->Instance->HTR1_TR2, ADC_HTR_HT);
947
948 /* Reset register LTR2 and HTR2*/
949 CLEAR_BIT(hadc->Instance->LTR2_DIFSEL, ADC_LTR_LT);
950 CLEAR_BIT(hadc->Instance->HTR2_CALFACT, ADC_HTR_HT);
951
952 /* Reset register LTR3 and HTR3 */
953 CLEAR_BIT(hadc->Instance->LTR3_RES10, ADC_LTR_LT);
954 CLEAR_BIT(hadc->Instance->HTR3_RES11, ADC_HTR_HT);
955 }
956 #else
957 /* Reset register LTR1 and HTR1 */
958 CLEAR_BIT(hadc->Instance->LTR1, ADC_LTR_LT);
959 CLEAR_BIT(hadc->Instance->HTR1, ADC_HTR_HT);
960
961 /* Reset register LTR2 and HTR2*/
962 CLEAR_BIT(hadc->Instance->LTR2, ADC_LTR_LT);
963 CLEAR_BIT(hadc->Instance->HTR2, ADC_HTR_HT);
964
965 /* Reset register LTR3 and HTR3 */
966 CLEAR_BIT(hadc->Instance->LTR3, ADC_LTR_LT);
967 CLEAR_BIT(hadc->Instance->HTR3, ADC_HTR_HT);
968 #endif /* ADC_VER_V5_V90 */
969
970
971 /* Reset register SQR1 */
972 CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_SQ4 | ADC_SQR1_SQ3 | ADC_SQR1_SQ2 |
973 ADC_SQR1_SQ1 | ADC_SQR1_L);
974
975 /* Reset register SQR2 */
976 CLEAR_BIT(hadc->Instance->SQR2, ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7 |
977 ADC_SQR2_SQ6 | ADC_SQR2_SQ5);
978
979 /* Reset register SQR3 */
980 CLEAR_BIT(hadc->Instance->SQR3, ADC_SQR3_SQ14 | ADC_SQR3_SQ13 | ADC_SQR3_SQ12 |
981 ADC_SQR3_SQ11 | ADC_SQR3_SQ10);
982
983 /* Reset register SQR4 */
984 CLEAR_BIT(hadc->Instance->SQR4, ADC_SQR4_SQ16 | ADC_SQR4_SQ15);
985
986 /* Register JSQR was reset when the ADC was disabled */
987
988 /* Reset register DR */
989 /* bits in access mode read only, no direct reset applicable*/
990
991 /* Reset register OFR1 */
992 CLEAR_BIT(hadc->Instance->OFR1, ADC_OFR1_SSATE | ADC_OFR1_OFFSET1_CH | ADC_OFR1_OFFSET1);
993 /* Reset register OFR2 */
994 CLEAR_BIT(hadc->Instance->OFR2, ADC_OFR2_SSATE | ADC_OFR2_OFFSET2_CH | ADC_OFR2_OFFSET2);
995 /* Reset register OFR3 */
996 CLEAR_BIT(hadc->Instance->OFR3, ADC_OFR3_SSATE | ADC_OFR3_OFFSET3_CH | ADC_OFR3_OFFSET3);
997 /* Reset register OFR4 */
998 CLEAR_BIT(hadc->Instance->OFR4, ADC_OFR4_SSATE | ADC_OFR4_OFFSET4_CH | ADC_OFR4_OFFSET4);
999
1000 /* Reset registers JDR1, JDR2, JDR3, JDR4 */
1001 /* bits in access mode read only, no direct reset applicable*/
1002
1003 /* Reset register AWD2CR */
1004 CLEAR_BIT(hadc->Instance->AWD2CR, ADC_AWD2CR_AWD2CH);
1005
1006 /* Reset register AWD3CR */
1007 CLEAR_BIT(hadc->Instance->AWD3CR, ADC_AWD3CR_AWD3CH);
1008
1009 #if defined(ADC_VER_V5_V90)
1010 if (hadc->Instance == ADC3)
1011 {
1012 /* Reset register DIFSEL */
1013 CLEAR_BIT(hadc->Instance->LTR2_DIFSEL, ADC_DIFSEL_DIFSEL);
1014
1015 /* Reset register CALFACT */
1016 CLEAR_BIT(hadc->Instance->HTR2_CALFACT, ADC_CALFACT_CALFACT_D | ADC_CALFACT_CALFACT_S);
1017 }
1018 else
1019 {
1020 /* Reset register DIFSEL */
1021 CLEAR_BIT(hadc->Instance->DIFSEL_RES12, ADC_DIFSEL_DIFSEL);
1022
1023 /* Reset register CALFACT */
1024 CLEAR_BIT(hadc->Instance->CALFACT_RES13, ADC_CALFACT_CALFACT_D | ADC_CALFACT_CALFACT_S);
1025 }
1026 #else
1027 /* Reset register DIFSEL */
1028 CLEAR_BIT(hadc->Instance->DIFSEL, ADC_DIFSEL_DIFSEL);
1029
1030 /* Reset register CALFACT */
1031 CLEAR_BIT(hadc->Instance->CALFACT, ADC_CALFACT_CALFACT_D | ADC_CALFACT_CALFACT_S);
1032 #endif /* ADC_VER_V5_V90 */
1033
1034 /* ========== Reset common ADC registers ========== */
1035
1036 /* Software is allowed to change common parameters only when all the other
1037 ADCs are disabled. */
1038 if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) == 0UL)
1039 {
1040 /* Reset configuration of ADC common register CCR:
1041 - clock mode: CKMODE, PRESCEN
1042 - multimode related parameters(when this feature is available): DELAY, DUAL
1043 (set into HAL_ADCEx_MultiModeConfigChannel() API)
1044 - internal measurement paths: Vbat, temperature sensor, Vref (set into
1045 HAL_ADC_ConfigChannel() or HAL_ADCEx_InjectedConfigChannel() )
1046 */
1047 ADC_CLEAR_COMMON_CONTROL_REGISTER(hadc);
1048
1049 /* ========== Hard reset ADC peripheral ========== */
1050 /* Performs a global reset of the entire ADC peripherals instances */
1051 /* sharing the same common ADC instance: ADC state is forced to */
1052 /* a similar state as after device power-on. */
1053 /* Note: A possible implementation is to add RCC bus reset of ADC */
1054 /* (for example, using macro */
1055 /* __HAL_RCC_ADC..._FORCE_RESET()/..._RELEASE_RESET()/..._CLK_DISABLE()) */
1056 /* in function "void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)": */
1057
1058 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1059 if (hadc->MspDeInitCallback == NULL)
1060 {
1061 hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
1062 }
1063
1064 /* DeInit the low level hardware: RCC clock, NVIC */
1065 hadc->MspDeInitCallback(hadc);
1066 #else
1067 /* DeInit the low level hardware: RCC clock, NVIC */
1068 HAL_ADC_MspDeInit(hadc);
1069 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1070
1071 }
1072
1073 /* Set ADC error code to none */
1074 ADC_CLEAR_ERRORCODE(hadc);
1075
1076 /* Reset injected channel configuration parameters */
1077 hadc->InjectionConfig.ContextQueue = 0;
1078 hadc->InjectionConfig.ChannelCount = 0;
1079
1080 /* Set ADC state */
1081 hadc->State = HAL_ADC_STATE_RESET;
1082
1083 /* Process unlocked */
1084 __HAL_UNLOCK(hadc);
1085
1086 /* Return function status */
1087 return tmp_hal_status;
1088 }
1089
1090 /**
1091 * @brief Initialize the ADC MSP.
1092 * @param hadc ADC handle
1093 * @retval None
1094 */
HAL_ADC_MspInit(ADC_HandleTypeDef * hadc)1095 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
1096 {
1097 /* Prevent unused argument(s) compilation warning */
1098 UNUSED(hadc);
1099
1100 /* NOTE : This function should not be modified. When the callback is needed,
1101 function HAL_ADC_MspInit must be implemented in the user file.
1102 */
1103 }
1104
1105 /**
1106 * @brief DeInitialize the ADC MSP.
1107 * @param hadc ADC handle
1108 * @note All ADC instances use the same core clock at RCC level, disabling
1109 * the core clock reset all ADC instances).
1110 * @retval None
1111 */
HAL_ADC_MspDeInit(ADC_HandleTypeDef * hadc)1112 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
1113 {
1114 /* Prevent unused argument(s) compilation warning */
1115 UNUSED(hadc);
1116
1117 /* NOTE : This function should not be modified. When the callback is needed,
1118 function HAL_ADC_MspDeInit must be implemented in the user file.
1119 */
1120 }
1121
1122 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
1123 /**
1124 * @brief Register a User ADC Callback
1125 * To be used instead of the weak predefined callback
1126 * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
1127 * the configuration information for the specified ADC.
1128 * @param CallbackID ID of the callback to be registered
1129 * This parameter can be one of the following values:
1130 * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
1131 * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
1132 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
1133 * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
1134 * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID
1135 * @arg @ref HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID ADC group injected context queue overflow callback ID
1136 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
1137 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
1138 * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
1139 * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
1140 * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
1141 * @param pCallback pointer to the Callback function
1142 * @retval HAL status
1143 */
HAL_ADC_RegisterCallback(ADC_HandleTypeDef * hadc,HAL_ADC_CallbackIDTypeDef CallbackID,pADC_CallbackTypeDef pCallback)1144 HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback)
1145 {
1146 HAL_StatusTypeDef status = HAL_OK;
1147
1148 if (pCallback == NULL)
1149 {
1150 /* Update the error code */
1151 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1152
1153 return HAL_ERROR;
1154 }
1155
1156 if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
1157 {
1158 switch (CallbackID)
1159 {
1160 case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
1161 hadc->ConvCpltCallback = pCallback;
1162 break;
1163
1164 case HAL_ADC_CONVERSION_HALF_CB_ID :
1165 hadc->ConvHalfCpltCallback = pCallback;
1166 break;
1167
1168 case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
1169 hadc->LevelOutOfWindowCallback = pCallback;
1170 break;
1171
1172 case HAL_ADC_ERROR_CB_ID :
1173 hadc->ErrorCallback = pCallback;
1174 break;
1175
1176 case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
1177 hadc->InjectedConvCpltCallback = pCallback;
1178 break;
1179
1180 case HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID :
1181 hadc->InjectedQueueOverflowCallback = pCallback;
1182 break;
1183
1184 case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
1185 hadc->LevelOutOfWindow2Callback = pCallback;
1186 break;
1187
1188 case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
1189 hadc->LevelOutOfWindow3Callback = pCallback;
1190 break;
1191
1192 case HAL_ADC_END_OF_SAMPLING_CB_ID :
1193 hadc->EndOfSamplingCallback = pCallback;
1194 break;
1195
1196 case HAL_ADC_MSPINIT_CB_ID :
1197 hadc->MspInitCallback = pCallback;
1198 break;
1199
1200 case HAL_ADC_MSPDEINIT_CB_ID :
1201 hadc->MspDeInitCallback = pCallback;
1202 break;
1203
1204 default :
1205 /* Update the error code */
1206 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1207
1208 /* Return error status */
1209 status = HAL_ERROR;
1210 break;
1211 }
1212 }
1213 else if (HAL_ADC_STATE_RESET == hadc->State)
1214 {
1215 switch (CallbackID)
1216 {
1217 case HAL_ADC_MSPINIT_CB_ID :
1218 hadc->MspInitCallback = pCallback;
1219 break;
1220
1221 case HAL_ADC_MSPDEINIT_CB_ID :
1222 hadc->MspDeInitCallback = pCallback;
1223 break;
1224
1225 default :
1226 /* Update the error code */
1227 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1228
1229 /* Return error status */
1230 status = HAL_ERROR;
1231 break;
1232 }
1233 }
1234 else
1235 {
1236 /* Update the error code */
1237 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1238
1239 /* Return error status */
1240 status = HAL_ERROR;
1241 }
1242
1243 return status;
1244 }
1245
1246 /**
1247 * @brief Unregister a ADC Callback
1248 * ADC callback is redirected to the weak predefined callback
1249 * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
1250 * the configuration information for the specified ADC.
1251 * @param CallbackID ID of the callback to be unregistered
1252 * This parameter can be one of the following values:
1253 * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
1254 * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
1255 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
1256 * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
1257 * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID
1258 * @arg @ref HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID ADC group injected context queue overflow callback ID
1259 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
1260 * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
1261 * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
1262 * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
1263 * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
1264 * @retval HAL status
1265 */
HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef * hadc,HAL_ADC_CallbackIDTypeDef CallbackID)1266 HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID)
1267 {
1268 HAL_StatusTypeDef status = HAL_OK;
1269
1270 if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
1271 {
1272 switch (CallbackID)
1273 {
1274 case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
1275 hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback;
1276 break;
1277
1278 case HAL_ADC_CONVERSION_HALF_CB_ID :
1279 hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback;
1280 break;
1281
1282 case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
1283 hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback;
1284 break;
1285
1286 case HAL_ADC_ERROR_CB_ID :
1287 hadc->ErrorCallback = HAL_ADC_ErrorCallback;
1288 break;
1289
1290 case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
1291 hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback;
1292 break;
1293
1294 case HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID :
1295 hadc->InjectedQueueOverflowCallback = HAL_ADCEx_InjectedQueueOverflowCallback;
1296 break;
1297
1298 case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
1299 hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback;
1300 break;
1301
1302 case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
1303 hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback;
1304 break;
1305
1306 case HAL_ADC_END_OF_SAMPLING_CB_ID :
1307 hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback;
1308 break;
1309
1310 case HAL_ADC_MSPINIT_CB_ID :
1311 hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
1312 break;
1313
1314 case HAL_ADC_MSPDEINIT_CB_ID :
1315 hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
1316 break;
1317
1318 default :
1319 /* Update the error code */
1320 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1321
1322 /* Return error status */
1323 status = HAL_ERROR;
1324 break;
1325 }
1326 }
1327 else if (HAL_ADC_STATE_RESET == hadc->State)
1328 {
1329 switch (CallbackID)
1330 {
1331 case HAL_ADC_MSPINIT_CB_ID :
1332 hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
1333 break;
1334
1335 case HAL_ADC_MSPDEINIT_CB_ID :
1336 hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
1337 break;
1338
1339 default :
1340 /* Update the error code */
1341 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1342
1343 /* Return error status */
1344 status = HAL_ERROR;
1345 break;
1346 }
1347 }
1348 else
1349 {
1350 /* Update the error code */
1351 hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
1352
1353 /* Return error status */
1354 status = HAL_ERROR;
1355 }
1356
1357 return status;
1358 }
1359
1360 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
1361
1362 /**
1363 * @}
1364 */
1365
1366 /** @defgroup ADC_Exported_Functions_Group2 ADC Input and Output operation functions
1367 * @brief ADC IO operation functions
1368 *
1369 @verbatim
1370 ===============================================================================
1371 ##### IO operation functions #####
1372 ===============================================================================
1373 [..] This section provides functions allowing to:
1374 (+) Start conversion of regular group.
1375 (+) Stop conversion of regular group.
1376 (+) Poll for conversion complete on regular group.
1377 (+) Poll for conversion event.
1378 (+) Get result of regular channel conversion.
1379 (+) Start conversion of regular group and enable interruptions.
1380 (+) Stop conversion of regular group and disable interruptions.
1381 (+) Handle ADC interrupt request
1382 (+) Start conversion of regular group and enable DMA transfer.
1383 (+) Stop conversion of regular group and disable ADC DMA transfer.
1384 @endverbatim
1385 * @{
1386 */
1387
1388 /**
1389 * @brief Enable ADC, start conversion of regular group.
1390 * @note Interruptions enabled in this function: None.
1391 * @note Case of multimode enabled (when multimode feature is available):
1392 * if ADC is Slave, ADC is enabled but conversion is not started,
1393 * if ADC is master, ADC is enabled and multimode conversion is started.
1394 * @param hadc ADC handle
1395 * @retval HAL status
1396 */
HAL_ADC_Start(ADC_HandleTypeDef * hadc)1397 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
1398 {
1399 HAL_StatusTypeDef tmp_hal_status;
1400 const ADC_TypeDef *tmpADC_Master;
1401 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
1402
1403 /* Check the parameters */
1404 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1405
1406 /* Perform ADC enable and conversion start if no conversion is on going */
1407 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
1408 {
1409 /* Process locked */
1410 __HAL_LOCK(hadc);
1411
1412 /* Enable the ADC peripheral */
1413 tmp_hal_status = ADC_Enable(hadc);
1414
1415 /* Start conversion if ADC is effectively enabled */
1416 if (tmp_hal_status == HAL_OK)
1417 {
1418 /* Set ADC state */
1419 /* - Clear state bitfield related to regular group conversion results */
1420 /* - Set state bitfield related to regular operation */
1421 ADC_STATE_CLR_SET(hadc->State,
1422 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
1423 HAL_ADC_STATE_REG_BUSY);
1424
1425 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
1426 - if ADC instance is master or if multimode feature is not available
1427 - if multimode setting is disabled (ADC instance slave in independent mode) */
1428 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
1429 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1430 )
1431 {
1432 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
1433 }
1434
1435 /* Set ADC error code */
1436 /* Check if a conversion is on going on ADC group injected */
1437 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1438 {
1439 /* Reset ADC error code fields related to regular conversions only */
1440 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
1441 }
1442 else
1443 {
1444 /* Reset all ADC error code fields */
1445 ADC_CLEAR_ERRORCODE(hadc);
1446 }
1447
1448 /* Clear ADC group regular conversion flag and overrun flag */
1449 /* (To ensure of no unknown state from potential previous ADC operations) */
1450 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
1451
1452 /* Process unlocked */
1453 /* Unlock before starting ADC conversions: in case of potential */
1454 /* interruption, to let the process to ADC IRQ Handler. */
1455 __HAL_UNLOCK(hadc);
1456
1457 /* Enable conversion of regular group. */
1458 /* If software start has been selected, conversion starts immediately. */
1459 /* If external trigger has been selected, conversion will start at next */
1460 /* trigger event. */
1461 /* Case of multimode enabled (when multimode feature is available): */
1462 /* - if ADC is slave and dual regular conversions are enabled, ADC is */
1463 /* enabled only (conversion is not started), */
1464 /* - if ADC is master, ADC is enabled and conversion is started. */
1465 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
1466 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1467 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
1468 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
1469 )
1470 {
1471 /* ADC instance is not a multimode slave instance with multimode regular conversions enabled */
1472 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
1473 {
1474 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1475 }
1476
1477 /* Start ADC group regular conversion */
1478 LL_ADC_REG_StartConversion(hadc->Instance);
1479 }
1480 else
1481 {
1482 /* ADC instance is a multimode slave instance with multimode regular conversions enabled */
1483 SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
1484 /* if Master ADC JAUTO bit is set, update Slave State in setting
1485 HAL_ADC_STATE_INJ_BUSY bit and in resetting HAL_ADC_STATE_INJ_EOC bit */
1486 tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
1487 if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != 0UL)
1488 {
1489 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1490 }
1491
1492 }
1493 }
1494 else
1495 {
1496 /* Process unlocked */
1497 __HAL_UNLOCK(hadc);
1498 }
1499 }
1500 else
1501 {
1502 tmp_hal_status = HAL_BUSY;
1503 }
1504
1505 /* Return function status */
1506 return tmp_hal_status;
1507 }
1508
1509 /**
1510 * @brief Stop ADC conversion of regular group (and injected channels in
1511 * case of auto_injection mode), disable ADC peripheral.
1512 * @note: ADC peripheral disable is forcing stop of potential
1513 * conversion on injected group. If injected group is under use, it
1514 * should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
1515 * @param hadc ADC handle
1516 * @retval HAL status.
1517 */
HAL_ADC_Stop(ADC_HandleTypeDef * hadc)1518 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
1519 {
1520 HAL_StatusTypeDef tmp_hal_status;
1521
1522 /* Check the parameters */
1523 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1524
1525 /* Process locked */
1526 __HAL_LOCK(hadc);
1527
1528 /* 1. Stop potential conversion on going, on ADC groups regular and injected */
1529 tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
1530
1531 /* Disable ADC peripheral if conversions are effectively stopped */
1532 if (tmp_hal_status == HAL_OK)
1533 {
1534 /* 2. Disable the ADC peripheral */
1535 tmp_hal_status = ADC_Disable(hadc);
1536
1537 /* Check if ADC is effectively disabled */
1538 if (tmp_hal_status == HAL_OK)
1539 {
1540 /* Set ADC state */
1541 ADC_STATE_CLR_SET(hadc->State,
1542 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
1543 HAL_ADC_STATE_READY);
1544 }
1545 }
1546
1547 /* Process unlocked */
1548 __HAL_UNLOCK(hadc);
1549
1550 /* Return function status */
1551 return tmp_hal_status;
1552 }
1553
1554 /**
1555 * @brief Wait for regular group conversion to be completed.
1556 * @note ADC conversion flags EOS (end of sequence) and EOC (end of
1557 * conversion) are cleared by this function, with an exception:
1558 * if low power feature "LowPowerAutoWait" is enabled, flags are
1559 * not cleared to not interfere with this feature until data register
1560 * is read using function HAL_ADC_GetValue().
1561 * @note This function cannot be used in a particular setup: ADC configured
1562 * in DMA mode and polling for end of each conversion (ADC init
1563 * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
1564 * In this case, DMA resets the flag EOC and polling cannot be
1565 * performed on each conversion. Nevertheless, polling can still
1566 * be performed on the complete sequence (ADC init
1567 * parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
1568 * @param hadc ADC handle
1569 * @param Timeout Timeout value in millisecond.
1570 * @retval HAL status
1571 */
HAL_ADC_PollForConversion(ADC_HandleTypeDef * hadc,uint32_t Timeout)1572 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
1573 {
1574 uint32_t tickstart;
1575 uint32_t tmp_Flag_End;
1576 uint32_t tmp_cfgr;
1577 const ADC_TypeDef *tmpADC_Master;
1578 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
1579
1580 /* Check the parameters */
1581 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1582
1583 /* If end of conversion selected to end of sequence conversions */
1584 if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
1585 {
1586 tmp_Flag_End = ADC_FLAG_EOS;
1587 }
1588 /* If end of conversion selected to end of unitary conversion */
1589 else /* ADC_EOC_SINGLE_CONV */
1590 {
1591 /* Verification that ADC configuration is compliant with polling for */
1592 /* each conversion: */
1593 /* Particular case is ADC configured in DMA mode and ADC sequencer with */
1594 /* several ranks and polling for end of each conversion. */
1595 /* For code simplicity sake, this particular case is generalized to */
1596 /* ADC configured in DMA mode and and polling for end of each conversion. */
1597 if ((tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1598 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
1599 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
1600 )
1601 {
1602 /* Check DMNGT bit in handle ADC CFGR register */
1603 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMNGT_0) != 0UL)
1604 {
1605 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
1606 return HAL_ERROR;
1607 }
1608 else
1609 {
1610 tmp_Flag_End = (ADC_FLAG_EOC);
1611 }
1612 }
1613 else
1614 {
1615 /* Check ADC DMA mode in multimode on ADC group regular */
1616 if (LL_ADC_GetMultiDMATransfer(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) != LL_ADC_MULTI_REG_DMA_EACH_ADC)
1617 {
1618 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
1619 return HAL_ERROR;
1620 }
1621 else
1622 {
1623 tmp_Flag_End = (ADC_FLAG_EOC);
1624 }
1625 }
1626 }
1627
1628 /* Get tick count */
1629 tickstart = HAL_GetTick();
1630
1631 /* Wait until End of unitary conversion or sequence conversions flag is raised */
1632 while ((hadc->Instance->ISR & tmp_Flag_End) == 0UL)
1633 {
1634 /* Check if timeout is disabled (set to infinite wait) */
1635 if (Timeout != HAL_MAX_DELAY)
1636 {
1637 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1638 {
1639 /* New check to avoid false timeout detection in case of preemption */
1640 if((hadc->Instance->ISR & tmp_Flag_End) == 0UL)
1641 {
1642 /* Update ADC state machine to timeout */
1643 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1644
1645 /* Process unlocked */
1646 __HAL_UNLOCK(hadc);
1647
1648 return HAL_TIMEOUT;
1649 }
1650 }
1651 }
1652 }
1653
1654 /* Update ADC state machine */
1655 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
1656
1657 /* Determine whether any further conversion upcoming on group regular */
1658 /* by external trigger, continuous mode or scan sequence on going. */
1659 if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
1660 && (hadc->Init.ContinuousConvMode == DISABLE)
1661 )
1662 {
1663 /* Check whether end of sequence is reached */
1664 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
1665 {
1666 /* Set ADC state */
1667 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
1668
1669 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
1670 {
1671 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
1672 }
1673 }
1674 }
1675
1676 /* Get relevant register CFGR in ADC instance of ADC master or slave */
1677 /* in function of multimode state (for devices with multimode */
1678 /* available). */
1679 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
1680 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1681 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
1682 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
1683 )
1684 {
1685 /* Retrieve handle ADC CFGR register */
1686 tmp_cfgr = READ_REG(hadc->Instance->CFGR);
1687 }
1688 else
1689 {
1690 /* Retrieve Master ADC CFGR register */
1691 tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
1692 tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
1693 }
1694
1695 /* Clear polled flag */
1696 if (tmp_Flag_End == ADC_FLAG_EOS)
1697 {
1698 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS);
1699 }
1700 else
1701 {
1702 /* Clear end of conversion EOC flag of regular group if low power feature */
1703 /* "LowPowerAutoWait " is disabled, to not interfere with this feature */
1704 /* until data register is read using function HAL_ADC_GetValue(). */
1705 if (READ_BIT(tmp_cfgr, ADC_CFGR_AUTDLY) == 0UL)
1706 {
1707 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
1708 }
1709 }
1710
1711 /* Return function status */
1712 return HAL_OK;
1713 }
1714
1715 /**
1716 * @brief Poll for ADC event.
1717 * @param hadc ADC handle
1718 * @param EventType the ADC event type.
1719 * This parameter can be one of the following values:
1720 * @arg @ref ADC_EOSMP_EVENT ADC End of Sampling event
1721 * @arg @ref ADC_AWD1_EVENT ADC Analog watchdog 1 event (main analog watchdog, present on all STM32 devices)
1722 * @arg @ref ADC_AWD2_EVENT ADC Analog watchdog 2 event (additional analog watchdog, not present on all STM32 families)
1723 * @arg @ref ADC_AWD3_EVENT ADC Analog watchdog 3 event (additional analog watchdog, not present on all STM32 families)
1724 * @arg @ref ADC_OVR_EVENT ADC Overrun event
1725 * @arg @ref ADC_JQOVF_EVENT ADC Injected context queue overflow event
1726 * @param Timeout Timeout value in millisecond.
1727 * @note The relevant flag is cleared if found to be set, except for ADC_FLAG_OVR.
1728 * Indeed, the latter is reset only if hadc->Init.Overrun field is set
1729 * to ADC_OVR_DATA_OVERWRITTEN. Otherwise, data register may be potentially overwritten
1730 * by a new converted data as soon as OVR is cleared.
1731 * To reset OVR flag once the preserved data is retrieved, the user can resort
1732 * to macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1733 * @retval HAL status
1734 */
HAL_ADC_PollForEvent(ADC_HandleTypeDef * hadc,uint32_t EventType,uint32_t Timeout)1735 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout)
1736 {
1737 uint32_t tickstart;
1738
1739 /* Check the parameters */
1740 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1741 assert_param(IS_ADC_EVENT_TYPE(EventType));
1742
1743 /* Get tick count */
1744 tickstart = HAL_GetTick();
1745
1746 /* Check selected event flag */
1747 while (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
1748 {
1749 /* Check if timeout is disabled (set to infinite wait) */
1750 if (Timeout != HAL_MAX_DELAY)
1751 {
1752 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1753 {
1754 /* New check to avoid false timeout detection in case of preemption */
1755 if(__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
1756 {
1757 /* Update ADC state machine to timeout */
1758 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1759
1760 /* Process unlocked */
1761 __HAL_UNLOCK(hadc);
1762
1763 return HAL_TIMEOUT;
1764 }
1765 }
1766 }
1767 }
1768
1769 switch (EventType)
1770 {
1771 /* End Of Sampling event */
1772 case ADC_EOSMP_EVENT:
1773 /* Set ADC state */
1774 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
1775
1776 /* Clear the End Of Sampling flag */
1777 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
1778
1779 break;
1780
1781 /* Analog watchdog (level out of window) event */
1782 /* Note: In case of several analog watchdog enabled, if needed to know */
1783 /* which one triggered and on which ADCx, test ADC state of analog watchdog */
1784 /* flags HAL_ADC_STATE_AWD1/2/3 using function "HAL_ADC_GetState()". */
1785 /* For example: */
1786 /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) " */
1787 /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD2) != 0UL) " */
1788 /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD3) != 0UL) " */
1789
1790 /* Check analog watchdog 1 flag */
1791 case ADC_AWD_EVENT:
1792 /* Set ADC state */
1793 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
1794
1795 /* Clear ADC analog watchdog flag */
1796 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
1797
1798 break;
1799
1800 /* Check analog watchdog 2 flag */
1801 case ADC_AWD2_EVENT:
1802 /* Set ADC state */
1803 SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
1804
1805 /* Clear ADC analog watchdog flag */
1806 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
1807
1808 break;
1809
1810 /* Check analog watchdog 3 flag */
1811 case ADC_AWD3_EVENT:
1812 /* Set ADC state */
1813 SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
1814
1815 /* Clear ADC analog watchdog flag */
1816 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
1817
1818 break;
1819
1820 /* Injected context queue overflow event */
1821 case ADC_JQOVF_EVENT:
1822 /* Set ADC state */
1823 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF);
1824
1825 /* Set ADC error code to Injected context queue overflow */
1826 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF);
1827
1828 /* Clear ADC Injected context queue overflow flag */
1829 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF);
1830
1831 break;
1832
1833 /* Overrun event */
1834 default: /* Case ADC_OVR_EVENT */
1835 /* If overrun is set to overwrite previous data, overrun event is not */
1836 /* considered as an error. */
1837 /* (cf ref manual "Managing conversions without using the DMA and without */
1838 /* overrun ") */
1839 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
1840 {
1841 /* Set ADC state */
1842 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
1843
1844 /* Set ADC error code to overrun */
1845 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
1846 }
1847 else
1848 {
1849 /* Clear ADC Overrun flag only if Overrun is set to ADC_OVR_DATA_OVERWRITTEN
1850 otherwise, data register is potentially overwritten by new converted data as soon
1851 as OVR is cleared. */
1852 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
1853 }
1854 break;
1855 }
1856
1857 /* Return function status */
1858 return HAL_OK;
1859 }
1860
1861 /**
1862 * @brief Enable ADC, start conversion of regular group with interruption.
1863 * @note Interruptions enabled in this function according to initialization
1864 * setting : EOC (end of conversion), EOS (end of sequence),
1865 * OVR overrun.
1866 * Each of these interruptions has its dedicated callback function.
1867 * @note Case of multimode enabled (when multimode feature is available):
1868 * HAL_ADC_Start_IT() must be called for ADC Slave first, then for
1869 * ADC Master.
1870 * For ADC Slave, ADC is enabled only (conversion is not started).
1871 * For ADC Master, ADC is enabled and multimode conversion is started.
1872 * @note To guarantee a proper reset of all interruptions once all the needed
1873 * conversions are obtained, HAL_ADC_Stop_IT() must be called to ensure
1874 * a correct stop of the IT-based conversions.
1875 * @note By default, HAL_ADC_Start_IT() does not enable the End Of Sampling
1876 * interruption. If required (e.g. in case of oversampling with trigger
1877 * mode), the user must:
1878 * 1. first clear the EOSMP flag if set with macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP)
1879 * 2. then enable the EOSMP interrupt with macro __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOSMP)
1880 * before calling HAL_ADC_Start_IT().
1881 * @param hadc ADC handle
1882 * @retval HAL status
1883 */
HAL_ADC_Start_IT(ADC_HandleTypeDef * hadc)1884 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
1885 {
1886 HAL_StatusTypeDef tmp_hal_status;
1887 const ADC_TypeDef *tmpADC_Master;
1888 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
1889
1890 /* Check the parameters */
1891 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
1892
1893 /* Perform ADC enable and conversion start if no conversion is on going */
1894 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
1895 {
1896 /* Process locked */
1897 __HAL_LOCK(hadc);
1898
1899 /* Enable the ADC peripheral */
1900 tmp_hal_status = ADC_Enable(hadc);
1901
1902 /* Start conversion if ADC is effectively enabled */
1903 if (tmp_hal_status == HAL_OK)
1904 {
1905 /* Set ADC state */
1906 /* - Clear state bitfield related to regular group conversion results */
1907 /* - Set state bitfield related to regular operation */
1908 ADC_STATE_CLR_SET(hadc->State,
1909 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
1910 HAL_ADC_STATE_REG_BUSY);
1911
1912 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
1913 - if ADC instance is master or if multimode feature is not available
1914 - if multimode setting is disabled (ADC instance slave in independent mode) */
1915 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
1916 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1917 )
1918 {
1919 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
1920 }
1921
1922 /* Set ADC error code */
1923 /* Check if a conversion is on going on ADC group injected */
1924 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) != 0UL)
1925 {
1926 /* Reset ADC error code fields related to regular conversions only */
1927 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
1928 }
1929 else
1930 {
1931 /* Reset all ADC error code fields */
1932 ADC_CLEAR_ERRORCODE(hadc);
1933 }
1934
1935 /* Clear ADC group regular conversion flag and overrun flag */
1936 /* (To ensure of no unknown state from potential previous ADC operations) */
1937 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
1938
1939 /* Process unlocked */
1940 /* Unlock before starting ADC conversions: in case of potential */
1941 /* interruption, to let the process to ADC IRQ Handler. */
1942 __HAL_UNLOCK(hadc);
1943
1944 /* Disable all interruptions before enabling the desired ones */
1945 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
1946
1947 /* Enable ADC end of conversion interrupt */
1948 switch (hadc->Init.EOCSelection)
1949 {
1950 case ADC_EOC_SEQ_CONV:
1951 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOS);
1952 break;
1953 /* case ADC_EOC_SINGLE_CONV */
1954 default:
1955 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOC);
1956 break;
1957 }
1958
1959 /* Enable ADC overrun interrupt */
1960 /* If hadc->Init.Overrun is set to ADC_OVR_DATA_PRESERVED, only then is
1961 ADC_IT_OVR enabled; otherwise data overwrite is considered as normal
1962 behavior and no CPU time is lost for a non-processed interruption */
1963 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
1964 {
1965 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
1966 }
1967
1968 /* Enable conversion of regular group. */
1969 /* If software start has been selected, conversion starts immediately. */
1970 /* If external trigger has been selected, conversion will start at next */
1971 /* trigger event. */
1972 /* Case of multimode enabled (when multimode feature is available): */
1973 /* - if ADC is slave and dual regular conversions are enabled, ADC is */
1974 /* enabled only (conversion is not started), */
1975 /* - if ADC is master, ADC is enabled and conversion is started. */
1976 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
1977 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
1978 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
1979 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
1980 )
1981 {
1982 /* ADC instance is not a multimode slave instance with multimode regular conversions enabled */
1983 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
1984 {
1985 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
1986
1987 /* Enable as well injected interruptions in case
1988 HAL_ADCEx_InjectedStart_IT() has not been called beforehand. This
1989 allows to start regular and injected conversions when JAUTO is
1990 set with a single call to HAL_ADC_Start_IT() */
1991 switch (hadc->Init.EOCSelection)
1992 {
1993 case ADC_EOC_SEQ_CONV:
1994 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
1995 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS);
1996 break;
1997 /* case ADC_EOC_SINGLE_CONV */
1998 default:
1999 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS);
2000 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
2001 break;
2002 }
2003 }
2004
2005 /* Start ADC group regular conversion */
2006 LL_ADC_REG_StartConversion(hadc->Instance);
2007 }
2008 else
2009 {
2010 /* ADC instance is a multimode slave instance with multimode regular conversions enabled */
2011 SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
2012 /* if Master ADC JAUTO bit is set, Slave injected interruptions
2013 are enabled nevertheless (for same reason as above) */
2014 tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
2015 if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != 0UL)
2016 {
2017 /* First, update Slave State in setting HAL_ADC_STATE_INJ_BUSY bit
2018 and in resetting HAL_ADC_STATE_INJ_EOC bit */
2019 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
2020 /* Next, set Slave injected interruptions */
2021 switch (hadc->Init.EOCSelection)
2022 {
2023 case ADC_EOC_SEQ_CONV:
2024 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
2025 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS);
2026 break;
2027 /* case ADC_EOC_SINGLE_CONV */
2028 default:
2029 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS);
2030 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
2031 break;
2032 }
2033 }
2034 }
2035 }
2036 else
2037 {
2038 /* Process unlocked */
2039 __HAL_UNLOCK(hadc);
2040 }
2041
2042 }
2043 else
2044 {
2045 tmp_hal_status = HAL_BUSY;
2046 }
2047
2048 /* Return function status */
2049 return tmp_hal_status;
2050 }
2051
2052 /**
2053 * @brief Stop ADC conversion of regular group (and injected group in
2054 * case of auto_injection mode), disable interrution of
2055 * end-of-conversion, disable ADC peripheral.
2056 * @param hadc ADC handle
2057 * @retval HAL status.
2058 */
HAL_ADC_Stop_IT(ADC_HandleTypeDef * hadc)2059 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
2060 {
2061 HAL_StatusTypeDef tmp_hal_status;
2062
2063 /* Check the parameters */
2064 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2065
2066 /* Process locked */
2067 __HAL_LOCK(hadc);
2068
2069 /* 1. Stop potential conversion on going, on ADC groups regular and injected */
2070 tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
2071
2072 /* Disable ADC peripheral if conversions are effectively stopped */
2073 if (tmp_hal_status == HAL_OK)
2074 {
2075 /* Disable ADC end of conversion interrupt for regular group */
2076 /* Disable ADC overrun interrupt */
2077 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
2078
2079 /* 2. Disable the ADC peripheral */
2080 tmp_hal_status = ADC_Disable(hadc);
2081
2082 /* Check if ADC is effectively disabled */
2083 if (tmp_hal_status == HAL_OK)
2084 {
2085 /* Set ADC state */
2086 ADC_STATE_CLR_SET(hadc->State,
2087 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
2088 HAL_ADC_STATE_READY);
2089 }
2090 }
2091
2092 /* Process unlocked */
2093 __HAL_UNLOCK(hadc);
2094
2095 /* Return function status */
2096 return tmp_hal_status;
2097 }
2098
2099 /**
2100 * @brief Enable ADC, start conversion of regular group and transfer result through DMA.
2101 * @note Interruptions enabled in this function:
2102 * overrun (if applicable), DMA half transfer, DMA transfer complete.
2103 * Each of these interruptions has its dedicated callback function.
2104 * @note Case of multimode enabled (when multimode feature is available): HAL_ADC_Start_DMA()
2105 * is designed for single-ADC mode only. For multimode, the dedicated
2106 * HAL_ADCEx_MultiModeStart_DMA() function must be used.
2107 * @param hadc ADC handle
2108 * @param pData Destination Buffer address.
2109 * @param Length Number of data to be transferred from ADC peripheral to memory
2110 * @retval HAL status.
2111 */
HAL_ADC_Start_DMA(ADC_HandleTypeDef * hadc,uint32_t * pData,uint32_t Length)2112 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
2113 {
2114 HAL_StatusTypeDef tmp_hal_status;
2115 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
2116
2117 /* Check the parameters */
2118 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2119
2120 /* Perform ADC enable and conversion start if no conversion is on going */
2121 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
2122 {
2123 /* Process locked */
2124 __HAL_LOCK(hadc);
2125
2126 /* Ensure that multimode regular conversions are not enabled. */
2127 /* Otherwise, dedicated API HAL_ADCEx_MultiModeStart_DMA() must be used. */
2128 if ((tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
2129 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
2130 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
2131 )
2132 {
2133 /* Enable the ADC peripheral */
2134 tmp_hal_status = ADC_Enable(hadc);
2135
2136 /* Start conversion if ADC is effectively enabled */
2137 if (tmp_hal_status == HAL_OK)
2138 {
2139 /* Set ADC state */
2140 /* - Clear state bitfield related to regular group conversion results */
2141 /* - Set state bitfield related to regular operation */
2142 ADC_STATE_CLR_SET(hadc->State,
2143 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
2144 HAL_ADC_STATE_REG_BUSY);
2145
2146 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
2147 - if ADC instance is master or if multimode feature is not available
2148 - if multimode setting is disabled (ADC instance slave in independent mode) */
2149 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
2150 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
2151 )
2152 {
2153 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
2154 }
2155
2156 /* Check if a conversion is on going on ADC group injected */
2157 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) != 0UL)
2158 {
2159 /* Reset ADC error code fields related to regular conversions only */
2160 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
2161 }
2162 else
2163 {
2164 /* Reset all ADC error code fields */
2165 ADC_CLEAR_ERRORCODE(hadc);
2166 }
2167
2168 /* Set the DMA transfer complete callback */
2169 hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
2170
2171 /* Set the DMA half transfer complete callback */
2172 hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
2173
2174 /* Set the DMA error callback */
2175 hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
2176
2177
2178 /* Manage ADC and DMA start: ADC overrun interruption, DMA start, */
2179 /* ADC start (in case of SW start): */
2180
2181 /* Clear regular group conversion flag and overrun flag */
2182 /* (To ensure of no unknown state from potential previous ADC */
2183 /* operations) */
2184 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
2185
2186 /* Process unlocked */
2187 /* Unlock before starting ADC conversions: in case of potential */
2188 /* interruption, to let the process to ADC IRQ Handler. */
2189 __HAL_UNLOCK(hadc);
2190
2191 /* With DMA, overrun event is always considered as an error even if
2192 hadc->Init.Overrun is set to ADC_OVR_DATA_OVERWRITTEN. Therefore,
2193 ADC_IT_OVR is enabled. */
2194 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
2195
2196 /* Enable ADC DMA mode*/
2197 #if defined(ADC_VER_V5_V90)
2198 if (hadc->Instance == ADC3)
2199 {
2200 LL_ADC_REG_SetDMATransferMode(hadc->Instance, ADC3_CFGR_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests));
2201 LL_ADC_EnableDMAReq(hadc->Instance);
2202 }
2203 else
2204 {
2205 LL_ADC_REG_SetDataTransferMode(hadc->Instance, ADC_CFGR_DMACONTREQ((uint32_t)hadc->Init.ConversionDataManagement));
2206 }
2207
2208 #else
2209 LL_ADC_REG_SetDataTransferMode(hadc->Instance, (uint32_t)hadc->Init.ConversionDataManagement);
2210 #endif
2211
2212
2213 /* Start the DMA channel */
2214 tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
2215
2216 /* Enable conversion of regular group. */
2217 /* If software start has been selected, conversion starts immediately. */
2218 /* If external trigger has been selected, conversion will start at next */
2219 /* trigger event. */
2220 /* Start ADC group regular conversion */
2221 LL_ADC_REG_StartConversion(hadc->Instance);
2222 }
2223 else
2224 {
2225 /* Process unlocked */
2226 __HAL_UNLOCK(hadc);
2227 }
2228
2229 }
2230 else
2231 {
2232 tmp_hal_status = HAL_ERROR;
2233 /* Process unlocked */
2234 __HAL_UNLOCK(hadc);
2235 }
2236 }
2237 else
2238 {
2239 tmp_hal_status = HAL_BUSY;
2240 }
2241
2242 /* Return function status */
2243 return tmp_hal_status;
2244 }
2245
2246 /**
2247 * @brief Stop ADC conversion of regular group (and injected group in
2248 * case of auto_injection mode), disable ADC DMA transfer, disable
2249 * ADC peripheral.
2250 * @note: ADC peripheral disable is forcing stop of potential
2251 * conversion on ADC group injected. If ADC group injected is under use, it
2252 * should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
2253 * @note Case of multimode enabled (when multimode feature is available):
2254 * HAL_ADC_Stop_DMA() function is dedicated to single-ADC mode only.
2255 * For multimode, the dedicated HAL_ADCEx_MultiModeStop_DMA() API must be used.
2256 * @param hadc ADC handle
2257 * @retval HAL status.
2258 */
HAL_ADC_Stop_DMA(ADC_HandleTypeDef * hadc)2259 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)
2260 {
2261 HAL_StatusTypeDef tmp_hal_status;
2262
2263 /* Check the parameters */
2264 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2265
2266 /* Process locked */
2267 __HAL_LOCK(hadc);
2268
2269 /* 1. Stop potential ADC group regular conversion on going */
2270 tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
2271
2272 /* Disable ADC peripheral if conversions are effectively stopped */
2273 if (tmp_hal_status == HAL_OK)
2274 {
2275 /* Disable ADC DMA (ADC DMA configuration of continuous requests is kept) */
2276 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_DMNGT_0 | ADC_CFGR_DMNGT_1, 0UL);
2277
2278 /* Disable the DMA channel (in case of DMA in circular mode or stop */
2279 /* while DMA transfer is on going) */
2280 if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
2281 {
2282 tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
2283
2284 /* Check if DMA channel effectively disabled */
2285 if (tmp_hal_status != HAL_OK)
2286 {
2287 /* Update ADC state machine to error */
2288 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
2289 }
2290 }
2291
2292 /* Disable ADC overrun interrupt */
2293 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
2294
2295 /* 2. Disable the ADC peripheral */
2296 /* Update "tmp_hal_status" only if DMA channel disabling passed, */
2297 /* to keep in memory a potential failing status. */
2298 if (tmp_hal_status == HAL_OK)
2299 {
2300 tmp_hal_status = ADC_Disable(hadc);
2301 }
2302 else
2303 {
2304 (void)ADC_Disable(hadc);
2305 }
2306
2307 /* Check if ADC is effectively disabled */
2308 if (tmp_hal_status == HAL_OK)
2309 {
2310 /* Set ADC state */
2311 ADC_STATE_CLR_SET(hadc->State,
2312 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
2313 HAL_ADC_STATE_READY);
2314 }
2315
2316 }
2317
2318 /* Process unlocked */
2319 __HAL_UNLOCK(hadc);
2320
2321 /* Return function status */
2322 return tmp_hal_status;
2323 }
2324
2325 /**
2326 * @brief Get ADC regular group conversion result.
2327 * @note Reading register DR automatically clears ADC flag EOC
2328 * (ADC group regular end of unitary conversion).
2329 * @note This function does not clear ADC flag EOS
2330 * (ADC group regular end of sequence conversion).
2331 * Occurrence of flag EOS rising:
2332 * - If sequencer is composed of 1 rank, flag EOS is equivalent
2333 * to flag EOC.
2334 * - If sequencer is composed of several ranks, during the scan
2335 * sequence flag EOC only is raised, at the end of the scan sequence
2336 * both flags EOC and EOS are raised.
2337 * To clear this flag, either use function:
2338 * in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
2339 * model polling: @ref HAL_ADC_PollForConversion()
2340 * or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
2341 * @param hadc ADC handle
2342 * @retval ADC group regular conversion data
2343 */
HAL_ADC_GetValue(ADC_HandleTypeDef * hadc)2344 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)
2345 {
2346 /* Check the parameters */
2347 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2348
2349 /* Note: EOC flag is not cleared here by software because automatically */
2350 /* cleared by hardware when reading register DR. */
2351
2352 /* Return ADC converted value */
2353 return hadc->Instance->DR;
2354 }
2355
2356 /**
2357 * @brief Handle ADC interrupt request.
2358 * @param hadc ADC handle
2359 * @retval None
2360 */
HAL_ADC_IRQHandler(ADC_HandleTypeDef * hadc)2361 void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc)
2362 {
2363 uint32_t overrun_error = 0UL; /* flag set if overrun occurrence has to be considered as an error */
2364 uint32_t tmp_isr = hadc->Instance->ISR;
2365 uint32_t tmp_ier = hadc->Instance->IER;
2366 uint32_t tmp_adc_inj_is_trigger_source_sw_start;
2367 uint32_t tmp_adc_reg_is_trigger_source_sw_start;
2368 uint32_t tmp_cfgr;
2369 const ADC_TypeDef *tmpADC_Master;
2370 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
2371
2372 /* Check the parameters */
2373 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2374 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
2375
2376 /* ========== Check End of Sampling flag for ADC group regular ========== */
2377 if (((tmp_isr & ADC_FLAG_EOSMP) == ADC_FLAG_EOSMP) && ((tmp_ier & ADC_IT_EOSMP) == ADC_IT_EOSMP))
2378 {
2379 /* Update state machine on end of sampling status if not in error state */
2380 if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
2381 {
2382 /* Set ADC state */
2383 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
2384 }
2385
2386 /* End Of Sampling callback */
2387 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2388 hadc->EndOfSamplingCallback(hadc);
2389 #else
2390 HAL_ADCEx_EndOfSamplingCallback(hadc);
2391 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2392
2393 /* Clear regular group conversion flag */
2394 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
2395 }
2396
2397 /* ====== Check ADC group regular end of unitary conversion sequence conversions ===== */
2398 if ((((tmp_isr & ADC_FLAG_EOC) == ADC_FLAG_EOC) && ((tmp_ier & ADC_IT_EOC) == ADC_IT_EOC)) ||
2399 (((tmp_isr & ADC_FLAG_EOS) == ADC_FLAG_EOS) && ((tmp_ier & ADC_IT_EOS) == ADC_IT_EOS)))
2400 {
2401 /* Update state machine on conversion status if not in error state */
2402 if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
2403 {
2404 /* Set ADC state */
2405 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
2406 }
2407
2408 /* Determine whether any further conversion upcoming on group regular */
2409 /* by external trigger, continuous mode or scan sequence on going */
2410 /* to disable interruption. */
2411 if (LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
2412 {
2413 /* Get relevant register CFGR in ADC instance of ADC master or slave */
2414 /* in function of multimode state (for devices with multimode */
2415 /* available). */
2416 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
2417 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
2418 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
2419 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
2420 )
2421 {
2422 /* check CONT bit directly in handle ADC CFGR register */
2423 tmp_cfgr = READ_REG(hadc->Instance->CFGR);
2424 }
2425 else
2426 {
2427 /* else need to check Master ADC CONT bit */
2428 tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
2429 tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
2430 }
2431
2432 /* Carry on if continuous mode is disabled */
2433 if (READ_BIT(tmp_cfgr, ADC_CFGR_CONT) != ADC_CFGR_CONT)
2434 {
2435 /* If End of Sequence is reached, disable interrupts */
2436 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
2437 {
2438 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
2439 /* ADSTART==0 (no conversion on going) */
2440 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
2441 {
2442 /* Disable ADC end of sequence conversion interrupt */
2443 /* Note: Overrun interrupt was enabled with EOC interrupt in */
2444 /* HAL_Start_IT(), but is not disabled here because can be used */
2445 /* by overrun IRQ process below. */
2446 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
2447
2448 /* Set ADC state */
2449 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
2450
2451 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
2452 {
2453 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
2454 }
2455 }
2456 else
2457 {
2458 /* Change ADC state to error state */
2459 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2460
2461 /* Set ADC error code to ADC peripheral internal error */
2462 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2463 }
2464 }
2465 }
2466 }
2467
2468 /* Conversion complete callback */
2469 /* Note: Into callback function "HAL_ADC_ConvCpltCallback()", */
2470 /* to determine if conversion has been triggered from EOC or EOS, */
2471 /* possibility to use: */
2472 /* " if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) " */
2473 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2474 hadc->ConvCpltCallback(hadc);
2475 #else
2476 HAL_ADC_ConvCpltCallback(hadc);
2477 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2478
2479 /* Clear regular group conversion flag */
2480 /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of */
2481 /* conversion flags clear induces the release of the preserved data.*/
2482 /* Therefore, if the preserved data value is needed, it must be */
2483 /* read preliminarily into HAL_ADC_ConvCpltCallback(). */
2484 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
2485 }
2486
2487 /* ====== Check ADC group injected end of unitary conversion sequence conversions ===== */
2488 if ((((tmp_isr & ADC_FLAG_JEOC) == ADC_FLAG_JEOC) && ((tmp_ier & ADC_IT_JEOC) == ADC_IT_JEOC)) ||
2489 (((tmp_isr & ADC_FLAG_JEOS) == ADC_FLAG_JEOS) && ((tmp_ier & ADC_IT_JEOS) == ADC_IT_JEOS)))
2490 {
2491 /* Update state machine on conversion status if not in error state */
2492 if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
2493 {
2494 /* Set ADC state */
2495 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC);
2496 }
2497
2498 /* Retrieve ADC configuration */
2499 tmp_adc_inj_is_trigger_source_sw_start = LL_ADC_INJ_IsTriggerSourceSWStart(hadc->Instance);
2500 tmp_adc_reg_is_trigger_source_sw_start = LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance);
2501 /* Get relevant register CFGR in ADC instance of ADC master or slave */
2502 /* in function of multimode state (for devices with multimode */
2503 /* available). */
2504 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
2505 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
2506 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_REG_SIMULT)
2507 || (tmp_multimode_config == LL_ADC_MULTI_DUAL_REG_INTERL)
2508 )
2509 {
2510 tmp_cfgr = READ_REG(hadc->Instance->CFGR);
2511 }
2512 else
2513 {
2514 tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
2515 tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
2516 }
2517
2518 /* Disable interruption if no further conversion upcoming by injected */
2519 /* external trigger or by automatic injected conversion with regular */
2520 /* group having no further conversion upcoming (same conditions as */
2521 /* regular group interruption disabling above), */
2522 /* and if injected scan sequence is completed. */
2523 if (tmp_adc_inj_is_trigger_source_sw_start != 0UL)
2524 {
2525 if ((READ_BIT(tmp_cfgr, ADC_CFGR_JAUTO) == 0UL) ||
2526 ((tmp_adc_reg_is_trigger_source_sw_start != 0UL) &&
2527 (READ_BIT(tmp_cfgr, ADC_CFGR_CONT) == 0UL)))
2528 {
2529 /* If End of Sequence is reached, disable interrupts */
2530 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS))
2531 {
2532 /* Particular case if injected contexts queue is enabled: */
2533 /* when the last context has been fully processed, JSQR is reset */
2534 /* by the hardware. Even if no injected conversion is planned to come */
2535 /* (queue empty, triggers are ignored), it can start again */
2536 /* immediately after setting a new context (JADSTART is still set). */
2537 /* Therefore, state of HAL ADC injected group is kept to busy. */
2538 if (READ_BIT(tmp_cfgr, ADC_CFGR_JQM) == 0UL)
2539 {
2540 /* Allowed to modify bits ADC_IT_JEOC/ADC_IT_JEOS only if bit */
2541 /* JADSTART==0 (no conversion on going) */
2542 if (LL_ADC_INJ_IsConversionOngoing(hadc->Instance) == 0UL)
2543 {
2544 /* Disable ADC end of sequence conversion interrupt */
2545 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC | ADC_IT_JEOS);
2546
2547 /* Set ADC state */
2548 CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY);
2549
2550 if ((hadc->State & HAL_ADC_STATE_REG_BUSY) == 0UL)
2551 {
2552 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
2553 }
2554 }
2555 else
2556 {
2557 /* Update ADC state machine to error */
2558 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2559
2560 /* Set ADC error code to ADC peripheral internal error */
2561 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2562 }
2563 }
2564 }
2565 }
2566 }
2567
2568 /* Injected Conversion complete callback */
2569 /* Note: HAL_ADCEx_InjectedConvCpltCallback can resort to
2570 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOS)) or
2571 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOC)) to determine whether
2572 interruption has been triggered by end of conversion or end of
2573 sequence. */
2574 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2575 hadc->InjectedConvCpltCallback(hadc);
2576 #else
2577 HAL_ADCEx_InjectedConvCpltCallback(hadc);
2578 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2579
2580 /* Clear injected group conversion flag */
2581 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC | ADC_FLAG_JEOS);
2582 }
2583
2584 /* ========== Check Analog watchdog 1 flag ========== */
2585 if (((tmp_isr & ADC_FLAG_AWD1) == ADC_FLAG_AWD1) && ((tmp_ier & ADC_IT_AWD1) == ADC_IT_AWD1))
2586 {
2587 /* Set ADC state */
2588 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
2589
2590 /* Level out of window 1 callback */
2591 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2592 hadc->LevelOutOfWindowCallback(hadc);
2593 #else
2594 HAL_ADC_LevelOutOfWindowCallback(hadc);
2595 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2596
2597 /* Clear ADC analog watchdog flag */
2598 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
2599 }
2600
2601 /* ========== Check analog watchdog 2 flag ========== */
2602 if (((tmp_isr & ADC_FLAG_AWD2) == ADC_FLAG_AWD2) && ((tmp_ier & ADC_IT_AWD2) == ADC_IT_AWD2))
2603 {
2604 /* Set ADC state */
2605 SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
2606
2607 /* Level out of window 2 callback */
2608 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2609 hadc->LevelOutOfWindow2Callback(hadc);
2610 #else
2611 HAL_ADCEx_LevelOutOfWindow2Callback(hadc);
2612 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2613
2614 /* Clear ADC analog watchdog flag */
2615 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
2616 }
2617
2618 /* ========== Check analog watchdog 3 flag ========== */
2619 if (((tmp_isr & ADC_FLAG_AWD3) == ADC_FLAG_AWD3) && ((tmp_ier & ADC_IT_AWD3) == ADC_IT_AWD3))
2620 {
2621 /* Set ADC state */
2622 SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
2623
2624 /* Level out of window 3 callback */
2625 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2626 hadc->LevelOutOfWindow3Callback(hadc);
2627 #else
2628 HAL_ADCEx_LevelOutOfWindow3Callback(hadc);
2629 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2630
2631 /* Clear ADC analog watchdog flag */
2632 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
2633 }
2634
2635 /* ========== Check Overrun flag ========== */
2636 if (((tmp_isr & ADC_FLAG_OVR) == ADC_FLAG_OVR) && ((tmp_ier & ADC_IT_OVR) == ADC_IT_OVR))
2637 {
2638 /* If overrun is set to overwrite previous data (default setting), */
2639 /* overrun event is not considered as an error. */
2640 /* (cf ref manual "Managing conversions without using the DMA and without */
2641 /* overrun ") */
2642 /* Exception for usage with DMA overrun event always considered as an */
2643 /* error. */
2644 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
2645 {
2646 overrun_error = 1UL;
2647 }
2648 else
2649 {
2650 /* Check DMA configuration */
2651 if (tmp_multimode_config != LL_ADC_MULTI_INDEPENDENT)
2652 {
2653 /* Multimode (when feature is available) is enabled,
2654 Common Control Register MDMA bits must be checked. */
2655 if (LL_ADC_GetMultiDMATransfer(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) != LL_ADC_MULTI_REG_DMA_EACH_ADC)
2656 {
2657 overrun_error = 1UL;
2658 }
2659 }
2660 else
2661 {
2662 /* Multimode not set or feature not available or ADC independent */
2663 if ((hadc->Instance->CFGR & ADC_CFGR_DMNGT) != 0UL)
2664 {
2665 overrun_error = 1UL;
2666 }
2667 }
2668 }
2669
2670 if (overrun_error == 1UL)
2671 {
2672 /* Change ADC state to error state */
2673 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
2674
2675 /* Set ADC error code to overrun */
2676 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
2677
2678 /* Error callback */
2679 /* Note: In case of overrun, ADC conversion data is preserved until */
2680 /* flag OVR is reset. */
2681 /* Therefore, old ADC conversion data can be retrieved in */
2682 /* function "HAL_ADC_ErrorCallback()". */
2683 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2684 hadc->ErrorCallback(hadc);
2685 #else
2686 HAL_ADC_ErrorCallback(hadc);
2687 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2688 }
2689
2690 /* Clear ADC overrun flag */
2691 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
2692 }
2693
2694 /* ========== Check Injected context queue overflow flag ========== */
2695 if (((tmp_isr & ADC_FLAG_JQOVF) == ADC_FLAG_JQOVF) && ((tmp_ier & ADC_IT_JQOVF) == ADC_IT_JQOVF))
2696 {
2697 /* Change ADC state to overrun state */
2698 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF);
2699
2700 /* Set ADC error code to Injected context queue overflow */
2701 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF);
2702
2703 /* Clear the Injected context queue overflow flag */
2704 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF);
2705
2706 /* Injected context queue overflow callback */
2707 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
2708 hadc->InjectedQueueOverflowCallback(hadc);
2709 #else
2710 HAL_ADCEx_InjectedQueueOverflowCallback(hadc);
2711 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
2712 }
2713
2714 }
2715
2716 /**
2717 * @brief Conversion complete callback in non-blocking mode.
2718 * @param hadc ADC handle
2719 * @retval None
2720 */
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef * hadc)2721 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
2722 {
2723 /* Prevent unused argument(s) compilation warning */
2724 UNUSED(hadc);
2725
2726 /* NOTE : This function should not be modified. When the callback is needed,
2727 function HAL_ADC_ConvCpltCallback must be implemented in the user file.
2728 */
2729 }
2730
2731 /**
2732 * @brief Conversion DMA half-transfer callback in non-blocking mode.
2733 * @param hadc ADC handle
2734 * @retval None
2735 */
HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef * hadc)2736 __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
2737 {
2738 /* Prevent unused argument(s) compilation warning */
2739 UNUSED(hadc);
2740
2741 /* NOTE : This function should not be modified. When the callback is needed,
2742 function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
2743 */
2744 }
2745
2746 /**
2747 * @brief Analog watchdog 1 callback in non-blocking mode.
2748 * @param hadc ADC handle
2749 * @retval None
2750 */
HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef * hadc)2751 __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc)
2752 {
2753 /* Prevent unused argument(s) compilation warning */
2754 UNUSED(hadc);
2755
2756 /* NOTE : This function should not be modified. When the callback is needed,
2757 function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
2758 */
2759 }
2760
2761 /**
2762 * @brief ADC error callback in non-blocking mode
2763 * (ADC conversion with interruption or transfer by DMA).
2764 * @note In case of error due to overrun when using ADC with DMA transfer
2765 * (HAL ADC handle parameter "ErrorCode" to state "HAL_ADC_ERROR_OVR"):
2766 * - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()".
2767 * - If needed, restart a new ADC conversion using function
2768 * "HAL_ADC_Start_DMA()"
2769 * (this function is also clearing overrun flag)
2770 * @param hadc ADC handle
2771 * @retval None
2772 */
HAL_ADC_ErrorCallback(ADC_HandleTypeDef * hadc)2773 __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
2774 {
2775 /* Prevent unused argument(s) compilation warning */
2776 UNUSED(hadc);
2777
2778 /* NOTE : This function should not be modified. When the callback is needed,
2779 function HAL_ADC_ErrorCallback must be implemented in the user file.
2780 */
2781 }
2782
2783 /**
2784 * @}
2785 */
2786
2787 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
2788 * @brief Peripheral Control functions
2789 *
2790 @verbatim
2791 ===============================================================================
2792 ##### Peripheral Control functions #####
2793 ===============================================================================
2794 [..] This section provides functions allowing to:
2795 (+) Configure channels on regular group
2796 (+) Configure the analog watchdog
2797
2798 @endverbatim
2799 * @{
2800 */
2801
2802 /**
2803 * @brief Configure a channel to be assigned to ADC group regular.
2804 * @note In case of usage of internal measurement channels:
2805 * Vbat/VrefInt/TempSensor.
2806 * These internal paths can be disabled using function
2807 * HAL_ADC_DeInit().
2808 * @note Possibility to update parameters on the fly:
2809 * This function initializes channel into ADC group regular,
2810 * following calls to this function can be used to reconfigure
2811 * some parameters of structure "ADC_ChannelConfTypeDef" on the fly,
2812 * without resetting the ADC.
2813 * The setting of these parameters is conditioned to ADC state:
2814 * Refer to comments of structure "ADC_ChannelConfTypeDef".
2815 * @param hadc ADC handle
2816 * @param sConfig Structure of ADC channel assigned to ADC group regular.
2817 * @retval HAL status
2818 */
HAL_ADC_ConfigChannel(ADC_HandleTypeDef * hadc,ADC_ChannelConfTypeDef * sConfig)2819 HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig)
2820 {
2821 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
2822 uint32_t tmpOffsetShifted;
2823 uint32_t tmp_config_internal_channel;
2824 __IO uint32_t wait_loop_index = 0;
2825 uint32_t tmp_adc_is_conversion_on_going_regular;
2826 uint32_t tmp_adc_is_conversion_on_going_injected;
2827
2828 /* Check the parameters */
2829 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
2830 assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank));
2831 assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));
2832 assert_param(IS_ADC_SINGLE_DIFFERENTIAL(sConfig->SingleDiff));
2833 assert_param(IS_ADC_OFFSET_NUMBER(sConfig->OffsetNumber));
2834 /* Check offset range according to oversampling setting */
2835 if (hadc->Init.OversamplingMode == ENABLE)
2836 {
2837 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), sConfig->Offset / (hadc->Init.Oversampling.Ratio + 1U)));
2838 }
2839 else
2840 {
2841 #if defined(ADC_VER_V5_V90)
2842 if (hadc->Instance == ADC3)
2843 {
2844 assert_param(IS_ADC3_RANGE(ADC_GET_RESOLUTION(hadc), sConfig->Offset));
2845 }
2846 else
2847 #endif /* ADC_VER_V5_V90 */
2848 {
2849 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), sConfig->Offset));
2850 }
2851 }
2852
2853 /* if ROVSE is set, the value of the OFFSETy_EN bit in ADCx_OFRy register is
2854 ignored (considered as reset) */
2855 assert_param(!((sConfig->OffsetNumber != ADC_OFFSET_NONE) && (hadc->Init.OversamplingMode == ENABLE)));
2856
2857 /* Verification of channel number */
2858 if (sConfig->SingleDiff != ADC_DIFFERENTIAL_ENDED)
2859 {
2860 assert_param(IS_ADC_CHANNEL(sConfig->Channel));
2861 }
2862 else
2863 {
2864 if (hadc->Instance == ADC1)
2865 {
2866 assert_param(IS_ADC1_DIFF_CHANNEL(sConfig->Channel));
2867 }
2868 if (hadc->Instance == ADC2)
2869 {
2870 assert_param(IS_ADC2_DIFF_CHANNEL(sConfig->Channel));
2871 }
2872 #if defined(ADC3)
2873 /* ADC3 is not available on some STM32H7 products */
2874 if (hadc->Instance == ADC3)
2875 {
2876 assert_param(IS_ADC3_DIFF_CHANNEL(sConfig->Channel));
2877 }
2878 #endif
2879 }
2880
2881 /* Process locked */
2882 __HAL_LOCK(hadc);
2883
2884 /* Parameters update conditioned to ADC state: */
2885 /* Parameters that can be updated when ADC is disabled or enabled without */
2886 /* conversion on going on regular group: */
2887 /* - Channel number */
2888 /* - Channel rank */
2889 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
2890 {
2891
2892 #if defined(ADC_VER_V5_V90)
2893 if (hadc->Instance != ADC3)
2894 {
2895 /* ADC channels preselection */
2896 hadc->Instance->PCSEL_RES0 |= (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB((uint32_t)sConfig->Channel) & 0x1FUL));
2897 }
2898 #else
2899 /* ADC channels preselection */
2900 hadc->Instance->PCSEL |= (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB((uint32_t)sConfig->Channel) & 0x1FUL));
2901 #endif /* ADC_VER_V5_V90 */
2902
2903 /* Set ADC group regular sequence: channel on the selected scan sequence rank */
2904 LL_ADC_REG_SetSequencerRanks(hadc->Instance, sConfig->Rank, sConfig->Channel);
2905
2906 /* Parameters update conditioned to ADC state: */
2907 /* Parameters that can be updated when ADC is disabled or enabled without */
2908 /* conversion on going on regular group: */
2909 /* - Channel sampling time */
2910 /* - Channel offset */
2911 tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
2912 tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
2913 if ((tmp_adc_is_conversion_on_going_regular == 0UL)
2914 && (tmp_adc_is_conversion_on_going_injected == 0UL)
2915 )
2916 {
2917 /* Set sampling time of the selected ADC channel */
2918 LL_ADC_SetChannelSamplingTime(hadc->Instance, sConfig->Channel, sConfig->SamplingTime);
2919
2920 /* Configure the offset: offset enable/disable, channel, offset value */
2921
2922 /* Shift the offset with respect to the selected ADC resolution. */
2923 /* Offset has to be left-aligned on bit 11, the LSB (right bits) are set to 0 */
2924 #if defined(ADC_VER_V5_V90)
2925 if (hadc->Instance == ADC3)
2926 {
2927 tmpOffsetShifted = ADC3_OFFSET_SHIFT_RESOLUTION(hadc, (uint32_t)sConfig->Offset);
2928 }
2929 else
2930 #endif /* ADC_VER_V5_V90 */
2931 {
2932 tmpOffsetShifted = ADC_OFFSET_SHIFT_RESOLUTION(hadc, (uint32_t)sConfig->Offset);
2933 }
2934
2935 if (sConfig->OffsetNumber != ADC_OFFSET_NONE)
2936 {
2937 /* Set ADC selected offset number */
2938 LL_ADC_SetOffset(hadc->Instance, sConfig->OffsetNumber, sConfig->Channel, tmpOffsetShifted);
2939
2940 #if defined(ADC_VER_V5_V90)
2941 if (hadc->Instance == ADC3)
2942 {
2943 assert_param(IS_ADC3_OFFSET_SIGN(sConfig->OffsetSign));
2944 assert_param(IS_FUNCTIONAL_STATE(sConfig->OffsetSaturation));
2945 /* Set ADC selected offset sign & saturation */
2946 LL_ADC_SetOffsetSign(hadc->Instance, sConfig->OffsetNumber, sConfig->OffsetSign);
2947 LL_ADC_SetOffsetSaturation(hadc->Instance, sConfig->OffsetNumber, (sConfig->OffsetSaturation == ENABLE) ? LL_ADC_OFFSET_SATURATION_ENABLE : LL_ADC_OFFSET_SATURATION_DISABLE);
2948 }
2949 else
2950 #endif /* ADC_VER_V5_V90 */
2951 {
2952 assert_param(IS_FUNCTIONAL_STATE(sConfig->OffsetSignedSaturation));
2953 /* Set ADC selected offset signed saturation */
2954 LL_ADC_SetOffsetSignedSaturation(hadc->Instance, sConfig->OffsetNumber, (sConfig->OffsetSignedSaturation == ENABLE) ? LL_ADC_OFFSET_SIGNED_SATURATION_ENABLE : LL_ADC_OFFSET_SIGNED_SATURATION_DISABLE);
2955
2956 assert_param(IS_FUNCTIONAL_STATE(sConfig->OffsetRightShift));
2957 /* Set ADC selected offset right shift */
2958 LL_ADC_SetDataRightShift(hadc->Instance, sConfig->OffsetNumber, (sConfig->OffsetRightShift == ENABLE) ? LL_ADC_OFFSET_RSHIFT_ENABLE : LL_ADC_OFFSET_RSHIFT_DISABLE);
2959 }
2960
2961 }
2962 else
2963 {
2964 /* Scan OFR1, OFR2, OFR3, OFR4 to check if the selected channel is enabled.
2965 If this is the case, offset OFRx is disabled since
2966 sConfig->OffsetNumber = ADC_OFFSET_NONE. */
2967 #if defined(ADC_VER_V5_V90)
2968 if (hadc->Instance == ADC3)
2969 {
2970 if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_1)) == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
2971 {
2972 LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_1, LL_ADC_OFFSET_DISABLE);
2973 }
2974 if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_2)) == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
2975 {
2976 LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_2, LL_ADC_OFFSET_DISABLE);
2977 }
2978 if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_3)) == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
2979 {
2980 LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_3, LL_ADC_OFFSET_DISABLE);
2981 }
2982 if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_4)) == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
2983 {
2984 LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_4, LL_ADC_OFFSET_DISABLE);
2985 }
2986 }
2987 else
2988 #endif /* ADC_VER_V5_V90 */
2989 {
2990 if (((hadc->Instance->OFR1) & ADC_OFR1_OFFSET1_CH) == ADC_OFR_CHANNEL(sConfig->Channel))
2991 {
2992 CLEAR_BIT(hadc->Instance->OFR1, ADC_OFR1_SSATE);
2993 }
2994 if (((hadc->Instance->OFR2) & ADC_OFR2_OFFSET2_CH) == ADC_OFR_CHANNEL(sConfig->Channel))
2995 {
2996 CLEAR_BIT(hadc->Instance->OFR2, ADC_OFR2_SSATE);
2997 }
2998 if (((hadc->Instance->OFR3) & ADC_OFR3_OFFSET3_CH) == ADC_OFR_CHANNEL(sConfig->Channel))
2999 {
3000 CLEAR_BIT(hadc->Instance->OFR3, ADC_OFR3_SSATE);
3001 }
3002 if (((hadc->Instance->OFR4) & ADC_OFR4_OFFSET4_CH) == ADC_OFR_CHANNEL(sConfig->Channel))
3003 {
3004 CLEAR_BIT(hadc->Instance->OFR4, ADC_OFR4_SSATE);
3005 }
3006 }
3007
3008 }
3009 }
3010
3011 /* Parameters update conditioned to ADC state: */
3012 /* Parameters that can be updated only when ADC is disabled: */
3013 /* - Single or differential mode */
3014 /* - Internal measurement channels: Vbat/VrefInt/TempSensor */
3015 if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
3016 {
3017 /* Set mode single-ended or differential input of the selected ADC channel */
3018 LL_ADC_SetChannelSingleDiff(hadc->Instance, sConfig->Channel, sConfig->SingleDiff);
3019
3020 /* Configuration of differential mode */
3021 if (sConfig->SingleDiff == ADC_DIFFERENTIAL_ENDED)
3022 {
3023 /* Set sampling time of the selected ADC channel */
3024 /* Note: ADC channel number masked with value "0x1F" to ensure shift value within 32 bits range */
3025 LL_ADC_SetChannelSamplingTime(hadc->Instance,
3026 (uint32_t)(__LL_ADC_DECIMAL_NB_TO_CHANNEL((__LL_ADC_CHANNEL_TO_DECIMAL_NB((uint32_t)sConfig->Channel) + 1UL) & 0x1FUL)),
3027 sConfig->SamplingTime);
3028 }
3029
3030 /* Management of internal measurement channels: Vbat/VrefInt/TempSensor. */
3031 /* If internal channel selected, enable dedicated internal buffers and */
3032 /* paths. */
3033 /* Note: these internal measurement paths can be disabled using */
3034 /* HAL_ADC_DeInit(). */
3035
3036 if (__LL_ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
3037 {
3038 /* Configuration of common ADC parameters */
3039
3040 tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
3041
3042 /* Software is allowed to change common parameters only when all ADCs */
3043 /* of the common group are disabled. */
3044 if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) == 0UL)
3045 {
3046 /* If the requested internal measurement path has already been enabled, */
3047 /* bypass the configuration processing. */
3048 if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_TEMPSENSOR) == 0UL))
3049 {
3050 if (ADC_TEMPERATURE_SENSOR_INSTANCE(hadc))
3051 {
3052 LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance), LL_ADC_PATH_INTERNAL_TEMPSENSOR | tmp_config_internal_channel);
3053
3054 /* Delay for temperature sensor stabilization time */
3055 /* Wait loop initialization and execution */
3056 /* Note: Variable divided by 2 to compensate partially */
3057 /* CPU processing cycles, scaling in us split to not */
3058 /* exceed 32 bits register capacity and handle low frequency. */
3059 wait_loop_index = ((LL_ADC_DELAY_TEMPSENSOR_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
3060 while (wait_loop_index != 0UL)
3061 {
3062 wait_loop_index--;
3063 }
3064 }
3065 }
3066 else if ((sConfig->Channel == ADC_CHANNEL_VBAT) && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VBAT) == 0UL))
3067 {
3068 if (ADC_BATTERY_VOLTAGE_INSTANCE(hadc))
3069 {
3070 LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance), LL_ADC_PATH_INTERNAL_VBAT | tmp_config_internal_channel);
3071 }
3072 }
3073 else if ((sConfig->Channel == ADC_CHANNEL_VREFINT) && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VREFINT) == 0UL))
3074 {
3075 if (ADC_VREFINT_INSTANCE(hadc))
3076 {
3077 LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance), LL_ADC_PATH_INTERNAL_VREFINT | tmp_config_internal_channel);
3078 }
3079 }
3080 else
3081 {
3082 /* nothing to do */
3083 }
3084 }
3085 /* If the requested internal measurement path has already been */
3086 /* enabled and other ADC of the common group are enabled, internal */
3087 /* measurement paths cannot be enabled. */
3088 else
3089 {
3090 /* Update ADC state machine to error */
3091 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
3092
3093 tmp_hal_status = HAL_ERROR;
3094 }
3095 }
3096 }
3097 }
3098
3099 /* If a conversion is on going on regular group, no update on regular */
3100 /* channel could be done on neither of the channel configuration structure */
3101 /* parameters. */
3102 else
3103 {
3104 /* Update ADC state machine to error */
3105 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
3106
3107 tmp_hal_status = HAL_ERROR;
3108 }
3109
3110 /* Process unlocked */
3111 __HAL_UNLOCK(hadc);
3112
3113 /* Return function status */
3114 return tmp_hal_status;
3115 }
3116
3117 /**
3118 * @brief Configure the analog watchdog.
3119 * @note Possibility to update parameters on the fly:
3120 * This function initializes the selected analog watchdog, successive
3121 * calls to this function can be used to reconfigure some parameters
3122 * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without resetting
3123 * the ADC.
3124 * The setting of these parameters is conditioned to ADC state.
3125 * For parameters constraints, see comments of structure
3126 * "ADC_AnalogWDGConfTypeDef".
3127 * @note On this STM32 series, analog watchdog thresholds cannot be modified
3128 * while ADC conversion is on going.
3129 * @param hadc ADC handle
3130 * @param AnalogWDGConfig Structure of ADC analog watchdog configuration
3131 * @retval HAL status
3132 */
HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef * hadc,ADC_AnalogWDGConfTypeDef * AnalogWDGConfig)3133 HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, ADC_AnalogWDGConfTypeDef *AnalogWDGConfig)
3134 {
3135 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
3136 uint32_t tmpAWDHighThresholdShifted;
3137 uint32_t tmpAWDLowThresholdShifted;
3138 uint32_t tmp_adc_is_conversion_on_going_regular;
3139 uint32_t tmp_adc_is_conversion_on_going_injected;
3140
3141 /* Check the parameters */
3142 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
3143 assert_param(IS_ADC_ANALOG_WATCHDOG_NUMBER(AnalogWDGConfig->WatchdogNumber));
3144 assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
3145 assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
3146
3147 if ((AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG) ||
3148 (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_INJEC) ||
3149 (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REGINJEC))
3150 {
3151 assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel));
3152 }
3153
3154 #if defined(ADC_VER_V5_V90)
3155
3156 if (hadc->Instance == ADC3)
3157 {
3158 /* Verify thresholds range */
3159 if (hadc->Init.OversamplingMode == ENABLE)
3160 {
3161 /* Case of oversampling enabled: thresholds are compared to oversampling
3162 intermediate computation (after ratio, before shift application) */
3163 assert_param(IS_ADC3_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold / (hadc->Init.Oversampling.Ratio + 1UL)));
3164 assert_param(IS_ADC3_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold / (hadc->Init.Oversampling.Ratio + 1UL)));
3165 }
3166 else
3167 {
3168 /* Verify if thresholds are within the selected ADC resolution */
3169 assert_param(IS_ADC3_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
3170 assert_param(IS_ADC3_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
3171 }
3172 }
3173 else
3174 #endif /* ADC_VER_V5_V90 */
3175 {
3176 /* Verify thresholds range */
3177 if (hadc->Init.OversamplingMode == ENABLE)
3178 {
3179 /* Case of oversampling enabled: thresholds are compared to oversampling
3180 intermediate computation (after ratio, before shift application) */
3181 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold / (hadc->Init.Oversampling.Ratio + 1UL)));
3182 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold / (hadc->Init.Oversampling.Ratio + 1UL)));
3183 }
3184 else
3185 {
3186 /* Verify if thresholds are within the selected ADC resolution */
3187 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
3188 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
3189 }
3190 }
3191
3192 /* Process locked */
3193 __HAL_LOCK(hadc);
3194
3195 /* Parameters update conditioned to ADC state: */
3196 /* Parameters that can be updated when ADC is disabled or enabled without */
3197 /* conversion on going on ADC groups regular and injected: */
3198 /* - Analog watchdog channels */
3199 /* - Analog watchdog thresholds */
3200 tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
3201 tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
3202 if ((tmp_adc_is_conversion_on_going_regular == 0UL)
3203 && (tmp_adc_is_conversion_on_going_injected == 0UL)
3204 )
3205 {
3206 /* Analog watchdog configuration */
3207 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
3208 {
3209 /* Configuration of analog watchdog: */
3210 /* - Set the analog watchdog enable mode: one or overall group of */
3211 /* channels, on groups regular and-or injected. */
3212 switch (AnalogWDGConfig->WatchdogMode)
3213 {
3214 case ADC_ANALOGWATCHDOG_SINGLE_REG:
3215 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
3216 LL_ADC_GROUP_REGULAR));
3217 break;
3218
3219 case ADC_ANALOGWATCHDOG_SINGLE_INJEC:
3220 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
3221 LL_ADC_GROUP_INJECTED));
3222 break;
3223
3224 case ADC_ANALOGWATCHDOG_SINGLE_REGINJEC:
3225 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
3226 LL_ADC_GROUP_REGULAR_INJECTED));
3227 break;
3228
3229 case ADC_ANALOGWATCHDOG_ALL_REG:
3230 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG);
3231 break;
3232
3233 case ADC_ANALOGWATCHDOG_ALL_INJEC:
3234 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_INJ);
3235 break;
3236
3237 case ADC_ANALOGWATCHDOG_ALL_REGINJEC:
3238 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG_INJ);
3239 break;
3240
3241 default: /* ADC_ANALOGWATCHDOG_NONE */
3242 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_DISABLE);
3243 break;
3244 }
3245
3246 /* Shift the offset in function of the selected ADC resolution: */
3247 /* Thresholds have to be left-aligned on bit 11, the LSB (right bits) */
3248 /* are set to 0 */
3249 tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
3250 tmpAWDLowThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
3251
3252 /* Set the high and low thresholds */
3253 #if defined(ADC_VER_V5_V90)
3254 if (hadc->Instance == ADC3)
3255 {
3256 MODIFY_REG(hadc->Instance->LTR1_TR1,
3257 ADC3_TR1_AWDFILT,
3258 AnalogWDGConfig->FilteringConfig);
3259 MODIFY_REG(hadc->Instance->LTR1_TR1, ADC3_TR1_LT1, tmpAWDLowThresholdShifted);
3260 MODIFY_REG(hadc->Instance->LTR1_TR1, ADC3_TR1_HT1, (tmpAWDHighThresholdShifted << ADC3_TR1_HT1_Pos));
3261 }
3262 else
3263 {
3264
3265 MODIFY_REG(hadc->Instance->LTR1_TR1, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3266 MODIFY_REG(hadc->Instance->HTR1_TR2, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3267 }
3268 #else
3269 MODIFY_REG(hadc->Instance->LTR1, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3270 MODIFY_REG(hadc->Instance->HTR1, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3271 #endif
3272
3273 /* Update state, clear previous result related to AWD1 */
3274 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD1);
3275
3276 /* Clear flag ADC analog watchdog */
3277 /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
3278 /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
3279 /* (in case left enabled by previous ADC operations). */
3280 LL_ADC_ClearFlag_AWD1(hadc->Instance);
3281
3282 /* Configure ADC analog watchdog interrupt */
3283 if (AnalogWDGConfig->ITMode == ENABLE)
3284 {
3285 LL_ADC_EnableIT_AWD1(hadc->Instance);
3286 }
3287 else
3288 {
3289 LL_ADC_DisableIT_AWD1(hadc->Instance);
3290 }
3291 }
3292 /* Case of ADC_ANALOGWATCHDOG_2 or ADC_ANALOGWATCHDOG_3 */
3293 else
3294 {
3295 switch (AnalogWDGConfig->WatchdogMode)
3296 {
3297 case ADC_ANALOGWATCHDOG_SINGLE_REG:
3298 case ADC_ANALOGWATCHDOG_SINGLE_INJEC:
3299 case ADC_ANALOGWATCHDOG_SINGLE_REGINJEC:
3300 /* Update AWD by bitfield to keep the possibility to monitor */
3301 /* several channels by successive calls of this function. */
3302 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
3303 {
3304 SET_BIT(hadc->Instance->AWD2CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
3305 }
3306 else
3307 {
3308 SET_BIT(hadc->Instance->AWD3CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
3309 }
3310 break;
3311
3312 case ADC_ANALOGWATCHDOG_ALL_REG:
3313 case ADC_ANALOGWATCHDOG_ALL_INJEC:
3314 case ADC_ANALOGWATCHDOG_ALL_REGINJEC:
3315
3316 #if defined(ADC_VER_V5_V90)
3317 if (hadc->Instance == ADC3)
3318 {
3319
3320 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_ALL_CHANNELS_REG_INJ);
3321
3322 }
3323 else
3324 {
3325 #endif /*ADC_VER_V5_V90*/
3326 /* Update AWD by bitfield to keep the possibility to monitor */
3327 /* several channels by successive calls of this function. */
3328 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
3329 {
3330 SET_BIT(hadc->Instance->AWD2CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
3331 }
3332 else
3333 {
3334 SET_BIT(hadc->Instance->AWD3CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
3335 }
3336 #if defined(ADC_VER_V5_V90)
3337 }
3338 #endif /*ADC_VER_V5_V90*/
3339 break;
3340
3341 default: /* ADC_ANALOGWATCHDOG_NONE */
3342 LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_DISABLE);
3343 break;
3344 }
3345
3346 /* Shift the thresholds in function of the selected ADC resolution */
3347 /* have to be left-aligned on bit 15, the LSB (right bits) are set to 0 */
3348 tmpAWDHighThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
3349 tmpAWDLowThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
3350
3351 #if defined(ADC_VER_V5_V90)
3352 if (hadc->Instance == ADC3)
3353 {
3354
3355 /* Analog watchdog thresholds configuration */
3356 if (AnalogWDGConfig->WatchdogNumber != ADC_ANALOGWATCHDOG_1)
3357 {
3358 /* Shift the offset with respect to the selected ADC resolution: */
3359 /* Thresholds have to be left-aligned on bit 7, the LSB (right bits) */
3360 /* are set to 0. */
3361 tmpAWDHighThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
3362 tmpAWDLowThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
3363 }
3364
3365 /* Set ADC analog watchdog thresholds value of both thresholds high and low */
3366 LL_ADC_ConfigAnalogWDThresholds(hadc->Instance, AnalogWDGConfig->WatchdogNumber, tmpAWDHighThresholdShifted, tmpAWDLowThresholdShifted);
3367
3368
3369 }
3370 else
3371 {
3372
3373 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
3374 {
3375 /* Set ADC analog watchdog thresholds value of both thresholds high and low */
3376 MODIFY_REG(hadc->Instance->LTR2_DIFSEL, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3377 MODIFY_REG(hadc->Instance->HTR2_CALFACT, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3378 }
3379 else
3380 {
3381 /* Set ADC analog watchdog thresholds value of both thresholds high and low */
3382 MODIFY_REG(hadc->Instance->LTR3_RES10, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3383 MODIFY_REG(hadc->Instance->HTR3_RES11, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3384 }
3385 }
3386 #else
3387 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
3388 {
3389 /* Set ADC analog watchdog thresholds value of both thresholds high and low */
3390 MODIFY_REG(hadc->Instance->LTR2, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3391 MODIFY_REG(hadc->Instance->HTR2, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3392 }
3393 else
3394 {
3395 /* Set ADC analog watchdog thresholds value of both thresholds high and low */
3396 MODIFY_REG(hadc->Instance->LTR3, ADC_LTR_LT, tmpAWDLowThresholdShifted);
3397 MODIFY_REG(hadc->Instance->HTR3, ADC_HTR_HT, tmpAWDHighThresholdShifted);
3398 }
3399
3400 #endif
3401 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
3402 {
3403 /* Update state, clear previous result related to AWD2 */
3404 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD2);
3405
3406 /* Clear flag ADC analog watchdog */
3407 /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
3408 /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
3409 /* (in case left enabled by previous ADC operations). */
3410 LL_ADC_ClearFlag_AWD2(hadc->Instance);
3411
3412 /* Configure ADC analog watchdog interrupt */
3413 if (AnalogWDGConfig->ITMode == ENABLE)
3414 {
3415 LL_ADC_EnableIT_AWD2(hadc->Instance);
3416 }
3417 else
3418 {
3419 LL_ADC_DisableIT_AWD2(hadc->Instance);
3420 }
3421 }
3422 /* (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_3) */
3423 else
3424 {
3425 /* Update state, clear previous result related to AWD3 */
3426 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD3);
3427
3428 /* Clear flag ADC analog watchdog */
3429 /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
3430 /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
3431 /* (in case left enabled by previous ADC operations). */
3432 LL_ADC_ClearFlag_AWD3(hadc->Instance);
3433
3434 /* Configure ADC analog watchdog interrupt */
3435 if (AnalogWDGConfig->ITMode == ENABLE)
3436 {
3437 LL_ADC_EnableIT_AWD3(hadc->Instance);
3438 }
3439 else
3440 {
3441 LL_ADC_DisableIT_AWD3(hadc->Instance);
3442 }
3443 }
3444 }
3445
3446 }
3447 /* If a conversion is on going on ADC group regular or injected, no update */
3448 /* could be done on neither of the AWD configuration structure parameters. */
3449 else
3450 {
3451 /* Update ADC state machine to error */
3452 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
3453
3454 tmp_hal_status = HAL_ERROR;
3455 }
3456 /* Process unlocked */
3457 __HAL_UNLOCK(hadc);
3458
3459 /* Return function status */
3460 return tmp_hal_status;
3461 }
3462
3463
3464 /**
3465 * @}
3466 */
3467
3468 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
3469 * @brief ADC Peripheral State functions
3470 *
3471 @verbatim
3472 ===============================================================================
3473 ##### Peripheral state and errors functions #####
3474 ===============================================================================
3475 [..]
3476 This subsection provides functions to get in run-time the status of the
3477 peripheral.
3478 (+) Check the ADC state
3479 (+) Check the ADC error code
3480
3481 @endverbatim
3482 * @{
3483 */
3484
3485 /**
3486 * @brief Return the ADC handle state.
3487 * @note ADC state machine is managed by bitfields, ADC status must be
3488 * compared with states bits.
3489 * For example:
3490 * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_REG_BUSY) != 0UL) "
3491 * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) "
3492 * @param hadc ADC handle
3493 * @retval ADC handle state (bitfield on 32 bits)
3494 */
HAL_ADC_GetState(ADC_HandleTypeDef * hadc)3495 uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc)
3496 {
3497 /* Check the parameters */
3498 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
3499
3500 /* Return ADC handle state */
3501 return hadc->State;
3502 }
3503
3504 /**
3505 * @brief Return the ADC error code.
3506 * @param hadc ADC handle
3507 * @retval ADC error code (bitfield on 32 bits)
3508 */
HAL_ADC_GetError(ADC_HandleTypeDef * hadc)3509 uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
3510 {
3511 /* Check the parameters */
3512 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
3513
3514 return hadc->ErrorCode;
3515 }
3516
3517 /**
3518 * @}
3519 */
3520
3521 /**
3522 * @}
3523 */
3524
3525 /** @defgroup ADC_Private_Functions ADC Private Functions
3526 * @{
3527 */
3528
3529 /**
3530 * @brief Stop ADC conversion.
3531 * @param hadc ADC handle
3532 * @param ConversionGroup ADC group regular and/or injected.
3533 * This parameter can be one of the following values:
3534 * @arg @ref ADC_REGULAR_GROUP ADC regular conversion type.
3535 * @arg @ref ADC_INJECTED_GROUP ADC injected conversion type.
3536 * @arg @ref ADC_REGULAR_INJECTED_GROUP ADC regular and injected conversion type.
3537 * @retval HAL status.
3538 */
ADC_ConversionStop(ADC_HandleTypeDef * hadc,uint32_t ConversionGroup)3539 HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef *hadc, uint32_t ConversionGroup)
3540 {
3541 uint32_t tickstart;
3542 uint32_t Conversion_Timeout_CPU_cycles = 0UL;
3543 uint32_t conversion_group_reassigned = ConversionGroup;
3544 uint32_t tmp_ADC_CR_ADSTART_JADSTART;
3545 uint32_t tmp_adc_is_conversion_on_going_regular;
3546 uint32_t tmp_adc_is_conversion_on_going_injected;
3547
3548 /* Check the parameters */
3549 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
3550 assert_param(IS_ADC_CONVERSION_GROUP(ConversionGroup));
3551
3552 /* Verification if ADC is not already stopped (on regular and injected */
3553 /* groups) to bypass this function if not needed. */
3554 tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
3555 tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
3556 if ((tmp_adc_is_conversion_on_going_regular != 0UL)
3557 || (tmp_adc_is_conversion_on_going_injected != 0UL)
3558 )
3559 {
3560 /* Particular case of continuous auto-injection mode combined with */
3561 /* auto-delay mode. */
3562 /* In auto-injection mode, regular group stop ADC_CR_ADSTP is used (not */
3563 /* injected group stop ADC_CR_JADSTP). */
3564 /* Procedure to be followed: Wait until JEOS=1, clear JEOS, set ADSTP=1 */
3565 /* (see reference manual). */
3566 if (((hadc->Instance->CFGR & ADC_CFGR_JAUTO) != 0UL)
3567 && (hadc->Init.ContinuousConvMode == ENABLE)
3568 && (hadc->Init.LowPowerAutoWait == ENABLE)
3569 )
3570 {
3571 /* Use stop of regular group */
3572 conversion_group_reassigned = ADC_REGULAR_GROUP;
3573
3574 /* Wait until JEOS=1 (maximum Timeout: 4 injected conversions) */
3575 while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS) == 0UL)
3576 {
3577 if (Conversion_Timeout_CPU_cycles >= (ADC_CONVERSION_TIME_MAX_CPU_CYCLES * 4UL))
3578 {
3579 /* Update ADC state machine to error */
3580 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3581
3582 /* Set ADC error code to ADC peripheral internal error */
3583 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3584
3585 return HAL_ERROR;
3586 }
3587 Conversion_Timeout_CPU_cycles ++;
3588 }
3589
3590 /* Clear JEOS */
3591 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOS);
3592 }
3593
3594 /* Stop potential conversion on going on ADC group regular */
3595 if (conversion_group_reassigned != ADC_INJECTED_GROUP)
3596 {
3597 /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
3598 if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) != 0UL)
3599 {
3600 if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
3601 {
3602 /* Stop ADC group regular conversion */
3603 LL_ADC_REG_StopConversion(hadc->Instance);
3604 }
3605 }
3606 }
3607
3608 /* Stop potential conversion on going on ADC group injected */
3609 if (conversion_group_reassigned != ADC_REGULAR_GROUP)
3610 {
3611 /* Software is allowed to set JADSTP only when JADSTART=1 and ADDIS=0 */
3612 if (LL_ADC_INJ_IsConversionOngoing(hadc->Instance) != 0UL)
3613 {
3614 if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
3615 {
3616 /* Stop ADC group injected conversion */
3617 LL_ADC_INJ_StopConversion(hadc->Instance);
3618 }
3619 }
3620 }
3621
3622 /* Selection of start and stop bits with respect to the regular or injected group */
3623 switch (conversion_group_reassigned)
3624 {
3625 case ADC_REGULAR_INJECTED_GROUP:
3626 tmp_ADC_CR_ADSTART_JADSTART = (ADC_CR_ADSTART | ADC_CR_JADSTART);
3627 break;
3628 case ADC_INJECTED_GROUP:
3629 tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_JADSTART;
3630 break;
3631 /* Case ADC_REGULAR_GROUP only*/
3632 default:
3633 tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_ADSTART;
3634 break;
3635 }
3636
3637 /* Wait for conversion effectively stopped */
3638 tickstart = HAL_GetTick();
3639
3640 while ((hadc->Instance->CR & tmp_ADC_CR_ADSTART_JADSTART) != 0UL)
3641 {
3642 if ((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
3643 {
3644 /* New check to avoid false timeout detection in case of preemption */
3645 if((hadc->Instance->CR & tmp_ADC_CR_ADSTART_JADSTART) != 0UL)
3646 {
3647 /* Update ADC state machine to error */
3648 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3649
3650 /* Set ADC error code to ADC peripheral internal error */
3651 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3652
3653 return HAL_ERROR;
3654 }
3655 }
3656 }
3657
3658 }
3659
3660 /* Return HAL status */
3661 return HAL_OK;
3662 }
3663
3664
3665
3666 /**
3667 * @brief Enable the selected ADC.
3668 * @note Prerequisite condition to use this function: ADC must be disabled
3669 * and voltage regulator must be enabled (done into HAL_ADC_Init()).
3670 * @param hadc ADC handle
3671 * @retval HAL status.
3672 */
ADC_Enable(ADC_HandleTypeDef * hadc)3673 HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef *hadc)
3674 {
3675 uint32_t tickstart;
3676
3677 /* ADC enable and wait for ADC ready (in case of ADC is disabled or */
3678 /* enabling phase not yet completed: flag ADC ready not yet set). */
3679 /* Timeout implemented to not be stuck if ADC cannot be enabled (possible */
3680 /* causes: ADC clock not running, ...). */
3681 if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
3682 {
3683 /* Check if conditions to enable the ADC are fulfilled */
3684 if ((hadc->Instance->CR & (ADC_CR_ADCAL | ADC_CR_JADSTP | ADC_CR_ADSTP | ADC_CR_JADSTART | ADC_CR_ADSTART | ADC_CR_ADDIS | ADC_CR_ADEN)) != 0UL)
3685 {
3686 /* Update ADC state machine to error */
3687 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3688
3689 /* Set ADC error code to ADC peripheral internal error */
3690 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3691
3692 return HAL_ERROR;
3693 }
3694
3695 /* Enable the ADC peripheral */
3696 LL_ADC_Enable(hadc->Instance);
3697
3698 /* Wait for ADC effectively enabled */
3699 tickstart = HAL_GetTick();
3700
3701 /* Poll for ADC ready flag raised except case of multimode enabled
3702 and ADC slave selected. */
3703 uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
3704 if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
3705 || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
3706 )
3707 {
3708 while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
3709 {
3710 /* If ADEN bit is set less than 4 ADC clock cycles after the ADCAL bit
3711 has been cleared (after a calibration), ADEN bit is reset by the
3712 calibration logic.
3713 The workaround is to continue setting ADEN until ADRDY is becomes 1.
3714 Additionally, ADC_ENABLE_TIMEOUT is defined to encompass this
3715 4 ADC clock cycle duration */
3716 /* Note: Test of ADC enabled required due to hardware constraint to */
3717 /* not enable ADC if already enabled. */
3718 if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
3719 {
3720 LL_ADC_Enable(hadc->Instance);
3721 }
3722
3723 if ((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
3724 {
3725 /* New check to avoid false timeout detection in case of preemption */
3726 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
3727 {
3728 /* Update ADC state machine to error */
3729 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3730
3731 /* Set ADC error code to ADC peripheral internal error */
3732 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3733
3734 return HAL_ERROR;
3735 }
3736 }
3737 }
3738 }
3739 }
3740
3741 /* Return HAL status */
3742 return HAL_OK;
3743 }
3744
3745 /**
3746 * @brief Disable the selected ADC.
3747 * @note Prerequisite condition to use this function: ADC conversions must be
3748 * stopped.
3749 * @param hadc ADC handle
3750 * @retval HAL status.
3751 */
ADC_Disable(ADC_HandleTypeDef * hadc)3752 HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef *hadc)
3753 {
3754 uint32_t tickstart;
3755 const uint32_t tmp_adc_is_disable_on_going = LL_ADC_IsDisableOngoing(hadc->Instance);
3756
3757 /* Verification if ADC is not already disabled: */
3758 /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */
3759 /* disabled. */
3760 if ((LL_ADC_IsEnabled(hadc->Instance) != 0UL)
3761 && (tmp_adc_is_disable_on_going == 0UL)
3762 )
3763 {
3764 /* Check if conditions to disable the ADC are fulfilled */
3765 if ((hadc->Instance->CR & (ADC_CR_JADSTART | ADC_CR_ADSTART | ADC_CR_ADEN)) == ADC_CR_ADEN)
3766 {
3767 /* Disable the ADC peripheral */
3768 LL_ADC_Disable(hadc->Instance);
3769 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOSMP | ADC_FLAG_RDY));
3770 }
3771 else
3772 {
3773 /* Update ADC state machine to error */
3774 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3775
3776 /* Set ADC error code to ADC peripheral internal error */
3777 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3778
3779 return HAL_ERROR;
3780 }
3781
3782 /* Wait for ADC effectively disabled */
3783 /* Get tick count */
3784 tickstart = HAL_GetTick();
3785
3786 while ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
3787 {
3788 if ((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
3789 {
3790 /* New check to avoid false timeout detection in case of preemption */
3791 if ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
3792 {
3793 /* Update ADC state machine to error */
3794 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
3795
3796 /* Set ADC error code to ADC peripheral internal error */
3797 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
3798
3799 return HAL_ERROR;
3800 }
3801 }
3802 }
3803 }
3804
3805 /* Return HAL status */
3806 return HAL_OK;
3807 }
3808
3809 /**
3810 * @brief DMA transfer complete callback.
3811 * @param hdma pointer to DMA handle.
3812 * @retval None
3813 */
ADC_DMAConvCplt(DMA_HandleTypeDef * hdma)3814 void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
3815 {
3816 /* Retrieve ADC handle corresponding to current DMA handle */
3817 ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3818
3819 /* Update state machine on conversion status if not in error state */
3820 if ((hadc->State & (HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) == 0UL)
3821 {
3822 /* Set ADC state */
3823 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
3824
3825 /* Determine whether any further conversion upcoming on group regular */
3826 /* by external trigger, continuous mode or scan sequence on going */
3827 /* to disable interruption. */
3828 /* Is it the end of the regular sequence ? */
3829 if ((hadc->Instance->ISR & ADC_FLAG_EOS) != 0UL)
3830 {
3831 /* Are conversions software-triggered ? */
3832 if (LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
3833 {
3834 /* Is CONT bit set ? */
3835 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_CONT) == 0UL)
3836 {
3837 /* CONT bit is not set, no more conversions expected */
3838 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
3839 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
3840 {
3841 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
3842 }
3843 }
3844 }
3845 }
3846 else
3847 {
3848 /* DMA End of Transfer interrupt was triggered but conversions sequence
3849 is not over. If DMACFG is set to 0, conversions are stopped. */
3850 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMNGT) == 0UL)
3851 {
3852 /* DMACFG bit is not set, conversions are stopped. */
3853 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
3854 if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
3855 {
3856 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
3857 }
3858 }
3859 }
3860
3861 /* Conversion complete callback */
3862 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
3863 hadc->ConvCpltCallback(hadc);
3864 #else
3865 HAL_ADC_ConvCpltCallback(hadc);
3866 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
3867 }
3868 else /* DMA and-or internal error occurred */
3869 {
3870 if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL)
3871 {
3872 /* Call HAL ADC Error Callback function */
3873 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
3874 hadc->ErrorCallback(hadc);
3875 #else
3876 HAL_ADC_ErrorCallback(hadc);
3877 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
3878 }
3879 else
3880 {
3881 /* Call ADC DMA error callback */
3882 hadc->DMA_Handle->XferErrorCallback(hdma);
3883 }
3884 }
3885 }
3886
3887 /**
3888 * @brief DMA half transfer complete callback.
3889 * @param hdma pointer to DMA handle.
3890 * @retval None
3891 */
ADC_DMAHalfConvCplt(DMA_HandleTypeDef * hdma)3892 void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
3893 {
3894 /* Retrieve ADC handle corresponding to current DMA handle */
3895 ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3896
3897 /* Half conversion callback */
3898 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
3899 hadc->ConvHalfCpltCallback(hadc);
3900 #else
3901 HAL_ADC_ConvHalfCpltCallback(hadc);
3902 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
3903 }
3904
3905 /**
3906 * @brief DMA error callback.
3907 * @param hdma pointer to DMA handle.
3908 * @retval None
3909 */
ADC_DMAError(DMA_HandleTypeDef * hdma)3910 void ADC_DMAError(DMA_HandleTypeDef *hdma)
3911 {
3912 /* Retrieve ADC handle corresponding to current DMA handle */
3913 ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3914
3915 /* Set ADC state */
3916 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
3917
3918 /* Set ADC error code to DMA error */
3919 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
3920
3921 /* Error callback */
3922 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
3923 hadc->ErrorCallback(hadc);
3924 #else
3925 HAL_ADC_ErrorCallback(hadc);
3926 #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
3927 }
3928
3929 /**
3930 * @brief Configure boost mode of selected ADC.
3931 * @note Prerequisite condition to use this function: ADC conversions must be
3932 * stopped.
3933 * @param hadc ADC handle
3934 * @retval None.
3935 */
ADC_ConfigureBoostMode(ADC_HandleTypeDef * hadc)3936 void ADC_ConfigureBoostMode(ADC_HandleTypeDef *hadc)
3937 {
3938 uint32_t freq;
3939 if (ADC_IS_SYNCHRONOUS_CLOCK_MODE(hadc))
3940 {
3941 freq = HAL_RCC_GetHCLKFreq();
3942 switch (hadc->Init.ClockPrescaler)
3943 {
3944 case ADC_CLOCK_SYNC_PCLK_DIV1:
3945 case ADC_CLOCK_SYNC_PCLK_DIV2:
3946 freq /= (hadc->Init.ClockPrescaler >> ADC_CCR_CKMODE_Pos);
3947 break;
3948 case ADC_CLOCK_SYNC_PCLK_DIV4:
3949 freq /= 4UL;
3950 break;
3951 default:
3952 break;
3953 }
3954 }
3955 else
3956 {
3957 freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_ADC);
3958 switch (hadc->Init.ClockPrescaler)
3959 {
3960 case ADC_CLOCK_ASYNC_DIV2:
3961 case ADC_CLOCK_ASYNC_DIV4:
3962 case ADC_CLOCK_ASYNC_DIV6:
3963 case ADC_CLOCK_ASYNC_DIV8:
3964 case ADC_CLOCK_ASYNC_DIV10:
3965 case ADC_CLOCK_ASYNC_DIV12:
3966 freq /= ((hadc->Init.ClockPrescaler >> ADC_CCR_PRESC_Pos) << 1UL);
3967 break;
3968 case ADC_CLOCK_ASYNC_DIV16:
3969 freq /= 16UL;
3970 break;
3971 case ADC_CLOCK_ASYNC_DIV32:
3972 freq /= 32UL;
3973 break;
3974 case ADC_CLOCK_ASYNC_DIV64:
3975 freq /= 64UL;
3976 break;
3977 case ADC_CLOCK_ASYNC_DIV128:
3978 freq /= 128UL;
3979 break;
3980 case ADC_CLOCK_ASYNC_DIV256:
3981 freq /= 256UL;
3982 break;
3983 default:
3984 break;
3985 }
3986 }
3987
3988 #if defined(ADC_VER_V5_3) || defined(ADC_VER_V5_V90)
3989 freq /= 2U;
3990 if (freq <= 6250000UL)
3991 {
3992 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, 0UL);
3993 }
3994 else if (freq <= 12500000UL)
3995 {
3996 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_0);
3997 }
3998 else if (freq <= 25000000UL)
3999 {
4000 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_1);
4001 }
4002 else /* if(freq > 25000000UL) */
4003 {
4004 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_1 | ADC_CR_BOOST_0);
4005 }
4006 #else
4007 if (HAL_GetREVID() <= REV_ID_Y) /* STM32H7 silicon Rev.Y */
4008 {
4009 if (freq > 20000000UL)
4010 {
4011 SET_BIT(hadc->Instance->CR, ADC_CR_BOOST_0);
4012 }
4013 else
4014 {
4015 CLEAR_BIT(hadc->Instance->CR, ADC_CR_BOOST_0);
4016 }
4017 }
4018 else /* STM32H7 silicon Rev.V */
4019 {
4020 freq /= 2U; /* divider by 2 for Rev.V */
4021
4022 if (freq <= 6250000UL)
4023 {
4024 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, 0UL);
4025 }
4026 else if (freq <= 12500000UL)
4027 {
4028 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_0);
4029 }
4030 else if (freq <= 25000000UL)
4031 {
4032 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_1);
4033 }
4034 else /* if(freq > 25000000UL) */
4035 {
4036 MODIFY_REG(hadc->Instance->CR, ADC_CR_BOOST, ADC_CR_BOOST_1 | ADC_CR_BOOST_0);
4037 }
4038 }
4039 #endif /* ADC_VER_V5_3 */
4040 }
4041
4042 /**
4043 * @}
4044 */
4045
4046 #endif /* HAL_ADC_MODULE_ENABLED */
4047 /**
4048 * @}
4049 */
4050
4051 /**
4052 * @}
4053 */
4054
4055