1 /**
2   ******************************************************************************
3   * @file    stm32wb0x_ll_adc.c
4   * @author  GPM Application Team
5   * @brief   ADC LL module driver
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2024 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 #if defined(USE_FULL_LL_DRIVER)
19 
20 /* Includes ------------------------------------------------------------------*/
21 #include "stm32wb0x_ll_adc.h"
22 #include "stm32wb0x_ll_bus.h"
23 
24 #ifdef  USE_FULL_ASSERT
25 #include "stm32_assert.h"
26 #else
27 #define assert_param(expr) ((void)0UL)
28 #endif /* USE_FULL_ASSERT */
29 
30 /** @addtogroup STM32WB0x_LL_Driver
31   * @{
32   */
33 
34 #if defined (ADC1)
35 
36 /** @addtogroup ADC_LL ADC
37   * @{
38   */
39 
40 /* Private types -------------------------------------------------------------*/
41 /* Private variables ---------------------------------------------------------*/
42 /* Private constants ---------------------------------------------------------*/
43 /** @addtogroup ADC_LL_Private_Constants
44   * @{
45   */
46 
47 #define ADC_SWITCH_SE_VIN_ALL                       (ADC_SWITCH_SE_VIN_0 | ADC_SWITCH_SE_VIN_1 | \
48                                                      ADC_SWITCH_SE_VIN_2 | ADC_SWITCH_SE_VIN_3 | \
49                                                      ADC_SWITCH_SE_VIN_4 | ADC_SWITCH_SE_VIN_5 | \
50                                                      ADC_SWITCH_SE_VIN_6 | ADC_SWITCH_SE_VIN_7)
51 
52 #define ADC_SEQ_1_SEQ_ALL                           (ADC_SEQ_1_SEQ0 | ADC_SEQ_1_SEQ1 | \
53                                                      ADC_SEQ_1_SEQ2 | ADC_SEQ_1_SEQ3 | \
54                                                      ADC_SEQ_1_SEQ4 | ADC_SEQ_1_SEQ5 | \
55                                                      ADC_SEQ_1_SEQ6 | ADC_SEQ_1_SEQ7)
56 
57 #define ADC_SEQ_2_SEQ_ALL                           (ADC_SEQ_2_SEQ8  | ADC_SEQ_2_SEQ9  | \
58                                                      ADC_SEQ_2_SEQ10 | ADC_SEQ_2_SEQ11 | \
59                                                      ADC_SEQ_2_SEQ12 | ADC_SEQ_2_SEQ13 | \
60                                                      ADC_SEQ_2_SEQ14 | ADC_SEQ_2_SEQ15)
61 
62 /**
63   * @}
64   */
65 
66 /* Private macros ------------------------------------------------------------*/
67 
68 /** @addtogroup ADC_LL_Private_Macros
69   * @{
70   */
71 /* Check of parameters for configuration of ADC hierarchical scope:           */
72 /* ADC instance.                                                              */
73 #define IS_LL_ADC_NB_CONV(__LENGTH__) (((__LENGTH__) >= (1UL)) && ((__LENGTH__) <= (16UL)))
74 
75 #define IS_LL_ADC_DATAWIDTH(__DATA_WIDTH__) (((__DATA_WIDTH__) == LL_ADC_DS_DATA_WIDTH_12_BIT) || \
76                                              ((__DATA_WIDTH__) == LL_ADC_DS_DATA_WIDTH_13_BIT) || \
77                                              ((__DATA_WIDTH__) == LL_ADC_DS_DATA_WIDTH_14_BIT) || \
78                                              ((__DATA_WIDTH__) == LL_ADC_DS_DATA_WIDTH_15_BIT) || \
79                                              ((__DATA_WIDTH__) == LL_ADC_DS_DATA_WIDTH_16_BIT)   )
80 
81 #define IS_LL_ADC_DATARATIO(__DATA_RATIO__) (((__DATA_RATIO__) == LL_ADC_DS_RATIO_1) || \
82                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_2) || \
83                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_4) || \
84                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_8) || \
85                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_16) || \
86                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_32) || \
87                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_64) || \
88                                              ((__DATA_RATIO__) == LL_ADC_DS_RATIO_128)   )
89 
90 #define IS_LL_ADC_OVERRUN(__OVR__) (((__OVR__) == LL_ADC_NEW_DATA_IS_LOST)  || \
91                                     ((__OVR__) == LL_ADC_NEW_DATA_IS_KEPT)    )
92 
93 #define IS_LL_ADC_SAMPLINGMODE(__SAMPLING_MODE__) (((__SAMPLING_MODE__) == LL_ADC_SAMPLING_AT_START) || \
94                                                    ((__SAMPLING_MODE__) == LL_ADC_SAMPLING_AT_END)     )
95 
96 #if defined(ADC_CONF_SAMPLE_RATE_MSB)
97 #define IS_LL_ADC_SAMPLERATE(__SAMPLERATE__) (((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_16)  || \
98                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_20)  || \
99                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_24)  || \
100                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_28)  || \
101                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_32)  || \
102                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_36)  || \
103                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_40)  || \
104                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_44)  || \
105                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_48)  || \
106                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_52)  || \
107                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_56)  || \
108                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_60)  || \
109                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_64)  || \
110                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_68)  || \
111                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_72)  || \
112                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_76)  || \
113                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_80)  || \
114                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_84)  || \
115                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_88)  || \
116                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_92)  || \
117                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_96)  || \
118                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_100) || \
119                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_104) || \
120                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_108) || \
121                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_112) || \
122                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_116) || \
123                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_120) || \
124                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_124) || \
125                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_128) || \
126                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_132) || \
127                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_136) || \
128                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_140)  )
129 #else
130 #define IS_LL_ADC_SAMPLERATE(__SAMPLERATE__) (((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_16)  || \
131                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_20)  || \
132                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_24)  || \
133                                               ((__SAMPLERATE__) == LL_ADC_SAMPLE_RATE_28)   )
134 #endif /* ADC_CONF_SAMPLE_RATE_MSB */
135 
136 #define IS_LL_ADC_RANK(__RANK__) (((__RANK__) == LL_ADC_RANK_1 ) || \
137                                   ((__RANK__) == LL_ADC_RANK_2 ) || \
138                                   ((__RANK__) == LL_ADC_RANK_3 ) || \
139                                   ((__RANK__) == LL_ADC_RANK_4 ) || \
140                                   ((__RANK__) == LL_ADC_RANK_5 ) || \
141                                   ((__RANK__) == LL_ADC_RANK_6 ) || \
142                                   ((__RANK__) == LL_ADC_RANK_7 ) || \
143                                   ((__RANK__) == LL_ADC_RANK_8 ) || \
144                                   ((__RANK__) == LL_ADC_RANK_9 ) || \
145                                   ((__RANK__) == LL_ADC_RANK_10) || \
146                                   ((__RANK__) == LL_ADC_RANK_11) || \
147                                   ((__RANK__) == LL_ADC_RANK_12) || \
148                                   ((__RANK__) == LL_ADC_RANK_13) || \
149                                   ((__RANK__) == LL_ADC_RANK_14) || \
150                                   ((__RANK__) == LL_ADC_RANK_15) || \
151                                   ((__RANK__) == LL_ADC_RANK_16)   )
152 
153 #define IS_LL_ADC_VOLTAGE_RANGE(__VOLTAGE_RANGE__) (((__VOLTAGE_RANGE__) == LL_ADC_VIN_RANGE_1V2) || \
154                                                     ((__VOLTAGE_RANGE__) == LL_ADC_VIN_RANGE_2V4) || \
155                                                     ((__VOLTAGE_RANGE__) == LL_ADC_VIN_RANGE_3V6)   )
156 
157 #define IS_LL_ADC_CHANNEL(__CHANNEL__) (((__CHANNEL__) == LL_ADC_CHANNEL_VINM0)       || \
158                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINM1)       || \
159                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINM2)       || \
160                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINM3)       || \
161                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP0)       || \
162                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP1)       || \
163                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP2)       || \
164                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP3)       || \
165                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP0_VINM0) || \
166                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP1_VINM1) || \
167                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP2_VINM2) || \
168                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VINP3_VINM3) || \
169                                         ((__CHANNEL__) == LL_ADC_CHANNEL_VBAT)        || \
170                                         ((__CHANNEL__) == LL_ADC_CHANNEL_TEMPSENSOR)    )
171 
172 /**
173   * @}
174   */
175 
176 
177 /* Private function prototypes -----------------------------------------------*/
178 
179 /* Exported functions --------------------------------------------------------*/
180 /** @addtogroup ADC_LL_Exported_Functions
181   * @{
182   */
183 
184 /** @addtogroup ADC_LL_EF_Init
185   * @{
186   */
187 
188 /**
189   * @brief  Initialize some features of ADC instance.
190   * @note   These parameters have an impact on ADC scope: ADC instance.
191   *         Refer to corresponding unitary functions into
192   *         @ref ADC_LL_EF_Configuration_ADC.
193   * @note   The setting of these parameters by function @ref LL_ADC_Init()
194   *         is conditioned to ADC state:
195   *         ADC instance must be disabled.
196   *         This condition is applied to all ADC features, for efficiency
197   *         and compatibility over all STM32 families. However, the different
198   *         features can be set under different ADC state conditions
199   *         (setting possible with ADC enabled without conversion on going,
200   *         ADC enabled with conversion on going, ...)
201   *         Each feature can be updated afterwards with a unitary function
202   *         and potentially with ADC in a different state than disabled,
203   *         refer to description of each function for setting
204   *         conditioned to ADC state.
205   * @param  ADCx ADC instance
206   * @param  pADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure
207   * @retval An ErrorStatus enumeration value:
208   *          - SUCCESS: ADC registers are initialized
209   *          - ERROR: ADC registers are not initialized
210   */
LL_ADC_Init(ADC_TypeDef * ADCx,const LL_ADC_InitTypeDef * pADC_InitStruct)211 ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, const LL_ADC_InitTypeDef *pADC_InitStruct)
212 {
213   ErrorStatus status = SUCCESS;
214 
215   /* Check the parameters */
216   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
217 
218   assert_param(IS_LL_ADC_NB_CONV(pADC_InitStruct->SequenceLength));
219   assert_param(IS_LL_ADC_SAMPLINGMODE(pADC_InitStruct->SamplingMode));
220   assert_param(IS_LL_ADC_SAMPLERATE(pADC_InitStruct->SampleRate));
221   assert_param(IS_LL_ADC_OVERRUN(pADC_InitStruct->Overrun));
222 
223   /* Note: Hardware constraint (refer to description of this function):       */
224   /*       ADC instance must be disabled.                                     */
225   if (LL_ADC_IsEnabled(ADCx) == 0UL)
226   {
227     /* Configuration of ADC hierarchical scope:                               */
228     /*  - ADC instance                                                        */
229     /*    - Set ADC continuous mode                                           */
230     /*    - Set ADC sequence length                                           */
231     /*    - Set ADC sampling mode                                             */
232     /*    - Set ADC sample rate                                               */
233     /*    - Set ADC overrun                                                   */
234     MODIFY_REG(ADCx->CONF, (ADC_CONF_SAMPLE_RATE
235 #if defined(ADC_CONF_SAMPLE_RATE_MSB)
236                             | ADC_CONF_SAMPLE_RATE_MSB
237 #endif /* ADC_CONF_SAMPLE_RATE_MSB */
238                             | ADC_CONF_ADC_CONT_1V2
239                             | ADC_CONF_OVR_DS_CFG
240                             | ADC_CONF_SEQ_LEN
241                             | ADC_CONF_CONT),
242                (pADC_InitStruct->SampleRate
243                 | pADC_InitStruct->SamplingMode
244                 | pADC_InitStruct->Overrun
245                 | ((pADC_InitStruct->SequenceLength - 1UL) << ADC_CONF_SEQ_LEN_Pos)
246                 | pADC_InitStruct->ContinuousConvMode));
247   }
248   else
249   {
250     /* Initialization error: ADC instance is not disabled. */
251     status = ERROR;
252   }
253 
254   return status;
255 }
256 
257 /**
258   * @brief  De-initialize registers of the selected ADC instance
259   *         to their default reset values.
260   * @note   If this functions returns error status, it means that ADC instance
261   *         is in an unknown state.
262   *         In this case, perform a hard reset using high level
263   *         clock source RCC ADC reset.
264   * @param  ADCx ADC instance
265   * @retval An ErrorStatus enumeration value:
266   *          - SUCCESS: ADC registers are de-initialized
267   *          - ERROR: ADC registers are not de-initialized
268   */
LL_ADC_DeInit(ADC_TypeDef * ADCx)269 ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx)
270 {
271   ErrorStatus status = SUCCESS;
272 
273   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
274 
275   /* ========== Reset ADC registers ========== */
276   /* Reset register IER */
277   LL_ADC_DisableIT(ADCx, (LL_ADC_IRQ_EN_OVRDS
278 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
279                           | LL_ADC_IRQ_EN_OVRFL
280                           | LL_ADC_IRQ_EN_EODF
281 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
282                           | LL_ADC_IRQ_EN_AWD1
283                           | LL_ADC_IRQ_EN_EOS
284                           | LL_ADC_IRQ_EN_EODS));
285 
286   /* Reset register ISR */
287   LL_ADC_ClearActiveFlags(ADCx, (LL_ADC_IRQ_FLAG_OVRDS
288 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
289                                  | LL_ADC_IRQ_FLAG_OVRFL
290                                  | LL_ADC_IRQ_FLAG_OVRDF
291                                  | LL_ADC_IRQ_FLAG_EODF
292 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
293                                  | LL_ADC_IRQ_FLAG_AWD1
294                                  | LL_ADC_IRQ_FLAG_EOC
295                                  | LL_ADC_IRQ_FLAG_EOS
296                                  | LL_ADC_IRQ_FLAG_EODS));
297 
298   /* Reset all the registers */
299   CLEAR_BIT(ADCx->CONF, (ADC_CONF_BIT_INVERT_DIFF
300 #if defined(ADC_CONF_SAMPLE_RATE_MSB)
301                          | ADC_CONF_SAMPLE_RATE_MSB
302 #endif /* ADC_CONF_SAMPLE_RATE_MSB */
303                          | ADC_CONF_OVR_DS_CFG | ADC_CONF_DMA_DS_ENA
304                          | ADC_CONF_SAMPLE_RATE
305                          | ADC_CONF_SMPS_SYNCHRO_ENA
306                          | ADC_CONF_SEQ_LEN
307                          | ADC_CONF_CONT
308 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
309                          | ADC_CONF_VBIAS_PRECH_FORCE
310                          | ADC_CONF_OVR_DF_CFG | ADC_CONF_DMA_DF_ENA
311                          | ADC_CONF_OP_MODE
312 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
313                         ));
314 
315   SET_BIT(ADCx->CONF, (ADC_CONF_ADC_CONT_1V2 | ADC_CONF_BIT_INVERT_SN | ADC_CONF_SEQUENCE));
316 
317   CLEAR_BIT(ADCx->CTRL, (ADC_CTRL_ADC_LDO_ENA
318 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
319                          | ADC_CTRL_DIG_AUD_MODE
320 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
321                          | ADC_CTRL_STOP_OP_MODE | ADC_CTRL_START_CONV
322                          | ADC_CTRL_ADC_ON_OFF));
323 
324 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
325   CLEAR_BIT(ADCx->OCM_CTRL, (ADC_OCM_CTRL_OCM_ENA | ADC_OCM_CTRL_OCM_SRC));
326 
327   CLEAR_BIT(ADCx->PGA_CONF, (ADC_PGA_CONF_PGA_BIAS | ADC_PGA_CONF_PGA_GAIN));
328 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
329 
330   CLEAR_BIT(ADCx->SWITCH, (ADC_SWITCH_SE_VIN_7 | ADC_SWITCH_SE_VIN_6
331                            | ADC_SWITCH_SE_VIN_5 | ADC_SWITCH_SE_VIN_4
332                            | ADC_SWITCH_SE_VIN_3 | ADC_SWITCH_SE_VIN_2
333                            | ADC_SWITCH_SE_VIN_1 | ADC_SWITCH_SE_VIN_0));
334 
335 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
336   CLEAR_BIT(ADCx->DF_CONF, (ADC_DF_CONF_DF_HALF_D_EN
337                             | ADC_DF_CONF_DF_HPF_EN | ADC_DF_CONF_DF_MICROL_RN
338                             | ADC_DF_CONF_PDM_RATE
339                             | ADC_DF_CONF_DF_O_S2U
340                             | ADC_DF_CONF_DF_I_U2S  | ADC_DF_CONF_DF_ITP1P2
341                             | ADC_DF_CONF_DF_CIC_DHF | ADC_DF_CONF_DF_CIC_DEC_FACTOR));
342 
343   SET_BIT(ADCx->DF_CONF, (ADC_DF_CONF_PDM_RATE_1 | ADC_DF_CONF_PDM_RATE_2));
344 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
345 
346   CLEAR_BIT(ADCx->DS_CONF, (ADC_DS_CONF_DS_WIDTH | ADC_DS_CONF_DS_RATIO));
347 
348   CLEAR_BIT(ADCx->SEQ_1, (ADC_SEQ_1_SEQ7 | ADC_SEQ_1_SEQ6
349                           | ADC_SEQ_1_SEQ5 | ADC_SEQ_1_SEQ4
350                           | ADC_SEQ_1_SEQ3 | ADC_SEQ_1_SEQ2
351                           | ADC_SEQ_1_SEQ1 | ADC_SEQ_1_SEQ0));
352 
353   CLEAR_BIT(ADCx->SEQ_2, (ADC_SEQ_2_SEQ15 | ADC_SEQ_2_SEQ14
354                           | ADC_SEQ_2_SEQ13 | ADC_SEQ_2_SEQ12
355                           | ADC_SEQ_2_SEQ11 | ADC_SEQ_2_SEQ10
356                           | ADC_SEQ_2_SEQ9  | ADC_SEQ_2_SEQ8));
357 
358   MODIFY_REG(ADCx->COMP_1, (ADC_COMP_1_OFFSET1 | ADC_COMP_1_GAIN1), 0x555UL);
359   MODIFY_REG(ADCx->COMP_2, (ADC_COMP_1_OFFSET1 | ADC_COMP_1_GAIN1), 0x555UL);
360   MODIFY_REG(ADCx->COMP_3, (ADC_COMP_1_OFFSET1 | ADC_COMP_1_GAIN1), 0x555UL);
361   MODIFY_REG(ADCx->COMP_4, (ADC_COMP_1_OFFSET1 | ADC_COMP_1_GAIN1), 0x555UL);
362 
363   CLEAR_BIT(ADCx->COMP_SEL, (ADC_COMP_SEL_OFFSET_GAIN8 | ADC_COMP_SEL_OFFSET_GAIN7
364                              | ADC_COMP_SEL_OFFSET_GAIN6 | ADC_COMP_SEL_OFFSET_GAIN5
365                              | ADC_COMP_SEL_OFFSET_GAIN4 | ADC_COMP_SEL_OFFSET_GAIN3
366                              | ADC_COMP_SEL_OFFSET_GAIN2 | ADC_COMP_SEL_OFFSET_GAIN1
367                              | ADC_COMP_SEL_OFFSET_GAIN0));
368 
369   MODIFY_REG(ADCx->WD_TH, (ADC_WD_TH_WD_HT | ADC_WD_TH_WD_LT), ADC_WD_TH_WD_HT);
370 
371   CLEAR_BIT(ADCx->WD_CONF, (ADC_WD_CONF_AWD_CHX));
372 
373   CLEAR_BIT(ADCx->IRQ_STATUS, (ADC_IRQ_STATUS_OVR_DS_IRQ
374                                | ADC_IRQ_STATUS_AWD_IRQ
375                                | ADC_IRQ_STATUS_EOS_IRQ
376                                | ADC_IRQ_STATUS_EODS_IRQ
377                                | ADC_IRQ_STATUS_EOC_IRQ
378 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
379                                | ADC_IRQ_STATUS_DF_OVRFL_IRQ
380                                | ADC_IRQ_STATUS_OVR_DF_IRQ
381                                | ADC_IRQ_STATUS_EODF_IRQ
382 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
383                               ));
384 
385   CLEAR_BIT(ADCx->IRQ_ENABLE, (ADC_IRQ_ENABLE_OVR_DS_IRQ_ENA
386                                | ADC_IRQ_ENABLE_AWD_IRQ_ENA
387                                | ADC_IRQ_ENABLE_EOS_IRQ_ENA
388                                | ADC_IRQ_ENABLE_EODS_IRQ_ENA
389                                | ADC_IRQ_ENABLE_EOC_IRQ_ENA
390 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
391                                | ADC_IRQ_ENABLE_DF_OVRFL_IRQ_ENA
392                                | ADC_IRQ_ENABLE_OVR_DF_IRQ_ENA
393                                | ADC_IRQ_ENABLE_EODF_IRQ_ENA
394 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
395                               ));
396 
397   CLEAR_BIT(ADCx->TIMER_CONF, (ADC_TIMER_CONF_ADC_LDO_DELAY
398 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
399                                | ADC_TIMER_CONF_PRECH_DELAY_SEL
400                                | ADC_TIMER_CONF_VBIAS_PRECH_DELAY
401 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
402                               ));
403 #if defined(ADC_SUPPORT_AUDIO_FEATURES)
404   LL_ADC_SetVbiasPrechargeDelay(ADCx, 0x96UL);
405 #endif /* ADC_SUPPORT_AUDIO_FEATURES */
406   LL_ADC_SetADCLDODelay(ADCx, 0x28UL);
407 
408   return status;
409 }
410 
411 
412 /**
413   * @brief  Configure the input voltage range for all the inputs.
414   * @param  ADCx ADC instance
415   * @param  pVoltRange_InitStruct pointer to a @ref LL_ADC_VoltRangeInitTypeDef structure
416   *         that contains the voltage range for all the inputs.
417   * @retval None
418   */
LL_ADC_VoltageRangeInit(ADC_TypeDef * ADCx,const LL_ADC_VoltRangeInitTypeDef * pVoltRange_InitStruct)419 ErrorStatus LL_ADC_VoltageRangeInit(ADC_TypeDef *ADCx, const LL_ADC_VoltRangeInitTypeDef *pVoltRange_InitStruct)
420 {
421   ErrorStatus status = SUCCESS;
422   uint32_t tmpval = 0;
423 
424   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
425   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinm0_Vinp0Vinm0));
426   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinm1_Vinp1Vinm1));
427   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinm2_Vinp2Vinm2));
428   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinm3_Vinp3Vinm3));
429   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinp0));
430   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinp1));
431   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinp2));
432   assert_param(IS_LL_ADC_VOLTAGE_RANGE(pVoltRange_InitStruct->InputVinp3));
433 
434   tmpval |= (pVoltRange_InitStruct->InputVinm0_Vinp0Vinm0);
435   tmpval |= (pVoltRange_InitStruct->InputVinm1_Vinp1Vinm1) << ADC_SWITCH_SE_VIN_1_Pos;
436   tmpval |= (pVoltRange_InitStruct->InputVinm2_Vinp2Vinm2) << ADC_SWITCH_SE_VIN_2_Pos;
437   tmpval |= (pVoltRange_InitStruct->InputVinm3_Vinp3Vinm3) << ADC_SWITCH_SE_VIN_3_Pos;
438   tmpval |= (pVoltRange_InitStruct->InputVinp0) << ADC_SWITCH_SE_VIN_4_Pos;
439   tmpval |= (pVoltRange_InitStruct->InputVinp1) << ADC_SWITCH_SE_VIN_5_Pos;
440   tmpval |= (pVoltRange_InitStruct->InputVinp2) << ADC_SWITCH_SE_VIN_6_Pos;
441   tmpval |= (pVoltRange_InitStruct->InputVinp3) << ADC_SWITCH_SE_VIN_7_Pos;
442 
443   MODIFY_REG(ADCx->SWITCH, ADC_SWITCH_SE_VIN_ALL, tmpval);
444 
445   return (status);
446 }
447 
448 /**
449   * @brief  Configure the channels for the conversion sequence.
450   * @param  ADCx ADC instance
451   * @param  pSequence_InitStruct pointer to a @ref LL_ADC_SequenceInitTypeDef structure
452   *         that contains the channel codes for the conversion sequence.
453   * @retval ErrorStatus
454   */
LL_ADC_SequenceInit(ADC_TypeDef * ADCx,const LL_ADC_SequenceInitTypeDef * pSequence_InitStruct)455 ErrorStatus LL_ADC_SequenceInit(ADC_TypeDef *ADCx, const LL_ADC_SequenceInitTypeDef *pSequence_InitStruct)
456 {
457   ErrorStatus status = SUCCESS;
458   uint32_t tmpval = 0;
459 
460   assert_param(IS_ADC_ALL_INSTANCE(ADCx));
461   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq0));
462   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq1));
463   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq2));
464   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq3));
465   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq4));
466   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq5));
467   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq6));
468   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq7));
469   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq8));
470   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq9));
471   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq10));
472   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq11));
473   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq12));
474   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq13));
475   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq14));
476   assert_param(IS_LL_ADC_CHANNEL(pSequence_InitStruct->ChannelForSeq15));
477 
478   tmpval |= (pSequence_InitStruct->ChannelForSeq0) << ADC_SEQ_1_SEQ0_Pos;
479   tmpval |= (pSequence_InitStruct->ChannelForSeq1) << ADC_SEQ_1_SEQ1_Pos;
480   tmpval |= (pSequence_InitStruct->ChannelForSeq2) << ADC_SEQ_1_SEQ2_Pos;
481   tmpval |= (pSequence_InitStruct->ChannelForSeq3) << ADC_SEQ_1_SEQ3_Pos;
482   tmpval |= (pSequence_InitStruct->ChannelForSeq4) << ADC_SEQ_1_SEQ4_Pos;
483   tmpval |= (pSequence_InitStruct->ChannelForSeq5) << ADC_SEQ_1_SEQ5_Pos;
484   tmpval |= (pSequence_InitStruct->ChannelForSeq6) << ADC_SEQ_1_SEQ6_Pos;
485   tmpval |= (pSequence_InitStruct->ChannelForSeq7) << ADC_SEQ_1_SEQ7_Pos;
486 
487   MODIFY_REG(ADCx->SEQ_1, ADC_SEQ_1_SEQ_ALL, tmpval);
488 
489   tmpval = 0;
490 
491   tmpval |= (pSequence_InitStruct->ChannelForSeq8)  << ADC_SEQ_2_SEQ8_Pos;
492   tmpval |= (pSequence_InitStruct->ChannelForSeq9)  << ADC_SEQ_2_SEQ9_Pos;
493   tmpval |= (pSequence_InitStruct->ChannelForSeq10) << ADC_SEQ_2_SEQ10_Pos;
494   tmpval |= (pSequence_InitStruct->ChannelForSeq11) << ADC_SEQ_2_SEQ11_Pos;
495   tmpval |= (pSequence_InitStruct->ChannelForSeq12) << ADC_SEQ_2_SEQ12_Pos;
496   tmpval |= (pSequence_InitStruct->ChannelForSeq13) << ADC_SEQ_2_SEQ13_Pos;
497   tmpval |= (pSequence_InitStruct->ChannelForSeq14) << ADC_SEQ_2_SEQ14_Pos;
498   tmpval |= (pSequence_InitStruct->ChannelForSeq15) << ADC_SEQ_2_SEQ15_Pos;
499 
500   MODIFY_REG(ADCx->SEQ_2, ADC_SEQ_2_SEQ_ALL, tmpval);
501 
502   return (status);
503 }
504 
505 /**
506   * @}
507   */
508 
509 /**
510   * @}
511   */
512 
513 /**
514   * @}
515   */
516 
517 #endif /* ADC1 */
518 
519 /**
520   * @}
521   */
522 
523 #endif /* USE_FULL_LL_DRIVER */
524