1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_hal_adc_ex.c
4   * @author  MCD Application Team
5   * @brief   This file provides firmware functions to manage the following
6   *          functionalities of the ADC extension peripheral:
7   *           + Extended features functions
8   *
9   ******************************************************************************
10   * @attention
11   *
12   * Copyright (c) 2017 STMicroelectronics.
13   * All rights reserved.
14   *
15   * This software is licensed under terms that can be found in the LICENSE file
16   * in the root directory of this software component.
17   * If no LICENSE file comes with this software, it is provided AS-IS.
18   *
19   ******************************************************************************
20   @verbatim
21   ==============================================================================
22                     ##### How to use this driver #####
23   ==============================================================================
24     [..]
25     (#)Initialize the ADC low level resources by implementing the HAL_ADC_MspInit():
26        (##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE()
27        (##) ADC pins configuration
28              (+++) Enable the clock for the ADC GPIOs using the following function:
29                    __HAL_RCC_GPIOx_CLK_ENABLE()
30              (+++) Configure these ADC pins in analog mode using HAL_GPIO_Init()
31        (##) In case of using interrupts (e.g. HAL_ADC_Start_IT())
32              (+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority()
33              (+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ()
34              (+++) In ADC IRQ handler, call HAL_ADC_IRQHandler()
35       (##) In case of using DMA to control data transfer (e.g. HAL_ADC_Start_DMA())
36              (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE()
37              (+++) Configure and enable two DMA streams stream for managing data
38                  transfer from peripheral to memory (output stream)
39              (+++) Associate the initialized DMA handle to the ADC DMA handle
40                  using  __HAL_LINKDMA()
41              (+++) Configure the priority and enable the NVIC for the transfer complete
42                  interrupt on the two DMA Streams. The output stream should have higher
43                  priority than the input stream.
44      (#) Configure the ADC Prescaler, conversion resolution and data alignment
45          using the HAL_ADC_Init() function.
46 
47      (#) Configure the ADC Injected channels group features, use HAL_ADC_Init()
48          and HAL_ADC_ConfigChannel() functions.
49 
50      (#) Three operation modes are available within this driver:
51 
52      *** Polling mode IO operation ***
53      =================================
54      [..]
55        (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart()
56        (+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage
57            user can specify the value of timeout according to his end application
58        (+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue() function.
59        (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop()
60 
61      *** Interrupt mode IO operation ***
62      ===================================
63      [..]
64        (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_IT()
65        (+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine
66        (+) At ADC end of conversion HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can
67             add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback
68        (+) In case of ADC Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can
69             add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback
70        (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_IT()
71 
72      *** Multi mode ADCs Regular channels configuration ***
73      ======================================================
74      [..]
75        (+) Select the Multi mode ADC regular channels features (dual or triple mode)
76           and configure the DMA mode using HAL_ADCEx_MultiModeConfigChannel() functions.
77        (+) Start the ADC peripheral using HAL_ADCEx_MultiModeStart_DMA(), at this stage the user specify the length
78            of data to be transferred at each end of conversion
79        (+) Read the ADCs converted values using the HAL_ADCEx_MultiModeGetValue() function.
80 
81 
82     @endverbatim
83   */
84 
85 /* Includes ------------------------------------------------------------------*/
86 #include "stm32f4xx_hal.h"
87 
88 /** @addtogroup STM32F4xx_HAL_Driver
89   * @{
90   */
91 
92 /** @defgroup ADCEx ADCEx
93   * @brief ADC Extended driver modules
94   * @{
95   */
96 
97 #ifdef HAL_ADC_MODULE_ENABLED
98 
99 /* Private typedef -----------------------------------------------------------*/
100 /* Private define ------------------------------------------------------------*/
101 /* Private macro -------------------------------------------------------------*/
102 /* Private variables ---------------------------------------------------------*/
103 /** @addtogroup ADCEx_Private_Functions
104   * @{
105   */
106 /* Private function prototypes -----------------------------------------------*/
107 static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma);
108 static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma);
109 static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma);
110 /**
111   * @}
112   */
113 
114 /* Exported functions --------------------------------------------------------*/
115 /** @defgroup ADCEx_Exported_Functions ADC Exported Functions
116   * @{
117   */
118 
119 /** @defgroup ADCEx_Exported_Functions_Group1  Extended features functions
120   *  @brief    Extended features functions
121   *
122 @verbatim
123  ===============================================================================
124                  ##### Extended features functions #####
125  ===============================================================================
126     [..]  This section provides functions allowing to:
127       (+) Start conversion of injected channel.
128       (+) Stop conversion of injected channel.
129       (+) Start multimode and enable DMA transfer.
130       (+) Stop multimode and disable DMA transfer.
131       (+) Get result of injected channel conversion.
132       (+) Get result of multimode conversion.
133       (+) Configure injected channels.
134       (+) Configure multimode.
135 
136 @endverbatim
137   * @{
138   */
139 
140 /**
141   * @brief  Enables the selected ADC software start conversion of the injected channels.
142   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
143   *         the configuration information for the specified ADC.
144   * @retval HAL status
145   */
HAL_ADCEx_InjectedStart(ADC_HandleTypeDef * hadc)146 HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc)
147 {
148   __IO uint32_t counter = 0U;
149   uint32_t tmp1 = 0U, tmp2 = 0U;
150   ADC_Common_TypeDef *tmpADC_Common;
151 
152   /* Process locked */
153   __HAL_LOCK(hadc);
154 
155   /* Enable the ADC peripheral */
156 
157   /* Check if ADC peripheral is disabled in order to enable it and wait during
158      Tstab time the ADC's stabilization */
159   if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
160   {
161     /* Enable the Peripheral */
162     __HAL_ADC_ENABLE(hadc);
163 
164     /* Delay for ADC stabilization time */
165     /* Compute number of CPU cycles to wait for */
166     counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U));
167     while(counter != 0U)
168     {
169       counter--;
170     }
171   }
172 
173   /* Start conversion if ADC is effectively enabled */
174   if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
175   {
176     /* Set ADC state                                                          */
177     /* - Clear state bitfield related to injected group conversion results    */
178     /* - Set state bitfield related to injected operation                     */
179     ADC_STATE_CLR_SET(hadc->State,
180                       HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC,
181                       HAL_ADC_STATE_INJ_BUSY);
182 
183     /* Check if a regular conversion is ongoing */
184     /* Note: On this device, there is no ADC error code fields related to     */
185     /*       conversions on group injected only. In case of conversion on     */
186     /*       going on group regular, no error code is reset.                  */
187     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
188     {
189       /* Reset ADC all error code fields */
190       ADC_CLEAR_ERRORCODE(hadc);
191     }
192 
193     /* Process unlocked */
194     /* Unlock before starting ADC conversions: in case of potential           */
195     /* interruption, to let the process to ADC IRQ Handler.                   */
196     __HAL_UNLOCK(hadc);
197 
198     /* Clear injected group conversion flag */
199     /* (To ensure of no unknown state from potential previous ADC operations) */
200     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
201 
202     /* Pointer to the common control register to which is belonging hadc    */
203     /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
204     /* control register)                                                    */
205     tmpADC_Common = ADC_COMMON_REGISTER(hadc);
206 
207     /* Check if Multimode enabled */
208     if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI))
209     {
210       tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
211       tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
212       if(tmp1 && tmp2)
213       {
214         /* Enable the selected ADC software conversion for injected group */
215         hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
216       }
217     }
218     else
219     {
220       tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
221       tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
222       if((hadc->Instance == ADC1) && tmp1 && tmp2)
223       {
224         /* Enable the selected ADC software conversion for injected group */
225         hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
226       }
227     }
228   }
229   else
230   {
231     /* Update ADC state machine to error */
232     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
233 
234     /* Set ADC error code to ADC IP internal error */
235     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
236   }
237 
238   /* Return function status */
239   return HAL_OK;
240 }
241 
242 /**
243   * @brief  Enables the interrupt and starts ADC conversion of injected channels.
244   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
245   *         the configuration information for the specified ADC.
246   *
247   * @retval HAL status.
248   */
HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef * hadc)249 HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc)
250 {
251   __IO uint32_t counter = 0U;
252   uint32_t tmp1 = 0U, tmp2 = 0U;
253   ADC_Common_TypeDef *tmpADC_Common;
254 
255   /* Process locked */
256   __HAL_LOCK(hadc);
257 
258   /* Enable the ADC peripheral */
259 
260   /* Check if ADC peripheral is disabled in order to enable it and wait during
261      Tstab time the ADC's stabilization */
262   if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
263   {
264     /* Enable the Peripheral */
265     __HAL_ADC_ENABLE(hadc);
266 
267     /* Delay for ADC stabilization time */
268     /* Compute number of CPU cycles to wait for */
269     counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U));
270     while(counter != 0U)
271     {
272       counter--;
273     }
274   }
275 
276   /* Start conversion if ADC is effectively enabled */
277   if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
278   {
279     /* Set ADC state                                                          */
280     /* - Clear state bitfield related to injected group conversion results    */
281     /* - Set state bitfield related to injected operation                     */
282     ADC_STATE_CLR_SET(hadc->State,
283                       HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC,
284                       HAL_ADC_STATE_INJ_BUSY);
285 
286     /* Check if a regular conversion is ongoing */
287     /* Note: On this device, there is no ADC error code fields related to     */
288     /*       conversions on group injected only. In case of conversion on     */
289     /*       going on group regular, no error code is reset.                  */
290     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
291     {
292       /* Reset ADC all error code fields */
293       ADC_CLEAR_ERRORCODE(hadc);
294     }
295 
296     /* Process unlocked */
297     /* Unlock before starting ADC conversions: in case of potential           */
298     /* interruption, to let the process to ADC IRQ Handler.                   */
299     __HAL_UNLOCK(hadc);
300 
301     /* Clear injected group conversion flag */
302     /* (To ensure of no unknown state from potential previous ADC operations) */
303     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
304 
305     /* Enable end of conversion interrupt for injected channels */
306     __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
307 
308     /* Pointer to the common control register to which is belonging hadc    */
309     /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
310     /* control register)                                                    */
311     tmpADC_Common = ADC_COMMON_REGISTER(hadc);
312 
313     /* Check if Multimode enabled */
314     if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI))
315     {
316       tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
317       tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
318       if(tmp1 && tmp2)
319       {
320         /* Enable the selected ADC software conversion for injected group */
321         hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
322       }
323     }
324     else
325     {
326       tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
327       tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
328       if((hadc->Instance == ADC1) && tmp1 && tmp2)
329       {
330         /* Enable the selected ADC software conversion for injected group */
331         hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
332       }
333     }
334   }
335   else
336   {
337     /* Update ADC state machine to error */
338     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
339 
340     /* Set ADC error code to ADC IP internal error */
341     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
342   }
343 
344   /* Return function status */
345   return HAL_OK;
346 }
347 
348 /**
349   * @brief  Stop conversion of injected channels. Disable ADC peripheral if
350   *         no regular conversion is on going.
351   * @note   If ADC must be disabled and if conversion is on going on
352   *         regular group, function HAL_ADC_Stop must be used to stop both
353   *         injected and regular groups, and disable the ADC.
354   * @note   If injected group mode auto-injection is enabled,
355   *         function HAL_ADC_Stop must be used.
356   * @note   In case of auto-injection mode, HAL_ADC_Stop must be used.
357   * @param  hadc ADC handle
358   * @retval None
359   */
HAL_ADCEx_InjectedStop(ADC_HandleTypeDef * hadc)360 HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef* hadc)
361 {
362   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
363 
364   /* Check the parameters */
365   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
366 
367   /* Process locked */
368   __HAL_LOCK(hadc);
369 
370   /* Stop potential conversion and disable ADC peripheral                     */
371   /* Conditioned to:                                                          */
372   /* - No conversion on the other group (regular group) is intended to        */
373   /*   continue (injected and regular groups stop conversion and ADC disable  */
374   /*   are common)                                                            */
375   /* - In case of auto-injection mode, HAL_ADC_Stop must be used.             */
376   if(((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET)  &&
377      HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO)   )
378   {
379     /* Stop potential conversion on going, on regular and injected groups */
380     /* Disable ADC peripheral */
381     __HAL_ADC_DISABLE(hadc);
382 
383     /* Check if ADC is effectively disabled */
384     if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
385     {
386       /* Set ADC state */
387       ADC_STATE_CLR_SET(hadc->State,
388                         HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
389                         HAL_ADC_STATE_READY);
390     }
391   }
392   else
393   {
394     /* Update ADC state machine to error */
395     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
396 
397     tmp_hal_status = HAL_ERROR;
398   }
399 
400   /* Process unlocked */
401   __HAL_UNLOCK(hadc);
402 
403   /* Return function status */
404   return tmp_hal_status;
405 }
406 
407 /**
408   * @brief  Poll for injected conversion complete
409   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
410   *         the configuration information for the specified ADC.
411   * @param  Timeout Timeout value in millisecond.
412   * @retval HAL status
413   */
HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef * hadc,uint32_t Timeout)414 HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
415 {
416   uint32_t tickstart = 0U;
417 
418   /* Get tick */
419   tickstart = HAL_GetTick();
420 
421   /* Check End of conversion flag */
422   while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC)))
423   {
424     /* Check for the Timeout */
425     if(Timeout != HAL_MAX_DELAY)
426     {
427       if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
428       {
429         /* New check to avoid false timeout detection in case of preemption */
430         if(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC)))
431         {
432           hadc->State= HAL_ADC_STATE_TIMEOUT;
433           /* Process unlocked */
434           __HAL_UNLOCK(hadc);
435           return HAL_TIMEOUT;
436         }
437       }
438     }
439   }
440 
441   /* Clear injected group conversion flag */
442   __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JSTRT | ADC_FLAG_JEOC);
443 
444   /* Update ADC state machine */
445   SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC);
446 
447   /* Determine whether any further conversion upcoming on group injected      */
448   /* by external trigger, continuous mode or scan sequence on going.          */
449   /* Note: On STM32F4, there is no independent flag of end of sequence.       */
450   /*       The test of scan sequence on going is done either with scan        */
451   /*       sequence disabled or with end of conversion flag set to            */
452   /*       of end of sequence.                                                */
453   if(ADC_IS_SOFTWARE_START_INJECTED(hadc)                    &&
454      (HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JL)  ||
455       HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)    ) &&
456      (HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) &&
457       (ADC_IS_SOFTWARE_START_REGULAR(hadc)       &&
458       (hadc->Init.ContinuousConvMode == DISABLE)   )       )   )
459   {
460     /* Set ADC state */
461     CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY);
462 
463     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
464     {
465       SET_BIT(hadc->State, HAL_ADC_STATE_READY);
466     }
467   }
468 
469   /* Return ADC state */
470   return HAL_OK;
471 }
472 
473 /**
474   * @brief  Stop conversion of injected channels, disable interruption of
475   *         end-of-conversion. Disable ADC peripheral if no regular conversion
476   *         is on going.
477   * @note   If ADC must be disabled and if conversion is on going on
478   *         regular group, function HAL_ADC_Stop must be used to stop both
479   *         injected and regular groups, and disable the ADC.
480   * @note   If injected group mode auto-injection is enabled,
481   *         function HAL_ADC_Stop must be used.
482   * @param  hadc ADC handle
483   * @retval None
484   */
HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef * hadc)485 HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef* hadc)
486 {
487   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
488 
489   /* Check the parameters */
490   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
491 
492   /* Process locked */
493   __HAL_LOCK(hadc);
494 
495   /* Stop potential conversion and disable ADC peripheral                     */
496   /* Conditioned to:                                                          */
497   /* - No conversion on the other group (regular group) is intended to        */
498   /*   continue (injected and regular groups stop conversion and ADC disable  */
499   /*   are common)                                                            */
500   /* - In case of auto-injection mode, HAL_ADC_Stop must be used.             */
501   if(((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET)  &&
502      HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO)   )
503   {
504     /* Stop potential conversion on going, on regular and injected groups */
505     /* Disable ADC peripheral */
506     __HAL_ADC_DISABLE(hadc);
507 
508     /* Check if ADC is effectively disabled */
509     if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
510     {
511       /* Disable ADC end of conversion interrupt for injected channels */
512       __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
513 
514       /* Set ADC state */
515       ADC_STATE_CLR_SET(hadc->State,
516                         HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
517                         HAL_ADC_STATE_READY);
518     }
519   }
520   else
521   {
522     /* Update ADC state machine to error */
523     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
524 
525     tmp_hal_status = HAL_ERROR;
526   }
527 
528   /* Process unlocked */
529   __HAL_UNLOCK(hadc);
530 
531   /* Return function status */
532   return tmp_hal_status;
533 }
534 
535 /**
536   * @brief  Gets the converted value from data register of injected channel.
537   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
538   *         the configuration information for the specified ADC.
539   * @param  InjectedRank the ADC injected rank.
540   *          This parameter can be one of the following values:
541   *            @arg ADC_INJECTED_RANK_1: Injected Channel1 selected
542   *            @arg ADC_INJECTED_RANK_2: Injected Channel2 selected
543   *            @arg ADC_INJECTED_RANK_3: Injected Channel3 selected
544   *            @arg ADC_INJECTED_RANK_4: Injected Channel4 selected
545   * @retval None
546   */
HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef * hadc,uint32_t InjectedRank)547 uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank)
548 {
549   __IO uint32_t tmp = 0U;
550 
551   /* Check the parameters */
552   assert_param(IS_ADC_INJECTED_RANK(InjectedRank));
553 
554   /* Clear injected group conversion flag to have similar behaviour as        */
555   /* regular group: reading data register also clears end of conversion flag. */
556   __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
557 
558   /* Return the selected ADC converted value */
559   switch(InjectedRank)
560   {
561     case ADC_INJECTED_RANK_4:
562     {
563       tmp =  hadc->Instance->JDR4;
564     }
565     break;
566     case ADC_INJECTED_RANK_3:
567     {
568       tmp =  hadc->Instance->JDR3;
569     }
570     break;
571     case ADC_INJECTED_RANK_2:
572     {
573       tmp =  hadc->Instance->JDR2;
574     }
575     break;
576     case ADC_INJECTED_RANK_1:
577     {
578       tmp =  hadc->Instance->JDR1;
579     }
580     break;
581     default:
582     break;
583   }
584   return tmp;
585 }
586 
587 /**
588   * @brief  Enables ADC DMA request after last transfer (Multi-ADC mode) and enables ADC peripheral
589   *
590   * @note   Caution: This function must be used only with the ADC master.
591   *
592   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
593   *         the configuration information for the specified ADC.
594   * @param  pData   Pointer to buffer in which transferred from ADC peripheral to memory will be stored.
595   * @param  Length  The length of data to be transferred from ADC peripheral to memory.
596   * @retval HAL status
597   */
HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef * hadc,uint32_t * pData,uint32_t Length)598 HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
599 {
600   __IO uint32_t counter = 0U;
601   ADC_Common_TypeDef *tmpADC_Common;
602 
603   /* Check the parameters */
604   assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
605   assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
606   assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
607 
608   /* Process locked */
609   __HAL_LOCK(hadc);
610 
611   /* Check if ADC peripheral is disabled in order to enable it and wait during
612      Tstab time the ADC's stabilization */
613   if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
614   {
615     /* Enable the Peripheral */
616     __HAL_ADC_ENABLE(hadc);
617 
618     /* Delay for temperature sensor stabilization time */
619     /* Compute number of CPU cycles to wait for */
620     counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U));
621     while(counter != 0U)
622     {
623       counter--;
624     }
625   }
626 
627   /* Start conversion if ADC is effectively enabled */
628   if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
629   {
630     /* Set ADC state                                                          */
631     /* - Clear state bitfield related to regular group conversion results     */
632     /* - Set state bitfield related to regular group operation                */
633     ADC_STATE_CLR_SET(hadc->State,
634                       HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
635                       HAL_ADC_STATE_REG_BUSY);
636 
637     /* If conversions on group regular are also triggering group injected,    */
638     /* update ADC state.                                                      */
639     if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET)
640     {
641       ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
642     }
643 
644     /* State machine update: Check if an injected conversion is ongoing */
645     if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
646     {
647       /* Reset ADC error code fields related to conversions on group regular */
648       CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
649     }
650     else
651     {
652       /* Reset ADC all error code fields */
653       ADC_CLEAR_ERRORCODE(hadc);
654     }
655 
656     /* Process unlocked */
657     /* Unlock before starting ADC conversions: in case of potential           */
658     /* interruption, to let the process to ADC IRQ Handler.                   */
659     __HAL_UNLOCK(hadc);
660 
661     /* Set the DMA transfer complete callback */
662     hadc->DMA_Handle->XferCpltCallback = ADC_MultiModeDMAConvCplt;
663 
664     /* Set the DMA half transfer complete callback */
665     hadc->DMA_Handle->XferHalfCpltCallback = ADC_MultiModeDMAHalfConvCplt;
666 
667     /* Set the DMA error callback */
668     hadc->DMA_Handle->XferErrorCallback = ADC_MultiModeDMAError ;
669 
670     /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC     */
671     /* start (in case of SW start):                                           */
672 
673     /* Clear regular group conversion flag and overrun flag */
674     /* (To ensure of no unknown state from potential previous ADC operations) */
675     __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC);
676 
677     /* Enable ADC overrun interrupt */
678     __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
679 
680     /* Pointer to the common control register to which is belonging hadc    */
681     /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
682     /* control register)                                                    */
683     tmpADC_Common = ADC_COMMON_REGISTER(hadc);
684 
685     if (hadc->Init.DMAContinuousRequests != DISABLE)
686     {
687       /* Enable the selected ADC DMA request after last transfer */
688       tmpADC_Common->CCR |= ADC_CCR_DDS;
689     }
690     else
691     {
692       /* Disable the selected ADC EOC rising on each regular channel conversion */
693       tmpADC_Common->CCR &= ~ADC_CCR_DDS;
694     }
695 
696     /* Enable the DMA Stream */
697     HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&tmpADC_Common->CDR, (uint32_t)pData, Length);
698 
699     /* if no external trigger present enable software conversion of regular channels */
700     if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)
701     {
702       /* Enable the selected ADC software conversion for regular group */
703       hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART;
704     }
705   }
706   else
707   {
708     /* Update ADC state machine to error */
709     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
710 
711     /* Set ADC error code to ADC IP internal error */
712     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
713   }
714 
715   /* Return function status */
716   return HAL_OK;
717 }
718 
719 /**
720   * @brief  Disables ADC DMA (multi-ADC mode) and disables ADC peripheral
721   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
722   *         the configuration information for the specified ADC.
723   * @retval HAL status
724   */
HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef * hadc)725 HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef* hadc)
726 {
727   HAL_StatusTypeDef tmp_hal_status = HAL_OK;
728   ADC_Common_TypeDef *tmpADC_Common;
729 
730   /* Check the parameters */
731   assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
732 
733   /* Process locked */
734   __HAL_LOCK(hadc);
735 
736   /* Stop potential conversion on going, on regular and injected groups */
737   /* Disable ADC peripheral */
738   __HAL_ADC_DISABLE(hadc);
739 
740   /* Pointer to the common control register to which is belonging hadc    */
741   /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
742   /* control register)                                                    */
743   tmpADC_Common = ADC_COMMON_REGISTER(hadc);
744 
745   /* Check if ADC is effectively disabled */
746   if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
747   {
748     /* Disable the selected ADC DMA mode for multimode */
749     tmpADC_Common->CCR &= ~ADC_CCR_DDS;
750 
751     /* Disable the DMA channel (in case of DMA in circular mode or stop while */
752     /* DMA transfer is on going)                                              */
753     tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
754 
755     /* Disable ADC overrun interrupt */
756     __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
757 
758     /* Set ADC state */
759     ADC_STATE_CLR_SET(hadc->State,
760                       HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
761                       HAL_ADC_STATE_READY);
762   }
763 
764   /* Process unlocked */
765   __HAL_UNLOCK(hadc);
766 
767   /* Return function status */
768   return tmp_hal_status;
769 }
770 
771 /**
772   * @brief  Returns the last ADC1, ADC2 and ADC3 regular conversions results
773   *         data in the selected multi mode.
774   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
775   *         the configuration information for the specified ADC.
776   * @retval The converted data value.
777   */
HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef * hadc)778 uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef* hadc)
779 {
780   ADC_Common_TypeDef *tmpADC_Common;
781 
782   /* Pointer to the common control register to which is belonging hadc    */
783   /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
784   /* control register)                                                    */
785   tmpADC_Common = ADC_COMMON_REGISTER(hadc);
786 
787   /* Return the multi mode conversion value */
788   return tmpADC_Common->CDR;
789 }
790 
791 /**
792   * @brief  Injected conversion complete callback in non blocking mode
793   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
794   *         the configuration information for the specified ADC.
795   * @retval None
796   */
HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef * hadc)797 __weak void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
798 {
799   /* Prevent unused argument(s) compilation warning */
800   UNUSED(hadc);
801   /* NOTE : This function Should not be modified, when the callback is needed,
802             the HAL_ADC_InjectedConvCpltCallback could be implemented in the user file
803    */
804 }
805 
806 /**
807   * @brief  Configures for the selected ADC injected channel its corresponding
808   *         rank in the sequencer and its sample time.
809   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
810   *         the configuration information for the specified ADC.
811   * @param  sConfigInjected ADC configuration structure for injected channel.
812   * @retval None
813   */
HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef * hadc,ADC_InjectionConfTypeDef * sConfigInjected)814 HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_InjectionConfTypeDef* sConfigInjected)
815 {
816 
817 #ifdef USE_FULL_ASSERT
818   uint32_t tmp = 0U;
819 
820 #endif /* USE_FULL_ASSERT  */
821 
822   ADC_Common_TypeDef *tmpADC_Common;
823 
824   /* Check the parameters */
825   assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel));
826   assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank));
827   assert_param(IS_ADC_SAMPLE_TIME(sConfigInjected->InjectedSamplingTime));
828   assert_param(IS_ADC_EXT_INJEC_TRIG(sConfigInjected->ExternalTrigInjecConv));
829   assert_param(IS_ADC_INJECTED_LENGTH(sConfigInjected->InjectedNbrOfConversion));
830   assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->AutoInjectedConv));
831   assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiscontinuousConvMode));
832 
833 #ifdef USE_FULL_ASSERT
834   tmp = ADC_GET_RESOLUTION(hadc);
835   assert_param(IS_ADC_RANGE(tmp, sConfigInjected->InjectedOffset));
836 #endif /* USE_FULL_ASSERT  */
837 
838   if(sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START)
839   {
840     assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(sConfigInjected->ExternalTrigInjecConvEdge));
841   }
842 
843   /* Process locked */
844   __HAL_LOCK(hadc);
845 
846   /* if ADC_Channel_10 ... ADC_Channel_18 is selected */
847   if (sConfigInjected->InjectedChannel > ADC_CHANNEL_9)
848   {
849     /* Clear the old sample time */
850     hadc->Instance->SMPR1 &= ~ADC_SMPR1(ADC_SMPR1_SMP10, sConfigInjected->InjectedChannel);
851 
852     /* Set the new sample time */
853     hadc->Instance->SMPR1 |= ADC_SMPR1(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel);
854   }
855   else /* ADC_Channel include in ADC_Channel_[0..9] */
856   {
857     /* Clear the old sample time */
858     hadc->Instance->SMPR2 &= ~ADC_SMPR2(ADC_SMPR2_SMP0, sConfigInjected->InjectedChannel);
859 
860     /* Set the new sample time */
861     hadc->Instance->SMPR2 |= ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel);
862   }
863 
864   /*---------------------------- ADCx JSQR Configuration -----------------*/
865   hadc->Instance->JSQR &= ~(ADC_JSQR_JL);
866   hadc->Instance->JSQR |=  ADC_SQR1(sConfigInjected->InjectedNbrOfConversion);
867 
868   /* Rank configuration */
869 
870   /* Clear the old SQx bits for the selected rank */
871   hadc->Instance->JSQR &= ~ADC_JSQR(ADC_JSQR_JSQ1, sConfigInjected->InjectedRank,sConfigInjected->InjectedNbrOfConversion);
872 
873   /* Set the SQx bits for the selected rank */
874   hadc->Instance->JSQR |= ADC_JSQR(sConfigInjected->InjectedChannel, sConfigInjected->InjectedRank,sConfigInjected->InjectedNbrOfConversion);
875 
876   /* Enable external trigger if trigger selection is different of software  */
877   /* start.                                                                 */
878   /* Note: This configuration keeps the hardware feature of parameter       */
879   /*       ExternalTrigConvEdge "trigger edge none" equivalent to           */
880   /*       software start.                                                  */
881   if(sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START)
882   {
883     /* Select external trigger to start conversion */
884     hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL);
885     hadc->Instance->CR2 |=  sConfigInjected->ExternalTrigInjecConv;
886 
887     /* Select external trigger polarity */
888     hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN);
889     hadc->Instance->CR2 |= sConfigInjected->ExternalTrigInjecConvEdge;
890   }
891   else
892   {
893     /* Reset the external trigger */
894     hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL);
895     hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN);
896   }
897 
898   if (sConfigInjected->AutoInjectedConv != DISABLE)
899   {
900     /* Enable the selected ADC automatic injected group conversion */
901     hadc->Instance->CR1 |= ADC_CR1_JAUTO;
902   }
903   else
904   {
905     /* Disable the selected ADC automatic injected group conversion */
906     hadc->Instance->CR1 &= ~(ADC_CR1_JAUTO);
907   }
908 
909   if (sConfigInjected->InjectedDiscontinuousConvMode != DISABLE)
910   {
911     /* Enable the selected ADC injected discontinuous mode */
912     hadc->Instance->CR1 |= ADC_CR1_JDISCEN;
913   }
914   else
915   {
916     /* Disable the selected ADC injected discontinuous mode */
917     hadc->Instance->CR1 &= ~(ADC_CR1_JDISCEN);
918   }
919 
920   switch(sConfigInjected->InjectedRank)
921   {
922     case 1U:
923       /* Set injected channel 1 offset */
924       hadc->Instance->JOFR1 &= ~(ADC_JOFR1_JOFFSET1);
925       hadc->Instance->JOFR1 |= sConfigInjected->InjectedOffset;
926       break;
927     case 2U:
928       /* Set injected channel 2 offset */
929       hadc->Instance->JOFR2 &= ~(ADC_JOFR2_JOFFSET2);
930       hadc->Instance->JOFR2 |= sConfigInjected->InjectedOffset;
931       break;
932     case 3U:
933       /* Set injected channel 3 offset */
934       hadc->Instance->JOFR3 &= ~(ADC_JOFR3_JOFFSET3);
935       hadc->Instance->JOFR3 |= sConfigInjected->InjectedOffset;
936       break;
937     default:
938       /* Set injected channel 4 offset */
939       hadc->Instance->JOFR4 &= ~(ADC_JOFR4_JOFFSET4);
940       hadc->Instance->JOFR4 |= sConfigInjected->InjectedOffset;
941       break;
942   }
943 
944   /* Pointer to the common control register to which is belonging hadc    */
945   /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
946   /* control register)                                                    */
947     tmpADC_Common = ADC_COMMON_REGISTER(hadc);
948 
949   /* if ADC1 Channel_18 is selected enable VBAT Channel */
950   if ((hadc->Instance == ADC1) && (sConfigInjected->InjectedChannel == ADC_CHANNEL_VBAT))
951   {
952     /* Enable the VBAT channel*/
953     tmpADC_Common->CCR |= ADC_CCR_VBATE;
954   }
955 
956   /* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */
957   if ((hadc->Instance == ADC1) && ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT)))
958   {
959     /* Enable the TSVREFE channel*/
960     tmpADC_Common->CCR |= ADC_CCR_TSVREFE;
961   }
962 
963   /* Process unlocked */
964   __HAL_UNLOCK(hadc);
965 
966   /* Return function status */
967   return HAL_OK;
968 }
969 
970 /**
971   * @brief  Configures the ADC multi-mode
972   * @param  hadc       pointer to a ADC_HandleTypeDef structure that contains
973   *                     the configuration information for the specified ADC.
974   * @param  multimode  pointer to an ADC_MultiModeTypeDef structure that contains
975   *                     the configuration information for  multimode.
976   * @retval HAL status
977   */
HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef * hadc,ADC_MultiModeTypeDef * multimode)978 HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_MultiModeTypeDef* multimode)
979 {
980 
981   ADC_Common_TypeDef *tmpADC_Common;
982 
983   /* Check the parameters */
984   assert_param(IS_ADC_MODE(multimode->Mode));
985   assert_param(IS_ADC_DMA_ACCESS_MODE(multimode->DMAAccessMode));
986   assert_param(IS_ADC_SAMPLING_DELAY(multimode->TwoSamplingDelay));
987 
988   /* Process locked */
989   __HAL_LOCK(hadc);
990 
991   /* Pointer to the common control register to which is belonging hadc    */
992   /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */
993   /* control register)                                                    */
994   tmpADC_Common = ADC_COMMON_REGISTER(hadc);
995 
996   /* Set ADC mode */
997   tmpADC_Common->CCR &= ~(ADC_CCR_MULTI);
998   tmpADC_Common->CCR |= multimode->Mode;
999 
1000   /* Set the ADC DMA access mode */
1001   tmpADC_Common->CCR &= ~(ADC_CCR_DMA);
1002   tmpADC_Common->CCR |= multimode->DMAAccessMode;
1003 
1004   /* Set delay between two sampling phases */
1005   tmpADC_Common->CCR &= ~(ADC_CCR_DELAY);
1006   tmpADC_Common->CCR |= multimode->TwoSamplingDelay;
1007 
1008   /* Process unlocked */
1009   __HAL_UNLOCK(hadc);
1010 
1011   /* Return function status */
1012   return HAL_OK;
1013 }
1014 
1015 /**
1016   * @}
1017   */
1018 
1019 /**
1020   * @brief  DMA transfer complete callback.
1021   * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
1022   *                the configuration information for the specified DMA module.
1023   * @retval None
1024   */
ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef * hdma)1025 static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma)
1026 {
1027   /* Retrieve ADC handle corresponding to current DMA handle */
1028   ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1029 
1030   /* Update state machine on conversion status if not in error state */
1031   if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
1032   {
1033     /* Update ADC state machine */
1034     SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
1035 
1036     /* Determine whether any further conversion upcoming on group regular   */
1037     /* by external trigger, continuous mode or scan sequence on going.      */
1038     /* Note: On STM32F4, there is no independent flag of end of sequence.   */
1039     /*       The test of scan sequence on going is done either with scan    */
1040     /*       sequence disabled or with end of conversion flag set to        */
1041     /*       of end of sequence.                                            */
1042     if(ADC_IS_SOFTWARE_START_REGULAR(hadc)                   &&
1043        (hadc->Init.ContinuousConvMode == DISABLE)            &&
1044        (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) ||
1045         HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)  )   )
1046     {
1047       /* Disable ADC end of single conversion interrupt on group regular */
1048       /* Note: Overrun interrupt was enabled with EOC interrupt in          */
1049       /* HAL_ADC_Start_IT(), but is not disabled here because can be used   */
1050       /* by overrun IRQ process below.                                      */
1051       __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
1052 
1053       /* Set ADC state */
1054       CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
1055 
1056       if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY))
1057       {
1058         SET_BIT(hadc->State, HAL_ADC_STATE_READY);
1059       }
1060     }
1061 
1062     /* Conversion complete callback */
1063     HAL_ADC_ConvCpltCallback(hadc);
1064   }
1065   else
1066   {
1067     /* Call DMA error callback */
1068     hadc->DMA_Handle->XferErrorCallback(hdma);
1069   }
1070 }
1071 
1072 /**
1073   * @brief  DMA half transfer complete callback.
1074   * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
1075   *                the configuration information for the specified DMA module.
1076   * @retval None
1077   */
ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef * hdma)1078 static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma)
1079 {
1080     ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1081     /* Conversion complete callback */
1082     HAL_ADC_ConvHalfCpltCallback(hadc);
1083 }
1084 
1085 /**
1086   * @brief  DMA error callback
1087   * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
1088   *                the configuration information for the specified DMA module.
1089   * @retval None
1090   */
ADC_MultiModeDMAError(DMA_HandleTypeDef * hdma)1091 static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma)
1092 {
1093     ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1094     hadc->State= HAL_ADC_STATE_ERROR_DMA;
1095     /* Set ADC error code to DMA error */
1096     hadc->ErrorCode |= HAL_ADC_ERROR_DMA;
1097     HAL_ADC_ErrorCallback(hadc);
1098 }
1099 
1100 /**
1101   * @}
1102   */
1103 
1104 #endif /* HAL_ADC_MODULE_ENABLED */
1105 /**
1106   * @}
1107   */
1108 
1109 /**
1110   * @}
1111   */
1112 
1113