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