1 /**
2 ******************************************************************************
3 * @file stm32l1xx_ll_adc.c
4 * @author MCD Application Team
5 * @brief ADC LL module driver
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2016 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 "stm32l1xx_ll_adc.h"
22 #include "stm32l1xx_ll_bus.h"
23
24 #ifdef USE_FULL_ASSERT
25 #include "stm32_assert.h"
26 #else
27 #define assert_param(expr) ((void)0U)
28 #endif
29
30 /** @addtogroup STM32L1xx_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 /* Private macros ------------------------------------------------------------*/
44
45 /** @addtogroup ADC_LL_Private_Macros
46 * @{
47 */
48
49 /* Check of parameters for configuration of ADC hierarchical scope: */
50 /* common to several ADC instances. */
51 #define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \
52 ( ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV1) \
53 || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV2) \
54 || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV4) \
55 )
56
57 /* Check of parameters for configuration of ADC hierarchical scope: */
58 /* ADC instance. */
59 #define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \
60 ( ((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) \
61 || ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) \
62 || ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) \
63 || ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B) \
64 )
65
66 #define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \
67 ( ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) \
68 || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT) \
69 )
70
71 #define IS_LL_ADC_LOW_POWER_AUTOWAIT(__LOW_POWER__) \
72 ( ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_NONE) \
73 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT) \
74 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_7_APBCLOCKCYCLES) \
75 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_15_APBCLOCKCYCLES) \
76 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_31_APBCLOCKCYCLES) \
77 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_63_APBCLOCKCYCLES) \
78 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_127_APBCLOCKCYCLES) \
79 || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_255_APBCLOCKCYCLES) \
80 )
81
82 #define IS_LL_ADC_LOW_POWER_AUTOPOWEROFF(__LOW_POWER__) \
83 ( ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF_NONE) \
84 || ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF_IDLE_PHASE) \
85 || ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF_AUTOWAIT_PHASE) \
86 || ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF_IDLE_AUTOWAIT_PHASES) \
87 )
88
89 #define IS_LL_ADC_SCAN_SELECTION(__SCAN_SELECTION__) \
90 ( ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_DISABLE) \
91 || ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_ENABLE) \
92 )
93
94 #define IS_LL_ADC_SEQ_SCAN_MODE(__SEQ_SCAN_MODE__) \
95 ( ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_DISABLE) \
96 || ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_ENABLE) \
97 )
98
99 #define IS_LL_ADC_CHANNELS_BANK(__CHANNELS_BANK__) \
100 ( ((__CHANNELS_BANK__) == LL_ADC_CHANNELS_BANK_A) \
101 || ((__CHANNELS_BANK__) == LL_ADC_CHANNELS_BANK_B) \
102 )
103
104 /* Check of parameters for configuration of ADC hierarchical scope: */
105 /* ADC group regular */
106 #define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \
107 ( ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \
108 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \
109 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3) \
110 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \
111 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2) \
112 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH1) \
113 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH3) \
114 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_TRGO) \
115 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4) \
116 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM6_TRGO) \
117 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM9_CH2) \
118 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM9_TRGO) \
119 || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \
120 )
121
122 #define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \
123 ( ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) \
124 || ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS) \
125 )
126
127 #define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \
128 ( ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) \
129 || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) \
130 || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED) \
131 )
132
133 #define IS_LL_ADC_REG_FLAG_EOC_SELECTION(__REG_FLAG_EOC_SELECTION__) \
134 ( ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV) \
135 || ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_UNITARY_CONV) \
136 )
137
138 #if defined (STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) || defined (STM32L162xC) || defined (STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || defined (STM32L151xE) || defined (STM32L151xDX) || defined (STM32L152xE) || defined (STM32L152xDX) || defined (STM32L162xE) || defined (STM32L162xDX)
139 #define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \
140 ( ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \
141 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \
142 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \
143 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \
144 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \
145 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \
146 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \
147 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \
148 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) \
149 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) \
150 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) \
151 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) \
152 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) \
153 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) \
154 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) \
155 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS) \
156 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_17RANKS) \
157 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_18RANKS) \
158 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_19RANKS) \
159 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_20RANKS) \
160 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_21RANKS) \
161 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_22RANKS) \
162 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_23RANKS) \
163 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_24RANKS) \
164 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_25RANKS) \
165 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_26RANKS) \
166 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_27RANKS) \
167 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_28RANKS) \
168 )
169 #else
170 #define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \
171 ( ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \
172 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \
173 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \
174 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \
175 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \
176 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \
177 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \
178 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \
179 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) \
180 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) \
181 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) \
182 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) \
183 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) \
184 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) \
185 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) \
186 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS) \
187 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_17RANKS) \
188 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_18RANKS) \
189 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_19RANKS) \
190 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_20RANKS) \
191 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_21RANKS) \
192 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_22RANKS) \
193 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_23RANKS) \
194 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_24RANKS) \
195 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_25RANKS) \
196 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_26RANKS) \
197 || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_27RANKS) \
198 )
199 #endif /* STM32L100xC || STM32L151xC || STM32L152xC) || STM32L162xC || STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L151xDX || STM32L152xE || STM32L152xDX || STM32L162xE || STM32L162xDX */
200
201 #define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \
202 ( ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) \
203 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) \
204 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS) \
205 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS) \
206 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS) \
207 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS) \
208 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS) \
209 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS) \
210 || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS) \
211 )
212
213 /* Check of parameters for configuration of ADC hierarchical scope: */
214 /* ADC group injected */
215 #define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__) \
216 ( ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE) \
217 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM9_CH1) \
218 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM9_TRGO) \
219 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO) \
220 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1) \
221 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4) \
222 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO) \
223 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH1) \
224 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH2) \
225 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH3) \
226 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM10_CH1) \
227 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM7_TRGO) \
228 || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15) \
229 )
230
231 #define IS_LL_ADC_INJ_TRIG_EXT_EDGE(__INJ_TRIG_EXT_EDGE__) \
232 ( ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISING) \
233 || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_FALLING) \
234 || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISINGFALLING) \
235 )
236
237 #define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__) \
238 ( ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT) \
239 || ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR) \
240 )
241
242 #define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__) \
243 ( ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE) \
244 || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS) \
245 || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS) \
246 || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS) \
247 )
248
249 #define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__) \
250 ( ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE) \
251 || ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK) \
252 )
253
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 assert_param(IS_LL_ADC_COMMON_CLOCK(ADC_CommonInitStruct->CommonClock));
315
316 /* Note: Hardware constraint (refer to description of functions */
317 /* "LL_ADC_SetCommonXXX()": */
318 /* On this STM32 series, setting of these features is conditioned to */
319 /* ADC state: */
320 /* All ADC instances of the ADC common group must be disabled. */
321 if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0U)
322 {
323 /* Configuration of ADC hierarchical scope: */
324 /* - common to several ADC */
325 /* (all ADC instances belonging to the same ADC common instance) */
326 /* - Set ADC clock (conversion clock) */
327 LL_ADC_SetCommonClock(ADCxy_COMMON, ADC_CommonInitStruct->CommonClock);
328 }
329 else
330 {
331 /* Initialization error: One or several ADC instances belonging to */
332 /* the same ADC common instance are not disabled. */
333 status = ERROR;
334 }
335
336 return status;
337 }
338
339 /**
340 * @brief Set each @ref LL_ADC_CommonInitTypeDef field to default value.
341 * @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure
342 * whose fields will be set to default values.
343 * @retval None
344 */
LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef * ADC_CommonInitStruct)345 void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
346 {
347 /* Set ADC_CommonInitStruct fields to default values */
348 /* Set fields of ADC common */
349 /* (all ADC instances belonging to the same ADC common instance) */
350 ADC_CommonInitStruct->CommonClock = LL_ADC_CLOCK_ASYNC_DIV2;
351
352 }
353
354 /**
355 * @brief De-initialize registers of the selected ADC instance
356 * to their default reset values.
357 * @note To reset all ADC instances quickly (perform a hard reset),
358 * use function @ref LL_ADC_CommonDeInit().
359 * @param ADCx ADC instance
360 * @retval An ErrorStatus enumeration value:
361 * - SUCCESS: ADC registers are de-initialized
362 * - ERROR: ADC registers are not de-initialized
363 */
LL_ADC_DeInit(ADC_TypeDef * ADCx)364 ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx)
365 {
366 ErrorStatus status = SUCCESS;
367
368 /* Check the parameters */
369 assert_param(IS_ADC_ALL_INSTANCE(ADCx));
370
371 /* Disable ADC instance if not already disabled. */
372 if(LL_ADC_IsEnabled(ADCx) == 1U)
373 {
374 /* Set ADC group regular trigger source to SW start to ensure to not */
375 /* have an external trigger event occurring during the conversion stop */
376 /* ADC disable process. */
377 LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE);
378
379 /* Set ADC group injected trigger source to SW start to ensure to not */
380 /* have an external trigger event occurring during the conversion stop */
381 /* ADC disable process. */
382 LL_ADC_INJ_SetTriggerSource(ADCx, LL_ADC_INJ_TRIG_SOFTWARE);
383
384 /* Disable the ADC instance */
385 LL_ADC_Disable(ADCx);
386 }
387
388 /* Check whether ADC state is compliant with expected state */
389 /* (hardware requirements of bits state to reset registers below) */
390 if(READ_BIT(ADCx->CR2, ADC_CR2_ADON) == 0U)
391 {
392 /* ========== Reset ADC registers ========== */
393 /* Reset register SR */
394 CLEAR_BIT(ADCx->SR,
395 ( LL_ADC_FLAG_STRT
396 | LL_ADC_FLAG_JSTRT
397 | LL_ADC_FLAG_EOCS
398 | LL_ADC_FLAG_OVR
399 | LL_ADC_FLAG_JEOS
400 | LL_ADC_FLAG_AWD1 )
401 );
402
403 /* Reset register CR1 */
404 CLEAR_BIT(ADCx->CR1,
405 ( ADC_CR1_OVRIE | ADC_CR1_RES | ADC_CR1_AWDEN
406 | ADC_CR1_JAWDEN | ADC_CR1_PDI | ADC_CR1_PDD
407 | ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN
408 | ADC_CR1_JAUTO | ADC_CR1_AWDSGL | ADC_CR1_SCAN
409 | ADC_CR1_JEOCIE | ADC_CR1_AWDIE | ADC_CR1_EOCIE
410 | ADC_CR1_AWDCH )
411 );
412
413 /* Reset register CR2 */
414 #if defined(ADC_CR2_CFG)
415 CLEAR_BIT(ADCx->CR2,
416 ( ADC_CR2_SWSTART | ADC_CR2_EXTEN | ADC_CR2_EXTSEL
417 | ADC_CR2_JSWSTART | ADC_CR2_JEXTEN | ADC_CR2_JEXTSEL
418 | ADC_CR2_ALIGN | ADC_CR2_EOCS
419 | ADC_CR2_DDS | ADC_CR2_DMA | ADC_CR2_DELS
420 | ADC_CR2_CFG | ADC_CR2_CONT | ADC_CR2_ADON )
421 );
422 #else
423 CLEAR_BIT(ADCx->CR2,
424 ( ADC_CR2_SWSTART | ADC_CR2_EXTEN | ADC_CR2_EXTSEL
425 | ADC_CR2_JSWSTART | ADC_CR2_JEXTEN | ADC_CR2_JEXTSEL
426 | ADC_CR2_ALIGN | ADC_CR2_EOCS
427 | ADC_CR2_DDS | ADC_CR2_DMA | ADC_CR2_DELS
428 | ADC_CR2_CONT | ADC_CR2_ADON )
429 );
430 #endif /* ADC_CR2_CFG */
431
432 /* Reset register SMPR1 */
433 /* Note: On STM32L1, ADC channels 27, 28, 29, 30, 31 are not available */
434 /* on all devices: only on STM32L1 Cat.4 and Cat.5. */
435 #if defined(ADC_SMPR0_SMP31)
436 CLEAR_BIT(ADCx->SMPR1,
437 ( ADC_SMPR1_SMP29 | ADC_SMPR1_SMP28 | ADC_SMPR1_SMP27
438 | ADC_SMPR1_SMP26 | ADC_SMPR1_SMP25 | ADC_SMPR1_SMP24
439 | ADC_SMPR1_SMP23 | ADC_SMPR1_SMP22 | ADC_SMPR1_SMP21
440 | ADC_SMPR1_SMP20 )
441 );
442 #else
443 CLEAR_BIT(ADCx->SMPR1,
444 ( ADC_SMPR1_SMP26 | ADC_SMPR1_SMP25 | ADC_SMPR1_SMP24
445 | ADC_SMPR1_SMP23 | ADC_SMPR1_SMP22 | ADC_SMPR1_SMP21
446 | ADC_SMPR1_SMP20 )
447 );
448 #endif /* ADC_SMPR0_SMP31 */
449
450 /* Reset register SMPR2 */
451 CLEAR_BIT(ADCx->SMPR2,
452 ( ADC_SMPR2_SMP19 | ADC_SMPR2_SMP18 | ADC_SMPR2_SMP17
453 | ADC_SMPR2_SMP16 | ADC_SMPR2_SMP15 | ADC_SMPR2_SMP14
454 | ADC_SMPR2_SMP13 | ADC_SMPR2_SMP12 | ADC_SMPR2_SMP11
455 | ADC_SMPR2_SMP10 )
456 );
457
458 /* Reset register SMPR3 */
459 CLEAR_BIT(ADCx->SMPR3,
460 ( ADC_SMPR3_SMP9 | ADC_SMPR3_SMP8 | ADC_SMPR3_SMP7
461 | ADC_SMPR3_SMP6 | ADC_SMPR3_SMP5 | ADC_SMPR3_SMP4
462 | ADC_SMPR3_SMP3 | ADC_SMPR3_SMP2 | ADC_SMPR3_SMP1
463 | ADC_SMPR3_SMP0 )
464 );
465
466 #if defined(ADC_SMPR0_SMP31)
467 /* Reset register SMPR0 */
468 CLEAR_BIT(ADCx->SMPR0, (ADC_SMPR0_SMP31 | ADC_SMPR0_SMP30));
469 #endif /* ADC_SMPR0_SMP31 */
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 #if defined(ADC_SQR1_SQ28)
489 | ADC_SQR1_SQ28 | ADC_SQR1_SQ27
490 #endif
491 | ADC_SQR1_SQ26 | ADC_SQR1_SQ25)
492 );
493
494 /* Reset register SQR2 */
495 CLEAR_BIT(ADCx->SQR2,
496 ( ADC_SQR2_SQ24 | ADC_SQR2_SQ23 | ADC_SQR2_SQ22
497 | ADC_SQR2_SQ21 | ADC_SQR2_SQ20 | ADC_SQR2_SQ19)
498 );
499
500 /* Reset register SQR3 */
501 CLEAR_BIT(ADCx->SQR3,
502 ( ADC_SQR3_SQ18 | ADC_SQR3_SQ17 | ADC_SQR3_SQ16
503 | ADC_SQR3_SQ15 | ADC_SQR3_SQ14 | ADC_SQR3_SQ13)
504 );
505
506 /* Reset register SQR4 */
507 CLEAR_BIT(ADCx->SQR4,
508 ( ADC_SQR4_SQ12 | ADC_SQR4_SQ11 | ADC_SQR4_SQ10
509 | ADC_SQR4_SQ9 | ADC_SQR4_SQ8 | ADC_SQR4_SQ7 )
510 );
511
512 /* Reset register SQR5 */
513 CLEAR_BIT(ADCx->SQR5,
514 ( ADC_SQR5_SQ6 | ADC_SQR5_SQ5 | ADC_SQR5_SQ4
515 | ADC_SQR5_SQ3 | ADC_SQR5_SQ2 | ADC_SQR5_SQ1 )
516 );
517
518
519 /* Reset register JSQR */
520 CLEAR_BIT(ADCx->JSQR,
521 ( ADC_JSQR_JL
522 | ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3
523 | ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1 )
524 );
525
526 /* Reset register DR */
527 /* bits in access mode read only, no direct reset applicable */
528
529 /* Reset registers JDR1, JDR2, JDR3, JDR4 */
530 /* bits in access mode read only, no direct reset applicable */
531
532 /* Reset register CCR */
533 CLEAR_BIT(ADC->CCR, ADC_CCR_TSVREFE | ADC_CCR_ADCPRE);
534 }
535
536 return status;
537 }
538
539 /**
540 * @brief Initialize some features of ADC instance.
541 * @note These parameters have an impact on ADC scope: ADC instance.
542 * Affects both group regular and group injected (availability
543 * of ADC group injected depends on STM32 families).
544 * Refer to corresponding unitary functions into
545 * @ref ADC_LL_EF_Configuration_ADC_Instance .
546 * @note The setting of these parameters by function @ref LL_ADC_Init()
547 * is conditioned to ADC state:
548 * ADC instance must be disabled.
549 * This condition is applied to all ADC features, for efficiency
550 * and compatibility over all STM32 families. However, the different
551 * features can be set under different ADC state conditions
552 * (setting possible with ADC enabled without conversion on going,
553 * ADC enabled with conversion on going, ...)
554 * Each feature can be updated afterwards with a unitary function
555 * and potentially with ADC in a different state than disabled,
556 * refer to description of each function for setting
557 * conditioned to ADC state.
558 * @note After using this function, some other features must be configured
559 * using LL unitary functions.
560 * The minimum configuration remaining to be done is:
561 * - Set ADC group regular or group injected sequencer:
562 * map channel on the selected sequencer rank.
563 * Refer to function @ref LL_ADC_REG_SetSequencerRanks().
564 * - Set ADC channel sampling time
565 * Refer to function LL_ADC_SetChannelSamplingTime();
566 * @param ADCx ADC instance
567 * @param ADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
568 * @retval An ErrorStatus enumeration value:
569 * - SUCCESS: ADC registers are initialized
570 * - ERROR: ADC registers are not initialized
571 */
LL_ADC_Init(ADC_TypeDef * ADCx,LL_ADC_InitTypeDef * ADC_InitStruct)572 ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct)
573 {
574 ErrorStatus status = SUCCESS;
575
576 /* Check the parameters */
577 assert_param(IS_ADC_ALL_INSTANCE(ADCx));
578
579 assert_param(IS_LL_ADC_RESOLUTION(ADC_InitStruct->Resolution));
580 assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment));
581 /* Note: On STM32L1, low power feature is set by concatenating */
582 /* values of @ref ADC_LL_EC_LP_MODE_AUTOWAIT */
583 /* and @ref ADC_LL_EC_LP_MODE_AUTOPOWEROFF. */
584 /* Check of the parameter is done for each of group of values, */
585 /* by excluding the other group of values. */
586 assert_param(IS_LL_ADC_LOW_POWER_AUTOWAIT(ADC_InitStruct->LowPowerMode & ~(ADC_CR1_PDI | ADC_CR1_PDD)));
587 assert_param(IS_LL_ADC_LOW_POWER_AUTOPOWEROFF(ADC_InitStruct->LowPowerMode & ~(ADC_CR2_DELS)));
588 assert_param(IS_LL_ADC_SCAN_SELECTION(ADC_InitStruct->SequencersScanMode));
589
590 /* Note: Hardware constraint (refer to description of this function): */
591 /* ADC instance must be disabled. */
592 if(LL_ADC_IsEnabled(ADCx) == 0U)
593 {
594 /* Configuration of ADC hierarchical scope: */
595 /* - ADC instance */
596 /* - Set ADC data resolution */
597 /* - Set ADC conversion data alignment */
598 /* - Set ADC low power mode */
599 MODIFY_REG(ADCx->CR1,
600 ADC_CR1_RES
601 | ADC_CR1_PDI
602 | ADC_CR1_PDD
603 | ADC_CR1_SCAN
604 ,
605 ADC_InitStruct->Resolution
606 | (ADC_InitStruct->LowPowerMode & (ADC_CR1_PDI | ADC_CR1_PDD))
607 | ADC_InitStruct->SequencersScanMode
608 );
609
610 MODIFY_REG(ADCx->CR2,
611 ADC_CR2_ALIGN
612 | ADC_CR2_DELS
613 ,
614 ADC_InitStruct->DataAlignment
615 | (ADC_InitStruct->LowPowerMode & ADC_CR2_DELS)
616 );
617
618 }
619 else
620 {
621 /* Initialization error: ADC instance is not disabled. */
622 status = ERROR;
623 }
624 return status;
625 }
626
627 /**
628 * @brief Set each @ref LL_ADC_InitTypeDef field to default value.
629 * @param ADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure
630 * whose fields will be set to default values.
631 * @retval None
632 */
LL_ADC_StructInit(LL_ADC_InitTypeDef * ADC_InitStruct)633 void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct)
634 {
635 /* Set ADC_InitStruct fields to default values */
636 /* Set fields of ADC instance */
637 ADC_InitStruct->Resolution = LL_ADC_RESOLUTION_12B;
638 ADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
639 ADC_InitStruct->LowPowerMode = (LL_ADC_LP_AUTOWAIT_NONE | LL_ADC_LP_AUTOPOWEROFF_NONE);
640
641 /* Enable scan mode to have a generic behavior with ADC of other */
642 /* STM32 families, without this setting available: */
643 /* ADC group regular sequencer and ADC group injected sequencer depend */
644 /* only of their own configuration. */
645 ADC_InitStruct->SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE;
646
647 }
648
649 /**
650 * @brief Initialize some features of ADC group regular.
651 * @note These parameters have an impact on ADC scope: ADC group regular.
652 * Refer to corresponding unitary functions into
653 * @ref ADC_LL_EF_Configuration_ADC_Group_Regular
654 * (functions with prefix "REG").
655 * @note The setting of these parameters by function @ref LL_ADC_Init()
656 * is conditioned to ADC state:
657 * ADC instance must be disabled.
658 * This condition is applied to all ADC features, for efficiency
659 * and compatibility over all STM32 families. However, the different
660 * features can be set under different ADC state conditions
661 * (setting possible with ADC enabled without conversion on going,
662 * ADC enabled with conversion on going, ...)
663 * Each feature can be updated afterwards with a unitary function
664 * and potentially with ADC in a different state than disabled,
665 * refer to description of each function for setting
666 * conditioned to ADC state.
667 * @note After using this function, other features must be configured
668 * using LL unitary functions.
669 * The minimum configuration remaining to be done is:
670 * - Set ADC group regular or group injected sequencer:
671 * map channel on the selected sequencer rank.
672 * Refer to function @ref LL_ADC_REG_SetSequencerRanks().
673 * - Set ADC channel sampling time
674 * Refer to function LL_ADC_SetChannelSamplingTime();
675 * @param ADCx ADC instance
676 * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
677 * @retval An ErrorStatus enumeration value:
678 * - SUCCESS: ADC registers are initialized
679 * - ERROR: ADC registers are not initialized
680 */
LL_ADC_REG_Init(ADC_TypeDef * ADCx,LL_ADC_REG_InitTypeDef * ADC_REG_InitStruct)681 ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
682 {
683 ErrorStatus status = SUCCESS;
684
685 /* Check the parameters */
686 assert_param(IS_ADC_ALL_INSTANCE(ADCx));
687 assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource));
688 assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength));
689 if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
690 {
691 assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont));
692 }
693 assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode));
694 assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer));
695
696 /* ADC group regular continuous mode and discontinuous mode */
697 /* can not be enabled simultenaeously */
698 assert_param((ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE)
699 || (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE));
700
701 /* Note: Hardware constraint (refer to description of this function): */
702 /* ADC instance must be disabled. */
703 if(LL_ADC_IsEnabled(ADCx) == 0U)
704 {
705 /* Configuration of ADC hierarchical scope: */
706 /* - ADC group regular */
707 /* - Set ADC group regular trigger source */
708 /* - Set ADC group regular sequencer length */
709 /* - Set ADC group regular sequencer discontinuous mode */
710 /* - Set ADC group regular continuous mode */
711 /* - Set ADC group regular conversion data transfer: no transfer or */
712 /* transfer by DMA, and DMA requests mode */
713 /* Note: On this STM32 series, ADC trigger edge is set when starting */
714 /* ADC conversion. */
715 /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */
716 if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
717 {
718 MODIFY_REG(ADCx->CR1,
719 ADC_CR1_DISCEN
720 | ADC_CR1_DISCNUM
721 ,
722 ADC_REG_InitStruct->SequencerLength
723 | ADC_REG_InitStruct->SequencerDiscont
724 );
725 }
726 else
727 {
728 MODIFY_REG(ADCx->CR1,
729 ADC_CR1_DISCEN
730 | ADC_CR1_DISCNUM
731 ,
732 ADC_REG_InitStruct->SequencerLength
733 | LL_ADC_REG_SEQ_DISCONT_DISABLE
734 );
735 }
736
737 MODIFY_REG(ADCx->CR2,
738 ADC_CR2_EXTSEL
739 | ADC_CR2_EXTEN
740 | ADC_CR2_CONT
741 | ADC_CR2_DMA
742 | ADC_CR2_DDS
743 ,
744 (ADC_REG_InitStruct->TriggerSource & ADC_CR2_EXTSEL)
745 | ADC_REG_InitStruct->ContinuousMode
746 | ADC_REG_InitStruct->DMATransfer
747 );
748
749 /* Set ADC group regular sequencer length and scan direction */
750 /* Note: Hardware constraint (refer to description of this function): */
751 /* Note: If ADC instance feature scan mode is disabled */
752 /* (refer to ADC instance initialization structure */
753 /* parameter @ref SequencersScanMode */
754 /* or function @ref LL_ADC_SetSequencersScanMode() ), */
755 /* this parameter is discarded. */
756 LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength);
757 }
758 else
759 {
760 /* Initialization error: ADC instance is not disabled. */
761 status = ERROR;
762 }
763 return status;
764 }
765
766 /**
767 * @brief Set each @ref LL_ADC_REG_InitTypeDef field to default value.
768 * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
769 * whose fields will be set to default values.
770 * @retval None
771 */
LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef * ADC_REG_InitStruct)772 void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
773 {
774 /* Set ADC_REG_InitStruct fields to default values */
775 /* Set fields of ADC group regular */
776 /* Note: On this STM32 series, ADC trigger edge is set when starting */
777 /* ADC conversion. */
778 /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */
779 ADC_REG_InitStruct->TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
780 ADC_REG_InitStruct->SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
781 ADC_REG_InitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
782 ADC_REG_InitStruct->ContinuousMode = LL_ADC_REG_CONV_SINGLE;
783 ADC_REG_InitStruct->DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
784 }
785
786 /**
787 * @brief Initialize some features of ADC group injected.
788 * @note These parameters have an impact on ADC scope: ADC group injected.
789 * Refer to corresponding unitary functions into
790 * @ref ADC_LL_EF_Configuration_ADC_Group_Regular
791 * (functions with prefix "INJ").
792 * @note The setting of these parameters by function @ref LL_ADC_Init()
793 * is conditioned to ADC state:
794 * ADC instance must be disabled.
795 * This condition is applied to all ADC features, for efficiency
796 * and compatibility over all STM32 families. However, the different
797 * features can be set under different ADC state conditions
798 * (setting possible with ADC enabled without conversion on going,
799 * ADC enabled with conversion on going, ...)
800 * Each feature can be updated afterwards with a unitary function
801 * and potentially with ADC in a different state than disabled,
802 * refer to description of each function for setting
803 * conditioned to ADC state.
804 * @note After using this function, other features must be configured
805 * using LL unitary functions.
806 * The minimum configuration remaining to be done is:
807 * - Set ADC group injected sequencer:
808 * map channel on the selected sequencer rank.
809 * Refer to function @ref LL_ADC_INJ_SetSequencerRanks().
810 * - Set ADC channel sampling time
811 * Refer to function LL_ADC_SetChannelSamplingTime();
812 * @param ADCx ADC instance
813 * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
814 * @retval An ErrorStatus enumeration value:
815 * - SUCCESS: ADC registers are initialized
816 * - ERROR: ADC registers are not initialized
817 */
LL_ADC_INJ_Init(ADC_TypeDef * ADCx,LL_ADC_INJ_InitTypeDef * ADC_INJ_InitStruct)818 ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
819 {
820 ErrorStatus status = SUCCESS;
821
822 /* Check the parameters */
823 assert_param(IS_ADC_ALL_INSTANCE(ADCx));
824 assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADC_INJ_InitStruct->TriggerSource));
825 assert_param(IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(ADC_INJ_InitStruct->SequencerLength));
826 if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_INJ_SEQ_SCAN_DISABLE)
827 {
828 assert_param(IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(ADC_INJ_InitStruct->SequencerDiscont));
829 }
830 assert_param(IS_LL_ADC_INJ_TRIG_AUTO(ADC_INJ_InitStruct->TrigAuto));
831
832 /* Note: Hardware constraint (refer to description of this function): */
833 /* ADC instance must be disabled. */
834 if(LL_ADC_IsEnabled(ADCx) == 0U)
835 {
836 /* Configuration of ADC hierarchical scope: */
837 /* - ADC group injected */
838 /* - Set ADC group injected trigger source */
839 /* - Set ADC group injected sequencer length */
840 /* - Set ADC group injected sequencer discontinuous mode */
841 /* - Set ADC group injected conversion trigger: independent or */
842 /* from ADC group regular */
843 /* Note: On this STM32 series, ADC trigger edge is set when starting */
844 /* ADC conversion. */
845 /* Refer to function @ref LL_ADC_INJ_StartConversionExtTrig(). */
846 if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
847 {
848 MODIFY_REG(ADCx->CR1,
849 ADC_CR1_JDISCEN
850 | ADC_CR1_JAUTO
851 ,
852 ADC_INJ_InitStruct->SequencerDiscont
853 | ADC_INJ_InitStruct->TrigAuto
854 );
855 }
856 else
857 {
858 MODIFY_REG(ADCx->CR1,
859 ADC_CR1_JDISCEN
860 | ADC_CR1_JAUTO
861 ,
862 LL_ADC_REG_SEQ_DISCONT_DISABLE
863 | ADC_INJ_InitStruct->TrigAuto
864 );
865 }
866
867 MODIFY_REG(ADCx->CR2,
868 ADC_CR2_JEXTSEL
869 | ADC_CR2_JEXTEN
870 ,
871 (ADC_INJ_InitStruct->TriggerSource & ADC_CR2_JEXTSEL)
872 );
873
874 /* Note: Hardware constraint (refer to description of this function): */
875 /* Note: If ADC instance feature scan mode is disabled */
876 /* (refer to ADC instance initialization structure */
877 /* parameter @ref SequencersScanMode */
878 /* or function @ref LL_ADC_SetSequencersScanMode() ), */
879 /* this parameter is discarded. */
880 LL_ADC_INJ_SetSequencerLength(ADCx, ADC_INJ_InitStruct->SequencerLength);
881 }
882 else
883 {
884 /* Initialization error: ADC instance is not disabled. */
885 status = ERROR;
886 }
887 return status;
888 }
889
890 /**
891 * @brief Set each @ref LL_ADC_INJ_InitTypeDef field to default value.
892 * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
893 * whose fields will be set to default values.
894 * @retval None
895 */
LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef * ADC_INJ_InitStruct)896 void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
897 {
898 /* Set ADC_INJ_InitStruct fields to default values */
899 /* Set fields of ADC group injected */
900 ADC_INJ_InitStruct->TriggerSource = LL_ADC_INJ_TRIG_SOFTWARE;
901 ADC_INJ_InitStruct->SequencerLength = LL_ADC_INJ_SEQ_SCAN_DISABLE;
902 ADC_INJ_InitStruct->SequencerDiscont = LL_ADC_INJ_SEQ_DISCONT_DISABLE;
903 ADC_INJ_InitStruct->TrigAuto = LL_ADC_INJ_TRIG_INDEPENDENT;
904 }
905
906 /**
907 * @}
908 */
909
910 /**
911 * @}
912 */
913
914 /**
915 * @}
916 */
917
918 #endif /* ADC1 */
919
920 /**
921 * @}
922 */
923
924 #endif /* USE_FULL_LL_DRIVER */
925