1 /**
2   ******************************************************************************
3   * @file    stm32f1xx_ll_adc.c
4   * @author  MCD Application Team
5   * @brief   ADC LL module driver
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2017 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 #if defined(USE_FULL_LL_DRIVER)
20 
21 /* Includes ------------------------------------------------------------------*/
22 #include "stm32f1xx_ll_adc.h"
23 #include "stm32f1xx_ll_bus.h"
24 
25 #ifdef  USE_FULL_ASSERT
26   #include "stm32_assert.h"
27 #else
28   #define assert_param(expr) ((void)0U)
29 #endif
30 
31 /** @addtogroup STM32F1xx_LL_Driver
32   * @{
33   */
34 
35 #if defined (ADC1) || defined (ADC2) || defined (ADC3)
36 
37 /** @addtogroup ADC_LL ADC
38   * @{
39   */
40 
41 /* Private types -------------------------------------------------------------*/
42 /* Private variables ---------------------------------------------------------*/
43 /* Private constants ---------------------------------------------------------*/
44 /* Private macros ------------------------------------------------------------*/
45 
46 /** @addtogroup ADC_LL_Private_Macros
47   * @{
48   */
49 
50 /* Check of parameters for configuration of ADC hierarchical scope:           */
51 /* common to several ADC instances.                                           */
52 /* Check of parameters for configuration of ADC hierarchical scope:           */
53 /* ADC instance.                                                              */
54 #define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__)                                   \
55   (   ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT)                            \
56    || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT)                             \
57   )
58 
59 #define IS_LL_ADC_SCAN_SELECTION(__SCAN_SELECTION__)                           \
60   (   ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_DISABLE)                        \
61    || ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_ENABLE)                         \
62   )
63 
64 #define IS_LL_ADC_SEQ_SCAN_MODE(__SEQ_SCAN_MODE__)                             \
65   (   ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_DISABLE)                             \
66    || ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_ENABLE)                              \
67   )
68 
69 /* Check of parameters for configuration of ADC hierarchical scope:           */
70 /* ADC group regular                                                          */
71 #if defined(ADC3)
72 #define IS_LL_ADC_REG_TRIG_SOURCE(__ADC_INSTANCE__, __REG_TRIG_SOURCE__)       \
73   ((((__ADC_INSTANCE__) == ADC1) || ((__ADC_INSTANCE__) == ADC2))              \
74     ? (   ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE)                  \
75        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3)              \
76        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1)              \
77        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2)              \
78        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2)              \
79        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO)             \
80        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4)              \
81        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11)           \
82        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO)             \
83       )                                                                        \
84       :                                                                        \
85       (   ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE)                  \
86        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3)              \
87        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH1)              \
88        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3)              \
89        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_CH1)              \
90        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO_ADC3)        \
91        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH1)              \
92        || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH3)              \
93       )                                                                        \
94   )
95 #else
96 #if defined (STM32F101xE) || defined (STM32F105xC) || defined (STM32F107xC)
97 #define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__)                         \
98   (   ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE)                      \
99    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3)                  \
100    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1)                  \
101    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2)                  \
102    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2)                  \
103    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO)                 \
104    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4)                  \
105    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11)               \
106    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO)                 \
107   )
108 #else
109 #define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__)                         \
110   (   ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE)                      \
111    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3)                  \
112    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1)                  \
113    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2)                  \
114    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2)                  \
115    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO)                 \
116    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4)                  \
117    || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11)               \
118   )
119 #endif
120 #endif
121 #define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__)                 \
122   (   ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE)                    \
123    || ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS)                \
124   )
125 
126 #define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__)                       \
127   (   ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE)                 \
128    || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED)            \
129   )
130 
131 #define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__)                 \
132   (   ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE)               \
133    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS)         \
134    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS)         \
135    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS)         \
136    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS)         \
137    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS)         \
138    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS)         \
139    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS)         \
140    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS)         \
141    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS)        \
142    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS)        \
143    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS)        \
144    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS)        \
145    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS)        \
146    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS)        \
147    || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS)        \
148   )
149 
150 #define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__)          \
151   (   ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE)           \
152    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK)             \
153    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS)            \
154    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS)            \
155    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS)            \
156    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS)            \
157    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS)            \
158    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS)            \
159    || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS)            \
160   )
161 
162 /* Check of parameters for configuration of ADC hierarchical scope:           */
163 /* ADC group injected                                                         */
164 #if defined(ADC3)
165 #define IS_LL_ADC_INJ_TRIG_SOURCE(__ADC_INSTANCE__, __INJ_TRIG_SOURCE__)       \
166   ((((__ADC_INSTANCE__) == ADC1) || ((__ADC_INSTANCE__) == ADC2))              \
167     ? (   ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE)                  \
168        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO)             \
169        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4)              \
170        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO)             \
171        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1)              \
172        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4)              \
173        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO)             \
174        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15)           \
175        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4)              \
176       )                                                                        \
177       :                                                                        \
178       (   ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE)                  \
179        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO)             \
180        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4)              \
181        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH3)              \
182        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH2)              \
183        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4_ADC3)         \
184        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_TRGO)             \
185        || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_CH4)              \
186       )                                                                        \
187   )
188 #else
189 #if defined (STM32F101xE) || defined (STM32F105xC) || defined (STM32F107xC)
190 #define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__)                         \
191   (   ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE)                      \
192    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO)                 \
193    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4)                  \
194    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO)                 \
195    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1)                  \
196    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4)                  \
197    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO)                 \
198    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15)               \
199    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4)                  \
200   )
201 #else
202 #define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__)                         \
203   (   ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE)                      \
204    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO)                 \
205    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4)                  \
206    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO)                 \
207    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1)                  \
208    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4)                  \
209    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO)                 \
210    || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15)               \
211   )
212 #endif
213 #endif
214 #define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__)                             \
215   (   ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT)                     \
216    || ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR)                \
217   )
218 
219 #define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__)                 \
220   (   ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE)               \
221    || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS)         \
222    || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS)         \
223    || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS)         \
224   )
225 
226 #define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__)          \
227   (   ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE)           \
228    || ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK)             \
229   )
230 
231 #if defined(ADC_MULTIMODE_SUPPORT)
232 /* Check of parameters for configuration of ADC hierarchical scope:           */
233 /* multimode.                                                                 */
234 #define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__)                                   \
235   (   ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT)                           \
236    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT)                       \
237    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL_FAST)                  \
238    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL_SLOW)                  \
239    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT)                       \
240    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN)                       \
241    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM)                  \
242    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT)                  \
243    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTFAST_INJ_SIM)              \
244    || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTSLOW_INJ_SIM)              \
245   )
246 
247 #define IS_LL_ADC_MULTI_MASTER_SLAVE(__MULTI_MASTER_SLAVE__)                   \
248   (   ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER)                        \
249    || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_SLAVE)                         \
250    || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER_SLAVE)                  \
251   )
252 
253 #endif /* ADC_MULTIMODE_SUPPORT */
254 /**
255   * @}
256   */
257 
258 
259 /* Private function prototypes -----------------------------------------------*/
260 
261 /* Exported functions --------------------------------------------------------*/
262 /** @addtogroup ADC_LL_Exported_Functions
263   * @{
264   */
265 
266 /** @addtogroup ADC_LL_EF_Init
267   * @{
268   */
269 
270 /**
271   * @brief  De-initialize registers of all ADC instances belonging to
272   *         the same ADC common instance to their default reset values.
273   * @param  ADCxy_COMMON ADC common instance
274   *         (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() )
275   * @retval An ErrorStatus enumeration value:
276   *          - SUCCESS: ADC common registers are de-initialized
277   *          - ERROR: not applicable
278   */
LL_ADC_CommonDeInit(ADC_Common_TypeDef * ADCxy_COMMON)279 ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON)
280 {
281   /* Check the parameters */
282   assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON));
283 
284   /* Force reset of ADC clock (core clock) */
285   LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_ADC1);
286 
287   /* Release reset of ADC clock (core clock) */
288   LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_ADC1);
289 
290   return SUCCESS;
291 }
292 
293 /**
294   * @brief  Initialize some features of ADC common parameters
295   *         (all ADC instances belonging to the same ADC common instance)
296   *         and multimode (for devices with several ADC instances available).
297   * @note   The setting of ADC common parameters is conditioned to
298   *         ADC instances state:
299   *         All ADC instances belonging to the same ADC common instance
300   *         must be disabled.
301   * @param  ADCxy_COMMON ADC common instance
302   *         (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() )
303   * @param  ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure
304   * @retval An ErrorStatus enumeration value:
305   *          - SUCCESS: ADC common registers are initialized
306   *          - ERROR: ADC common registers are not initialized
307   */
LL_ADC_CommonInit(ADC_Common_TypeDef * ADCxy_COMMON,LL_ADC_CommonInitTypeDef * ADC_CommonInitStruct)308 ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
309 {
310   ErrorStatus status = SUCCESS;
311 
312   /* Check the parameters */
313   assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON));
314 #if defined(ADC_MULTIMODE_SUPPORT)
315   assert_param(IS_LL_ADC_MULTI_MODE(ADC_CommonInitStruct->Multimode));
316 #endif /* ADC_MULTIMODE_SUPPORT */
317 
318   /* Note: Hardware constraint (refer to description of functions             */
319   /*       "LL_ADC_SetCommonXXX()" and "LL_ADC_SetMultiXXX()"):               */
320   /*       On this STM32 series, setting of these features is conditioned to   */
321   /*       ADC state:                                                         */
322   /*       All ADC instances of the ADC common group must be disabled.        */
323   if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0U)
324   {
325     /* Configuration of ADC hierarchical scope:                               */
326     /*  - common to several ADC                                               */
327     /*    (all ADC instances belonging to the same ADC common instance)       */
328     /*  - multimode (if several ADC instances available on the                */
329     /*    selected device)                                                    */
330     /*    - Set ADC multimode configuration                                   */
331     /*    - Set ADC multimode DMA transfer                                    */
332     /*    - Set ADC multimode: delay between 2 sampling phases                */
333 #if defined(ADC_MULTIMODE_SUPPORT)
334     if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT)
335     {
336       MODIFY_REG(ADCxy_COMMON->CR1,
337                  ADC_CR1_DUALMOD,
338                  ADC_CommonInitStruct->Multimode
339                 );
340     }
341     else
342     {
343       MODIFY_REG(ADCxy_COMMON->CR1,
344                  ADC_CR1_DUALMOD,
345                  LL_ADC_MULTI_INDEPENDENT
346                 );
347     }
348 #endif
349   }
350   else
351   {
352     /* Initialization error: One or several ADC instances belonging to        */
353     /* the same ADC common instance are not disabled.                         */
354     status = ERROR;
355   }
356 
357   return status;
358 }
359 
360 /**
361   * @brief  Set each @ref LL_ADC_CommonInitTypeDef field to default value.
362   * @param  ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure
363   *                              whose fields will be set to default values.
364   * @retval None
365   */
LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef * ADC_CommonInitStruct)366 void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
367 {
368   /* Set ADC_CommonInitStruct fields to default values */
369   /* Set fields of ADC common */
370   /* (all ADC instances belonging to the same ADC common instance) */
371 
372 #if defined(ADC_MULTIMODE_SUPPORT)
373   /* Set fields of ADC multimode */
374   ADC_CommonInitStruct->Multimode             = LL_ADC_MULTI_INDEPENDENT;
375 #endif /* ADC_MULTIMODE_SUPPORT */
376 }
377 
378 /**
379   * @brief  De-initialize registers of the selected ADC instance
380   *         to their default reset values.
381   * @note   To reset all ADC instances quickly (perform a hard reset),
382   *         use function @ref LL_ADC_CommonDeInit().
383   * @param  ADCx ADC instance
384   * @retval An ErrorStatus enumeration value:
385   *          - SUCCESS: ADC registers are de-initialized
386   *          - ERROR: ADC registers are not de-initialized
387   */
LL_ADC_DeInit(ADC_TypeDef * ADCx)388 ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx)
389 {
390   ErrorStatus status = SUCCESS;
391 
392   /* Check the parameters */
393   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
394 
395   /* Disable ADC instance if not already disabled.                            */
396   if(LL_ADC_IsEnabled(ADCx) == 1U)
397   {
398     /* Set ADC group regular trigger source to SW start to ensure to not      */
399     /* have an external trigger event occurring during the conversion stop    */
400     /* ADC disable process.                                                   */
401     LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE);
402 
403     /* Set ADC group injected trigger source to SW start to ensure to not     */
404     /* have an external trigger event occurring during the conversion stop    */
405     /* ADC disable process.                                                   */
406     LL_ADC_INJ_SetTriggerSource(ADCx, LL_ADC_INJ_TRIG_SOFTWARE);
407 
408     /* Disable the ADC instance */
409     LL_ADC_Disable(ADCx);
410   }
411 
412   /* Check whether ADC state is compliant with expected state */
413   /* (hardware requirements of bits state to reset registers below) */
414   if(READ_BIT(ADCx->CR2, ADC_CR2_ADON) == 0U)
415   {
416     /* ========== Reset ADC registers ========== */
417     /* Reset register SR */
418     CLEAR_BIT(ADCx->SR,
419               (  LL_ADC_FLAG_STRT
420                | LL_ADC_FLAG_JSTRT
421                | LL_ADC_FLAG_EOS
422                | LL_ADC_FLAG_JEOS
423                | LL_ADC_FLAG_AWD1 )
424              );
425 
426     /* Reset register CR1 */
427   #if defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F105xC) || defined (STM32F107xC) || defined (STM32F103xE) || defined (STM32F103xG)
428 
429     CLEAR_BIT(ADCx->CR1,
430               (  ADC_CR1_AWDEN   | ADC_CR1_JAWDEN  | ADC_CR1_DUALMOD
431                | ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN
432                | ADC_CR1_JAUTO   | ADC_CR1_AWDSGL  | ADC_CR1_SCAN
433                | ADC_CR1_JEOCIE  | ADC_CR1_AWDIE   | ADC_CR1_EOCIE
434                | ADC_CR1_AWDCH                                     )
435              );
436   #else
437 
438     CLEAR_BIT(ADCx->CR1,
439               (  ADC_CR1_AWDEN   | ADC_CR1_JAWDEN  | ADC_CR1_DISCNUM
440                | ADC_CR1_JDISCEN | ADC_CR1_DISCEN  | ADC_CR1_JAUTO
441                | ADC_CR1_AWDSGL  | ADC_CR1_SCAN    | ADC_CR1_JEOCIE
442                | ADC_CR1_AWDIE   | ADC_CR1_EOCIE   | ADC_CR1_AWDCH )
443              );
444   #endif
445 
446     /* Reset register CR2 */
447     CLEAR_BIT(ADCx->CR2,
448               (  ADC_CR2_TSVREFE
449                | ADC_CR2_SWSTART  | ADC_CR2_EXTTRIG  | ADC_CR2_EXTSEL
450                | ADC_CR2_JSWSTART | ADC_CR2_JEXTTRIG | ADC_CR2_JEXTSEL
451                | ADC_CR2_ALIGN    | ADC_CR2_DMA
452                | ADC_CR2_RSTCAL   | ADC_CR2_CAL
453                | ADC_CR2_CONT     | ADC_CR2_ADON                      )
454              );
455 
456     /* Reset register SMPR1 */
457     CLEAR_BIT(ADCx->SMPR1,
458               (  ADC_SMPR1_SMP17 | ADC_SMPR1_SMP16
459                | ADC_SMPR1_SMP15 | ADC_SMPR1_SMP14 | ADC_SMPR1_SMP13
460                | ADC_SMPR1_SMP12 | ADC_SMPR1_SMP11 | ADC_SMPR1_SMP10)
461              );
462 
463     /* Reset register SMPR2 */
464     CLEAR_BIT(ADCx->SMPR2,
465               (  ADC_SMPR2_SMP9
466                | ADC_SMPR2_SMP8 | ADC_SMPR2_SMP7 | ADC_SMPR2_SMP6
467                | ADC_SMPR2_SMP5 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP3
468                | ADC_SMPR2_SMP2 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP0)
469              );
470 
471     /* Reset register JOFR1 */
472     CLEAR_BIT(ADCx->JOFR1, ADC_JOFR1_JOFFSET1);
473     /* Reset register JOFR2 */
474     CLEAR_BIT(ADCx->JOFR2, ADC_JOFR2_JOFFSET2);
475     /* Reset register JOFR3 */
476     CLEAR_BIT(ADCx->JOFR3, ADC_JOFR3_JOFFSET3);
477     /* Reset register JOFR4 */
478     CLEAR_BIT(ADCx->JOFR4, ADC_JOFR4_JOFFSET4);
479 
480     /* Reset register HTR */
481     SET_BIT(ADCx->HTR, ADC_HTR_HT);
482     /* Reset register LTR */
483     CLEAR_BIT(ADCx->LTR, ADC_LTR_LT);
484 
485     /* Reset register SQR1 */
486     CLEAR_BIT(ADCx->SQR1,
487               (  ADC_SQR1_L
488                | ADC_SQR1_SQ16
489                | ADC_SQR1_SQ15 | ADC_SQR1_SQ14 | ADC_SQR1_SQ13)
490              );
491 
492     /* Reset register SQR2 */
493     CLEAR_BIT(ADCx->SQR2,
494               (  ADC_SQR2_SQ12 | ADC_SQR2_SQ11 | ADC_SQR2_SQ10
495                | ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7)
496              );
497 
498     /* Reset register SQR3 */
499     CLEAR_BIT(ADCx->SQR3,
500               (  ADC_SQR3_SQ6 | ADC_SQR3_SQ5 | ADC_SQR3_SQ4
501                | ADC_SQR3_SQ3 | ADC_SQR3_SQ2 | ADC_SQR3_SQ1)
502              );
503 
504     /* Reset register JSQR */
505     CLEAR_BIT(ADCx->JSQR,
506               (  ADC_JSQR_JL
507                | ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3
508                | ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1  )
509              );
510 
511     /* Reset register DR */
512     /* bits in access mode read only, no direct reset applicable */
513 
514     /* Reset registers JDR1, JDR2, JDR3, JDR4 */
515     /* bits in access mode read only, no direct reset applicable */
516 
517   }
518 
519   return status;
520 }
521 
522 /**
523   * @brief  Initialize some features of ADC instance.
524   * @note   These parameters have an impact on ADC scope: ADC instance.
525   *         Affects both group regular and group injected (availability
526   *         of ADC group injected depends on STM32 families).
527   *         Refer to corresponding unitary functions into
528   *         @ref ADC_LL_EF_Configuration_ADC_Instance .
529   * @note   The setting of these parameters by function @ref LL_ADC_Init()
530   *         is conditioned to ADC state:
531   *         ADC instance must be disabled.
532   *         This condition is applied to all ADC features, for efficiency
533   *         and compatibility over all STM32 families. However, the different
534   *         features can be set under different ADC state conditions
535   *         (setting possible with ADC enabled without conversion on going,
536   *         ADC enabled with conversion on going, ...)
537   *         Each feature can be updated afterwards with a unitary function
538   *         and potentially with ADC in a different state than disabled,
539   *         refer to description of each function for setting
540   *         conditioned to ADC state.
541   * @note   After using this function, some other features must be configured
542   *         using LL unitary functions.
543   *         The minimum configuration remaining to be done is:
544   *          - Set ADC group regular or group injected sequencer:
545   *            map channel on the selected sequencer rank.
546   *            Refer to function @ref LL_ADC_REG_SetSequencerRanks().
547   *          - Set ADC channel sampling time
548   *            Refer to function LL_ADC_SetChannelSamplingTime();
549   * @param  ADCx ADC instance
550   * @param  ADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
551   * @retval An ErrorStatus enumeration value:
552   *          - SUCCESS: ADC registers are initialized
553   *          - ERROR: ADC registers are not initialized
554   */
LL_ADC_Init(ADC_TypeDef * ADCx,LL_ADC_InitTypeDef * ADC_InitStruct)555 ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct)
556 {
557   ErrorStatus status = SUCCESS;
558 
559   /* Check the parameters */
560   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
561 
562   assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment));
563   assert_param(IS_LL_ADC_SCAN_SELECTION(ADC_InitStruct->SequencersScanMode));
564 
565   /* Note: Hardware constraint (refer to description of this function):       */
566   /*       ADC instance must be disabled.                                     */
567   if(LL_ADC_IsEnabled(ADCx) == 0U)
568   {
569     /* Configuration of ADC hierarchical scope:                               */
570     /*  - ADC instance                                                        */
571     /*    - Set ADC conversion data alignment                                 */
572     MODIFY_REG(ADCx->CR1,
573                  ADC_CR1_SCAN
574               ,
575                  ADC_InitStruct->SequencersScanMode
576               );
577 
578     MODIFY_REG(ADCx->CR2,
579                  ADC_CR2_ALIGN
580               ,
581                  ADC_InitStruct->DataAlignment
582               );
583 
584   }
585   else
586   {
587     /* Initialization error: ADC instance is not disabled. */
588     status = ERROR;
589   }
590   return status;
591 }
592 
593 /**
594   * @brief  Set each @ref LL_ADC_InitTypeDef field to default value.
595   * @param  ADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure
596   *                        whose fields will be set to default values.
597   * @retval None
598   */
LL_ADC_StructInit(LL_ADC_InitTypeDef * ADC_InitStruct)599 void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct)
600 {
601   /* Set ADC_InitStruct fields to default values */
602   /* Set fields of ADC instance */
603   ADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
604 
605   /* Enable scan mode to have a generic behavior with ADC of other            */
606   /* STM32 families, without this setting available:                          */
607   /* ADC group regular sequencer and ADC group injected sequencer depend      */
608   /* only of their own configuration.                                         */
609   ADC_InitStruct->SequencersScanMode      = LL_ADC_SEQ_SCAN_ENABLE;
610 
611 }
612 
613 /**
614   * @brief  Initialize some features of ADC group regular.
615   * @note   These parameters have an impact on ADC scope: ADC group regular.
616   *         Refer to corresponding unitary functions into
617   *         @ref ADC_LL_EF_Configuration_ADC_Group_Regular
618   *         (functions with prefix "REG").
619   * @note   The setting of these parameters by function @ref LL_ADC_Init()
620   *         is conditioned to ADC state:
621   *         ADC instance must be disabled.
622   *         This condition is applied to all ADC features, for efficiency
623   *         and compatibility over all STM32 families. However, the different
624   *         features can be set under different ADC state conditions
625   *         (setting possible with ADC enabled without conversion on going,
626   *         ADC enabled with conversion on going, ...)
627   *         Each feature can be updated afterwards with a unitary function
628   *         and potentially with ADC in a different state than disabled,
629   *         refer to description of each function for setting
630   *         conditioned to ADC state.
631   * @note   After using this function, other features must be configured
632   *         using LL unitary functions.
633   *         The minimum configuration remaining to be done is:
634   *          - Set ADC group regular or group injected sequencer:
635   *            map channel on the selected sequencer rank.
636   *            Refer to function @ref LL_ADC_REG_SetSequencerRanks().
637   *          - Set ADC channel sampling time
638   *            Refer to function LL_ADC_SetChannelSamplingTime();
639   * @param  ADCx ADC instance
640   * @param  ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
641   * @retval An ErrorStatus enumeration value:
642   *          - SUCCESS: ADC registers are initialized
643   *          - ERROR: ADC registers are not initialized
644   */
LL_ADC_REG_Init(ADC_TypeDef * ADCx,LL_ADC_REG_InitTypeDef * ADC_REG_InitStruct)645 ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
646 {
647   ErrorStatus status = SUCCESS;
648 
649   /* Check the parameters */
650   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
651 #if defined(ADC3)
652   assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADCx, ADC_REG_InitStruct->TriggerSource));
653 #else
654   assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource));
655 #endif
656   assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength));
657   if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
658   {
659     assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont));
660   }
661   assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode));
662   assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer));
663 
664   /* ADC group regular continuous mode and discontinuous mode                 */
665   /* can not be enabled simultenaeously                                       */
666   assert_param((ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE)
667                || (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE));
668 
669   /* Note: Hardware constraint (refer to description of this function):       */
670   /*       ADC instance must be disabled.                                     */
671   if(LL_ADC_IsEnabled(ADCx) == 0U)
672   {
673     /* Configuration of ADC hierarchical scope:                               */
674     /*  - ADC group regular                                                   */
675     /*    - Set ADC group regular trigger source                              */
676     /*    - Set ADC group regular sequencer length                            */
677     /*    - Set ADC group regular sequencer discontinuous mode                */
678     /*    - Set ADC group regular continuous mode                             */
679     /*    - Set ADC group regular conversion data transfer: no transfer or    */
680     /*      transfer by DMA, and DMA requests mode                            */
681     /* Note: On this STM32 series, ADC trigger edge is set when starting       */
682     /*       ADC conversion.                                                  */
683     /*       Refer to function @ref LL_ADC_REG_StartConversionExtTrig().      */
684     if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
685     {
686       MODIFY_REG(ADCx->CR1,
687                    ADC_CR1_DISCEN
688                  | ADC_CR1_DISCNUM
689                 ,
690                    ADC_REG_InitStruct->SequencerLength
691                  | ADC_REG_InitStruct->SequencerDiscont
692                 );
693     }
694     else
695     {
696       MODIFY_REG(ADCx->CR1,
697                    ADC_CR1_DISCEN
698                  | ADC_CR1_DISCNUM
699                 ,
700                    ADC_REG_InitStruct->SequencerLength
701                  | LL_ADC_REG_SEQ_DISCONT_DISABLE
702                 );
703     }
704 
705     MODIFY_REG(ADCx->CR2,
706                  ADC_CR2_EXTSEL
707                | ADC_CR2_CONT
708                | ADC_CR2_DMA
709               ,
710                  ADC_REG_InitStruct->TriggerSource
711                | ADC_REG_InitStruct->ContinuousMode
712                | ADC_REG_InitStruct->DMATransfer
713               );
714 
715     /* Set ADC group regular sequencer length and scan direction */
716     /* Note: Hardware constraint (refer to description of this function):     */
717     /* Note: If ADC instance feature scan mode is disabled                    */
718     /*       (refer to  ADC instance initialization structure                 */
719     /*       parameter @ref SequencersScanMode                                */
720     /*       or function @ref LL_ADC_SetSequencersScanMode() ),               */
721     /*       this parameter is discarded.                                     */
722     LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength);
723   }
724   else
725   {
726     /* Initialization error: ADC instance is not disabled. */
727     status = ERROR;
728   }
729   return status;
730 }
731 
732 /**
733   * @brief  Set each @ref LL_ADC_REG_InitTypeDef field to default value.
734   * @param  ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
735   *                            whose fields will be set to default values.
736   * @retval None
737   */
LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef * ADC_REG_InitStruct)738 void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
739 {
740   /* Set ADC_REG_InitStruct fields to default values */
741   /* Set fields of ADC group regular */
742   /* Note: On this STM32 series, ADC trigger edge is set when starting         */
743   /*       ADC conversion.                                                    */
744   /*       Refer to function @ref LL_ADC_REG_StartConversionExtTrig().        */
745   ADC_REG_InitStruct->TriggerSource    = LL_ADC_REG_TRIG_SOFTWARE;
746   ADC_REG_InitStruct->SequencerLength  = LL_ADC_REG_SEQ_SCAN_DISABLE;
747   ADC_REG_InitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
748   ADC_REG_InitStruct->ContinuousMode   = LL_ADC_REG_CONV_SINGLE;
749   ADC_REG_InitStruct->DMATransfer      = LL_ADC_REG_DMA_TRANSFER_NONE;
750 }
751 
752 /**
753   * @brief  Initialize some features of ADC group injected.
754   * @note   These parameters have an impact on ADC scope: ADC group injected.
755   *         Refer to corresponding unitary functions into
756   *         @ref ADC_LL_EF_Configuration_ADC_Group_Regular
757   *         (functions with prefix "INJ").
758   * @note   The setting of these parameters by function @ref LL_ADC_Init()
759   *         is conditioned to ADC state:
760   *         ADC instance must be disabled.
761   *         This condition is applied to all ADC features, for efficiency
762   *         and compatibility over all STM32 families. However, the different
763   *         features can be set under different ADC state conditions
764   *         (setting possible with ADC enabled without conversion on going,
765   *         ADC enabled with conversion on going, ...)
766   *         Each feature can be updated afterwards with a unitary function
767   *         and potentially with ADC in a different state than disabled,
768   *         refer to description of each function for setting
769   *         conditioned to ADC state.
770   * @note   After using this function, other features must be configured
771   *         using LL unitary functions.
772   *         The minimum configuration remaining to be done is:
773   *          - Set ADC group injected sequencer:
774   *            map channel on the selected sequencer rank.
775   *            Refer to function @ref LL_ADC_INJ_SetSequencerRanks().
776   *          - Set ADC channel sampling time
777   *            Refer to function LL_ADC_SetChannelSamplingTime();
778   * @param  ADCx ADC instance
779   * @param  ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
780   * @retval An ErrorStatus enumeration value:
781   *          - SUCCESS: ADC registers are initialized
782   *          - ERROR: ADC registers are not initialized
783   */
LL_ADC_INJ_Init(ADC_TypeDef * ADCx,LL_ADC_INJ_InitTypeDef * ADC_INJ_InitStruct)784 ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
785 {
786   ErrorStatus status = SUCCESS;
787 
788   /* Check the parameters */
789   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
790 #if defined(ADC3)
791   assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADCx, ADC_INJ_InitStruct->TriggerSource));
792 #else
793   assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADC_INJ_InitStruct->TriggerSource));
794 #endif
795   assert_param(IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(ADC_INJ_InitStruct->SequencerLength));
796   if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_INJ_SEQ_SCAN_DISABLE)
797   {
798     assert_param(IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(ADC_INJ_InitStruct->SequencerDiscont));
799   }
800   assert_param(IS_LL_ADC_INJ_TRIG_AUTO(ADC_INJ_InitStruct->TrigAuto));
801 
802   /* Note: Hardware constraint (refer to description of this function):       */
803   /*       ADC instance must be disabled.                                     */
804   if(LL_ADC_IsEnabled(ADCx) == 0U)
805   {
806     /* Configuration of ADC hierarchical scope:                               */
807     /*  - ADC group injected                                                  */
808     /*    - Set ADC group injected trigger source                             */
809     /*    - Set ADC group injected sequencer length                           */
810     /*    - Set ADC group injected sequencer discontinuous mode               */
811     /*    - Set ADC group injected conversion trigger: independent or         */
812     /*      from ADC group regular                                            */
813     /* Note: On this STM32 series, ADC trigger edge is set when starting       */
814     /*       ADC conversion.                                                  */
815     /*       Refer to function @ref LL_ADC_INJ_StartConversionExtTrig().      */
816     if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
817     {
818       MODIFY_REG(ADCx->CR1,
819                    ADC_CR1_JDISCEN
820                  | ADC_CR1_JAUTO
821                 ,
822                    ADC_INJ_InitStruct->SequencerDiscont
823                  | ADC_INJ_InitStruct->TrigAuto
824                 );
825     }
826     else
827     {
828       MODIFY_REG(ADCx->CR1,
829                    ADC_CR1_JDISCEN
830                  | ADC_CR1_JAUTO
831                 ,
832                    LL_ADC_REG_SEQ_DISCONT_DISABLE
833                  | ADC_INJ_InitStruct->TrigAuto
834                 );
835     }
836 
837     MODIFY_REG(ADCx->CR2,
838                ADC_CR2_JEXTSEL
839               ,
840                ADC_INJ_InitStruct->TriggerSource
841               );
842 
843     /* Note: Hardware constraint (refer to description of this function):     */
844     /* Note: If ADC instance feature scan mode is disabled                    */
845     /*       (refer to  ADC instance initialization structure                 */
846     /*       parameter @ref SequencersScanMode                                */
847     /*       or function @ref LL_ADC_SetSequencersScanMode() ),               */
848     /*       this parameter is discarded.                                     */
849     LL_ADC_INJ_SetSequencerLength(ADCx, ADC_INJ_InitStruct->SequencerLength);
850   }
851   else
852   {
853     /* Initialization error: ADC instance is not disabled. */
854     status = ERROR;
855   }
856   return status;
857 }
858 
859 /**
860   * @brief  Set each @ref LL_ADC_INJ_InitTypeDef field to default value.
861   * @param  ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
862   *                            whose fields will be set to default values.
863   * @retval None
864   */
LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef * ADC_INJ_InitStruct)865 void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
866 {
867   /* Set ADC_INJ_InitStruct fields to default values */
868   /* Set fields of ADC group injected */
869   ADC_INJ_InitStruct->TriggerSource    = LL_ADC_INJ_TRIG_SOFTWARE;
870   ADC_INJ_InitStruct->SequencerLength  = LL_ADC_INJ_SEQ_SCAN_DISABLE;
871   ADC_INJ_InitStruct->SequencerDiscont = LL_ADC_INJ_SEQ_DISCONT_DISABLE;
872   ADC_INJ_InitStruct->TrigAuto         = LL_ADC_INJ_TRIG_INDEPENDENT;
873 }
874 
875 /**
876   * @}
877   */
878 
879 /**
880   * @}
881   */
882 
883 /**
884   * @}
885   */
886 
887 #endif /* ADC1 || ADC2 || ADC3 */
888 
889 /**
890   * @}
891   */
892 
893 #endif /* USE_FULL_LL_DRIVER */
894