1 /**
2 ******************************************************************************
3 * @file stm32u5xx_ll_dma.c
4 * @author MCD Application Team
5 * @brief DMA LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2021 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 @verbatim
18 ==============================================================================
19 ##### LL DMA driver acronyms #####
20 ==============================================================================
21 [..] Acronyms table :
22 =========================================
23 || Acronym || ||
24 =========================================
25 || SRC || Source ||
26 || DEST || Destination ||
27 || ADDR || Address ||
28 || ADDRS || Addresses ||
29 || INC || Increment / Incremented ||
30 || DEC || Decrement / Decremented ||
31 || BLK || Block ||
32 || RPT || Repeat / Repeated ||
33 || TRIG || Trigger ||
34 =========================================
35 @endverbatim
36 ******************************************************************************
37 */
38
39 #if defined (USE_FULL_LL_DRIVER)
40
41 /* Includes ------------------------------------------------------------------*/
42 #include "stm32u5xx_ll_dma.h"
43 #include "stm32u5xx_ll_bus.h"
44 #ifdef USE_FULL_ASSERT
45 #include "stm32_assert.h"
46 #else
47 #define assert_param(expr) ((void)0U)
48 #endif /* USE_FULL_ASSERT */
49
50 /** @addtogroup STM32U5xx_LL_Driver
51 * @{
52 */
53
54 #if (defined (GPDMA1) || defined (LPDMA1))
55
56 /** @addtogroup DMA_LL
57 * @{
58 */
59
60 /* Private types -------------------------------------------------------------*/
61 /* Private variables ---------------------------------------------------------*/
62 /* Private constants ---------------------------------------------------------*/
63 /* Private macros ------------------------------------------------------------*/
64
65 /** @addtogroup DMA_LL_Private_Macros
66 * @{
67 */
68 #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, Channel) ((((INSTANCE) == GPDMA1) && \
69 (((Channel) == LL_DMA_CHANNEL_0) || \
70 ((Channel) == LL_DMA_CHANNEL_1) || \
71 ((Channel) == LL_DMA_CHANNEL_2) || \
72 ((Channel) == LL_DMA_CHANNEL_3) || \
73 ((Channel) == LL_DMA_CHANNEL_4) || \
74 ((Channel) == LL_DMA_CHANNEL_5) || \
75 ((Channel) == LL_DMA_CHANNEL_6) || \
76 ((Channel) == LL_DMA_CHANNEL_7) || \
77 ((Channel) == LL_DMA_CHANNEL_8) || \
78 ((Channel) == LL_DMA_CHANNEL_9) || \
79 ((Channel) == LL_DMA_CHANNEL_10) || \
80 ((Channel) == LL_DMA_CHANNEL_11) || \
81 ((Channel) == LL_DMA_CHANNEL_12) || \
82 ((Channel) == LL_DMA_CHANNEL_13) || \
83 ((Channel) == LL_DMA_CHANNEL_14) || \
84 ((Channel) == LL_DMA_CHANNEL_15) || \
85 ((Channel) == LL_DMA_CHANNEL_ALL))) || \
86 (((INSTANCE) == LPDMA1) && \
87 (((Channel) == LL_DMA_CHANNEL_0) || \
88 ((Channel) == LL_DMA_CHANNEL_1) || \
89 ((Channel) == LL_DMA_CHANNEL_2) || \
90 ((Channel) == LL_DMA_CHANNEL_3) || \
91 ((Channel) == LL_DMA_CHANNEL_ALL))))
92
93 #define IS_LL_GPDMA_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == GPDMA1) && \
94 (((Channel) == LL_DMA_CHANNEL_0) || \
95 ((Channel) == LL_DMA_CHANNEL_1) || \
96 ((Channel) == LL_DMA_CHANNEL_2) || \
97 ((Channel) == LL_DMA_CHANNEL_3) || \
98 ((Channel) == LL_DMA_CHANNEL_4) || \
99 ((Channel) == LL_DMA_CHANNEL_5) || \
100 ((Channel) == LL_DMA_CHANNEL_6) || \
101 ((Channel) == LL_DMA_CHANNEL_7) || \
102 ((Channel) == LL_DMA_CHANNEL_8) || \
103 ((Channel) == LL_DMA_CHANNEL_9) || \
104 ((Channel) == LL_DMA_CHANNEL_10) || \
105 ((Channel) == LL_DMA_CHANNEL_11) || \
106 ((Channel) == LL_DMA_CHANNEL_12) || \
107 ((Channel) == LL_DMA_CHANNEL_13) || \
108 ((Channel) == LL_DMA_CHANNEL_14) || \
109 ((Channel) == LL_DMA_CHANNEL_15)))
110
111 #define IS_LL_DMA_2D_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == GPDMA1) && \
112 (((Channel) == LL_DMA_CHANNEL_12) || \
113 ((Channel) == LL_DMA_CHANNEL_13) || \
114 ((Channel) == LL_DMA_CHANNEL_14) || \
115 ((Channel) == LL_DMA_CHANNEL_15)))
116
117 #define IS_LL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY) || \
118 ((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \
119 ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH))
120
121 #define IS_LL_DMA_DATA_ALIGNMENT(__VALUE__) (((__VALUE__) == LL_DMA_DATA_ALIGN_ZEROPADD) || \
122 ((__VALUE__) == LL_DMA_DATA_ALIGN_SIGNEXTPADD) || \
123 ((__VALUE__) == LL_DMA_DATA_PACK_UNPACK))
124
125 #define IS_LL_DMA_BURST_LENGTH(__VALUE__) (((__VALUE__) > 0U) && ((__VALUE__) <= 64U))
126
127 #define IS_LL_DMA_SRC_DATA_WIDTH(__VALUE__) (((__VALUE__) == LL_DMA_SRC_DATAWIDTH_BYTE) || \
128 ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_HALFWORD) || \
129 ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_WORD))
130
131 #define IS_LL_DMA_DEST_DATA_WIDTH(__VALUE__) (((__VALUE__) == LL_DMA_DEST_DATAWIDTH_BYTE) || \
132 ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_HALFWORD) || \
133 ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_WORD))
134
135 #define IS_LL_DMA_SRC_INCREMENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_SRC_FIXED) || \
136 ((__VALUE__) == LL_DMA_SRC_INCREMENT))
137
138 #define IS_LL_DMA_DEST_INCREMENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_FIXED) || \
139 ((__VALUE__) == LL_DMA_DEST_INCREMENT))
140
141 #define IS_LL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == LL_DMA_LOW_PRIORITY_LOW_WEIGHT) || \
142 ((__VALUE__) == LL_DMA_LOW_PRIORITY_MID_WEIGHT) || \
143 ((__VALUE__) == LL_DMA_LOW_PRIORITY_HIGH_WEIGHT) || \
144 ((__VALUE__) == LL_DMA_HIGH_PRIORITY))
145
146 #define IS_LL_DMA_BLK_DATALENGTH(__VALUE__) ((__VALUE__) <= 0xFFFFU)
147
148 #define IS_LL_DMA_BLK_REPEATCOUNT(__VALUE__) ((__VALUE__) <= 0x0EFFU)
149
150 #define IS_LL_DMA_TRIGGER_MODE(__VALUE__) (((__VALUE__) == LL_DMA_TRIGM_BLK_TRANSFER) || \
151 ((__VALUE__) == LL_DMA_TRIGM_RPT_BLK_TRANSFER) || \
152 ((__VALUE__) == LL_DMA_TRIGM_LLI_LINK_TRANSFER) || \
153 ((__VALUE__) == LL_DMA_TRIGM_SINGLBURST_TRANSFER ))
154
155 #define IS_LL_DMA_TRIGGER_POLARITY(__VALUE__) (((__VALUE__) == LL_DMA_TRIG_POLARITY_MASKED) || \
156 ((__VALUE__) == LL_DMA_TRIG_POLARITY_RISING) || \
157 ((__VALUE__) == LL_DMA_TRIG_POLARITY_FALLING))
158
159 #define IS_LL_DMA_BLKHW_REQUEST(__VALUE__) (((__VALUE__) == LL_DMA_HWREQUEST_SINGLEBURST) || \
160 ((__VALUE__) == LL_DMA_HWREQUEST_BLK))
161
162 #if defined (LL_GPDMA1_TRIGGER_JPEG_OFT)
163 #define IS_LL_DMA_TRIGGER_SELECTION(__VALUE__) ((__VALUE__) <= LL_GPDMA1_TRIGGER_JPEG_OFT)
164 #else
165 #define IS_LL_DMA_TRIGGER_SELECTION(__VALUE__) ((__VALUE__) <= LL_GPDMA1_TRIGGER_ADC1_AWD1)
166 #endif /* LL_GPDMA1_TRIGGER_JPEG_OFT */
167
168 #if defined (LL_GPDMA1_REQUEST_JPEG_TX)
169 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__) ((__VALUE__) <= LL_GPDMA1_REQUEST_JPEG_TX)
170 #elif defined (LL_GPDMA1_REQUEST_ADC2)
171 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__) ((__VALUE__) <= LL_GPDMA1_REQUEST_ADC2)
172 #else
173 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__) ((__VALUE__) <= LL_GPDMA1_REQUEST_LPTIM3_UE)
174 #endif /* LL_GPDMA1_REQUEST_JPEG_TX */
175
176 #define IS_LL_DMA_TRANSFER_EVENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_TCEM_BLK_TRANSFER) || \
177 ((__VALUE__) == LL_DMA_TCEM_RPT_BLK_TRANSFER) || \
178 ((__VALUE__) == LL_DMA_TCEM_EACH_LLITEM_TRANSFER) || \
179 ((__VALUE__) == LL_DMA_TCEM_LAST_LLITEM_TRANSFER))
180
181 #define IS_LL_DMA_DEST_HALFWORD_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_HALFWORD_PRESERVE) || \
182 ((__VALUE__) == LL_DMA_DEST_HALFWORD_EXCHANGE))
183
184 #define IS_LL_DMA_DEST_BYTE_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_BYTE_PRESERVE) || \
185 ((__VALUE__) == LL_DMA_DEST_BYTE_EXCHANGE))
186
187 #define IS_LL_DMA_SRC_BYTE_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_SRC_BYTE_PRESERVE) || \
188 ((__VALUE__) == LL_DMA_SRC_BYTE_EXCHANGE))
189
190 #define IS_LL_DMA_LINK_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT0) || \
191 ((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT1))
192
193 #define IS_LL_DMA_SRC_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT0) || \
194 ((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT1))
195
196 #define IS_LL_DMA_DEST_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT0) || \
197 ((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT1))
198
199 #define IS_LL_DMA_LINK_STEP_MODE(__VALUE__) (((__VALUE__) == LL_DMA_LSM_FULL_EXECUTION) || \
200 ((__VALUE__) == LL_DMA_LSM_1LINK_EXECUTION))
201
202 #define IS_LL_DMA_BURST_SRC_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BURST_SRC_ADDR_INCREMENT) || \
203 ((__VALUE__) == LL_DMA_BURST_SRC_ADDR_DECREMENT))
204
205 #define IS_LL_DMA_BURST_DEST_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BURST_DEST_ADDR_INCREMENT) || \
206 ((__VALUE__) == LL_DMA_BURST_DEST_ADDR_DECREMENT))
207
208 #define IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(__VALUE__) ((__VALUE__) <= 0x1FFFU)
209
210 #define IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_INCREMENT) || \
211 ((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_DECREMENT))
212
213 #define IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_INCREMENT) || \
214 ((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_DECREMENT))
215
216 #define IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(__VALUE__) ((__VALUE__) <= 0xFFFFU)
217
218 #define IS_LL_DMA_LINK_BASEADDR(__VALUE__) (((__VALUE__) & 0xFFFFU) == 0U)
219
220 #define IS_LL_DMA_LINK_ADDR_OFFSET(__VALUE__) (((__VALUE__) & 0x03U) == 0U)
221
222 #define IS_LL_DMA_LINK_UPDATE_REGISTERS(__VALUE__) ((((__VALUE__) & 0x01FE0000U) == 0U) && ((__VALUE__) != 0U))
223
224 #define IS_LL_DMA_LINK_NODETYPE(__VALUE__) (((__VALUE__) == LL_DMA_GPDMA_2D_NODE) || \
225 ((__VALUE__) == LL_DMA_GPDMA_LINEAR_NODE) || \
226 ((__VALUE__) == LL_DMA_LPDMA_LINEAR_NODE))
227
228 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
229 #define IS_LL_DMA_CHANNEL_SRC_SEC(__VALUE__) (((__VALUE__) == LL_DMA_CHANNEL_SRC_NSEC) || \
230 ((__VALUE__) == LL_DMA_CHANNEL_SRC_SEC))
231
232 #define IS_LL_DMA_CHANNEL_DEST_SEC(__VALUE__) (((__VALUE__) == LL_DMA_CHANNEL_DEST_NSEC) || \
233 ((__VALUE__) == LL_DMA_CHANNEL_DEST_SEC))
234
235 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
236 /**
237 * @}
238 */
239
240 /* Private function prototypes -----------------------------------------------*/
241 /* Exported functions --------------------------------------------------------*/
242
243 /** @addtogroup DMA_LL_Exported_Functions
244 * @{
245 */
246
247 /** @addtogroup DMA_LL_EF_Init
248 * @{
249 */
250
251 /**
252 * @brief De-initialize the DMA registers to their default reset values.
253 * @note This API is used for all available DMA channels.
254 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
255 * helper macros :
256 * @arg @ref LL_DMA_GET_INSTANCE
257 * @arg @ref LL_DMA_GET_CHANNEL
258 * @param DMAx DMAx Instance
259 * @param Channel This parameter can be one of the following values:
260 * @arg @ref LL_DMA_CHANNEL_0
261 * @arg @ref LL_DMA_CHANNEL_1
262 * @arg @ref LL_DMA_CHANNEL_2
263 * @arg @ref LL_DMA_CHANNEL_3
264 * @arg @ref LL_DMA_CHANNEL_4
265 * @arg @ref LL_DMA_CHANNEL_5
266 * @arg @ref LL_DMA_CHANNEL_6
267 * @arg @ref LL_DMA_CHANNEL_7
268 * @arg @ref LL_DMA_CHANNEL_8
269 * @arg @ref LL_DMA_CHANNEL_9
270 * @arg @ref LL_DMA_CHANNEL_10
271 * @arg @ref LL_DMA_CHANNEL_11
272 * @arg @ref LL_DMA_CHANNEL_12
273 * @arg @ref LL_DMA_CHANNEL_13
274 * @arg @ref LL_DMA_CHANNEL_14
275 * @arg @ref LL_DMA_CHANNEL_15
276 * @retval An ErrorStatus enumeration value:
277 * - SUCCESS : DMA registers are de-initialized.
278 * - ERROR : DMA registers are not de-initialized.
279 */
LL_DMA_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)280 uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
281 {
282 DMA_Channel_TypeDef *tmp;
283 ErrorStatus status = SUCCESS;
284
285 /* Check the DMA Instance DMAx and Channel parameters */
286 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
287
288 if (Channel == LL_DMA_CHANNEL_ALL)
289 {
290 if (DMAx == GPDMA1)
291 {
292 /* Force reset of DMA clock */
293 LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
294
295 /* Release reset of DMA clock */
296 LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
297 }
298 else
299 {
300 /* Force reset of DMA clock */
301 LL_AHB3_GRP1_ForceReset(LL_AHB3_GRP1_PERIPH_LPDMA1);
302
303 /* Release reset of DMA clock */
304 LL_AHB3_GRP1_ReleaseReset(LL_AHB3_GRP1_PERIPH_LPDMA1);
305 }
306 }
307 else
308 {
309 /* Get the DMA Channel Instance */
310 tmp = (DMA_Channel_TypeDef *)(LL_DMA_GET_CHANNEL_INSTANCE(DMAx, Channel));
311
312 /* Suspend DMA channel */
313 LL_DMA_SuspendChannel(DMAx, Channel);
314
315 /* Disable the selected Channel */
316 LL_DMA_ResetChannel(DMAx, Channel);
317
318 /* Reset DMAx_Channely control register */
319 LL_DMA_WriteReg(tmp, CLBAR, 0U);
320
321 /* Reset DMAx_Channely control register */
322 LL_DMA_WriteReg(tmp, CCR, 0U);
323
324 /* Reset DMAx_Channely Configuration register */
325 LL_DMA_WriteReg(tmp, CTR1, 0U);
326
327 /* Reset DMAx_Channely transfer register 2 */
328 LL_DMA_WriteReg(tmp, CTR2, 0U);
329
330 /* Reset DMAx_Channely block number of data register */
331 LL_DMA_WriteReg(tmp, CBR1, 0U);
332
333 /* Reset DMAx_Channely source address register */
334 LL_DMA_WriteReg(tmp, CSAR, 0U);
335
336 /* Reset DMAx_Channely destination address register */
337 LL_DMA_WriteReg(tmp, CDAR, 0U);
338
339 /* Check DMA channel */
340 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
341 {
342 /* Reset DMAx_Channely transfer register 3 */
343 LL_DMA_WriteReg(tmp, CTR3, 0U);
344
345 /* Reset DMAx_Channely Block register 2 */
346 LL_DMA_WriteReg(tmp, CBR2, 0U);
347 }
348
349 /* Reset DMAx_Channely Linked list address register */
350 LL_DMA_WriteReg(tmp, CLLR, 0U);
351
352 /* Reset DMAx_Channely pending flags */
353 LL_DMA_WriteReg(tmp, CFCR, 0x00003F00U);
354
355 /* Reset DMAx_Channely attribute */
356 LL_DMA_DisableChannelPrivilege(DMAx, Channel);
357
358 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
359 LL_DMA_DisableChannelSecure(DMAx, Channel);
360 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
361 }
362
363 return (uint32_t)status;
364 }
365
366 /**
367 * @brief Initialize the DMA registers according to the specified parameters
368 * in DMA_InitStruct.
369 * @note This API is used for all available DMA channels.
370 * @note A software request transfer can be done once programming the direction
371 * field in memory to memory value.
372 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
373 * helper macros :
374 * @arg @ref LL_DMA_GET_INSTANCE
375 * @arg @ref LL_DMA_GET_CHANNEL
376 * @param DMAx DMAx Instance
377 * @param Channel This parameter can be one of the following values:
378 * @arg @ref LL_DMA_CHANNEL_0
379 * @arg @ref LL_DMA_CHANNEL_1
380 * @arg @ref LL_DMA_CHANNEL_2
381 * @arg @ref LL_DMA_CHANNEL_3
382 * @arg @ref LL_DMA_CHANNEL_4
383 * @arg @ref LL_DMA_CHANNEL_5
384 * @arg @ref LL_DMA_CHANNEL_6
385 * @arg @ref LL_DMA_CHANNEL_7
386 * @arg @ref LL_DMA_CHANNEL_8
387 * @arg @ref LL_DMA_CHANNEL_9
388 * @arg @ref LL_DMA_CHANNEL_10
389 * @arg @ref LL_DMA_CHANNEL_11
390 * @arg @ref LL_DMA_CHANNEL_12
391 * @arg @ref LL_DMA_CHANNEL_13
392 * @arg @ref LL_DMA_CHANNEL_14
393 * @arg @ref LL_DMA_CHANNEL_15
394 * @param DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure.
395 * @retval An ErrorStatus enumeration value:
396 * - SUCCESS : DMA registers are initialized.
397 * - ERROR : Not applicable.
398 */
LL_DMA_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitTypeDef * DMA_InitStruct)399 uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct)
400 {
401 /* Check the DMA Instance DMAx and Channel parameters*/
402 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
403
404 /* Check the DMA parameters from DMA_InitStruct */
405 assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction));
406
407 /* Check direction */
408 if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
409 {
410 assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitStruct->Request));
411 }
412
413 assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitStruct->DataAlignment));
414 assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitStruct->SrcDataWidth));
415 assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitStruct->DestDataWidth));
416 assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitStruct->SrcIncMode));
417 assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitStruct->DestIncMode));
418 assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority));
419 assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitStruct->BlkDataLength));
420 assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitStruct->TriggerPolarity));
421 assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitStruct->BlkHWRequest));
422 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitStruct->TransferEventMode));
423 assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitStruct->LinkStepMode));
424 assert_param(IS_LL_DMA_LINK_BASEADDR(DMA_InitStruct->LinkedListBaseAddr));
425 assert_param(IS_LL_DMA_LINK_ADDR_OFFSET(DMA_InitStruct->LinkedListAddrOffset));
426
427 /* Check DMA instance */
428 if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
429 {
430 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->SrcBurstLength));
431 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->DestBurstLength));
432 assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitStruct->DestHWordExchange));
433 assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitStruct->DestByteExchange));
434 assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitStruct->SrcByteExchange));
435 assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitStruct->LinkAllocatedPort));
436 assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitStruct->SrcAllocatedPort));
437 assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitStruct->DestAllocatedPort));
438 }
439
440 /* Check trigger polarity */
441 if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
442 {
443 assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitStruct->TriggerMode));
444 assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitStruct->TriggerSelection));
445 }
446
447 /* Check DMA channel */
448 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
449 {
450 assert_param(IS_LL_DMA_BLK_REPEATCOUNT(DMA_InitStruct->BlkRptCount));
451 assert_param(IS_LL_DMA_BURST_SRC_ADDR_UPDATE(DMA_InitStruct->SrcAddrUpdateMode));
452 assert_param(IS_LL_DMA_BURST_DEST_ADDR_UPDATE(DMA_InitStruct->DestAddrUpdateMode));
453 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitStruct->SrcAddrOffset));
454 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitStruct->DestAddrOffset));
455 assert_param(IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(DMA_InitStruct->BlkRptSrcAddrUpdateMode));
456 assert_param(IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(DMA_InitStruct->BlkRptDestAddrUpdateMode));
457 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitStruct->BlkRptSrcAddrOffset));
458 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitStruct->BlkRptDestAddrOffset));
459 }
460
461 /*-------------------------- DMAx CLBAR Configuration ------------------------
462 * Configure the Transfer linked list address with parameter :
463 * - LinkedListBaseAdd: DMA_CLBAR_LBA[31:16] bits
464 */
465 LL_DMA_SetLinkedListBaseAddr(DMAx, Channel, DMA_InitStruct->LinkedListBaseAddr);
466
467 /*-------------------------- DMAx CCR Configuration --------------------------
468 * Configure the control parameter :
469 * - LinkAllocatedPort: DMA_CCR_LAP bit
470 * LinkAllocatedPort field is not supported by LPDMA channels.
471 * - LinkStepMode: DMA_CCR_LSM bit
472 * - Priority: DMA_CCR_PRIO [23:22] bits
473 */
474 LL_DMA_ConfigControl(DMAx, Channel, DMA_InitStruct->Priority | \
475 DMA_InitStruct->LinkAllocatedPort | \
476 DMA_InitStruct->LinkStepMode);
477
478 /*-------------------------- DMAx CTR1 Configuration -------------------------
479 * Configure the Data transfer parameter :
480 * - DestAllocatedPort: DMA_CTR1_DAP bit
481 * DestAllocatedPort field is not supported by LPDMA channels.
482 * - DestHWordExchange: DMA_CTR1_DHX bit
483 * DestHWordExchange field is not supported by LPDMA channels.
484 * - DestByteExchange: DMA_CTR1_DBX bit
485 * DestByteExchange field is not supported by LPDMA channels.
486 * - DestIncMode: DMA_CTR1_DINC bit
487 * - DestDataWidth: DMA_CTR1_DDW_LOG2 [17:16] bits
488 * - SrcAllocatedPort: DMA_CTR1_SAP bit
489 * SrcAllocatedPort field is not supported by LPDMA channels.
490 * - SrcByteExchange: DMA_CTR1_SBX bit
491 * SrcByteExchange field is not supported by LPDMA channels.
492 * - DataAlignment: DMA_CTR1_PAM [12:11] bits
493 * DataAlignment field is reduced to one bit by LPDMA channels.
494 * - SrcIncMode: DMA_CTR1_SINC bit
495 * - SrcDataWidth: DMA_CTR1_SDW_LOG2 [1:0] bits
496 * - SrcBurstLength: DMA_CTR1_SBL_1 [9:4] bits
497 * SrcBurstLength field is not supported by LPDMA channels.
498 * - DestBurstLength: DMA_CTR1_DBL_1 [25:20] bits
499 * DestBurstLength field is not supported by LPDMA channels.
500 */
501 LL_DMA_ConfigTransfer(DMAx, Channel, DMA_InitStruct->DestAllocatedPort | \
502 DMA_InitStruct->DestHWordExchange | \
503 DMA_InitStruct->DestByteExchange | \
504 DMA_InitStruct->DestIncMode | \
505 DMA_InitStruct->DestDataWidth | \
506 DMA_InitStruct->SrcAllocatedPort | \
507 DMA_InitStruct->SrcByteExchange | \
508 DMA_InitStruct->DataAlignment | \
509 DMA_InitStruct->SrcIncMode | \
510 DMA_InitStruct->SrcDataWidth);
511 /* Check DMA instance */
512 if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
513 {
514 LL_DMA_ConfigBurstLength(DMAx, Channel, DMA_InitStruct->SrcBurstLength,
515 DMA_InitStruct->DestBurstLength);
516 }
517
518 /*-------------------------- DMAx CTR2 Configuration -------------------------
519 * Configure the channel transfer parameter :
520 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
521 * - TriggerPolarity: DMA_CTR2_TRIGPOL [25:24] bits
522 * - TriggerMode: DMA_CTR2_TRIGM [15:14] bits
523 * - BlkHWRequest: DMA_CTR2_BREQ bit
524 * - Direction: DMA_CTR2_DREQ bit
525 * - Direction: DMA_CTR2_SWREQ bit
526 * Direction field is reduced to one bit for LPDMA channels (SWREQ).
527 * - TriggerSelection: DMA_CTR2_TRIGSEL [21:16] bits
528 * TriggerSelection field is reduced to 5 bits for LPDMA channels.
529 * - Request: DMA_CTR2_REQSEL [6:0] bits
530 * Request field is reduced to 5 bits for LPDMA channels.
531 */
532 LL_DMA_ConfigChannelTransfer(DMAx, Channel, DMA_InitStruct->TransferEventMode | \
533 DMA_InitStruct->TriggerPolarity | \
534 DMA_InitStruct->BlkHWRequest | \
535 DMA_InitStruct->Direction);
536
537 /* Check direction */
538 if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
539 {
540 LL_DMA_SetPeriphRequest(DMAx, Channel, DMA_InitStruct->Request);
541 }
542
543 /* Check trigger polarity */
544 if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
545 {
546 LL_DMA_SetHWTrigger(DMAx, Channel, DMA_InitStruct->TriggerSelection);
547 LL_DMA_SetTriggerMode(DMAx, Channel, DMA_InitStruct->TriggerMode);
548 }
549
550 /*-------------------------- DMAx CBR1 Configuration -------------------------
551 * Configure the Transfer Block counters and update mode with parameter :
552 * - BlkDataLength: DMA_CBR1_BNDT[15:0] bits
553 * - BlkRptCount: DMA_CBR1_BRC[26:16] bits
554 * BlkRptCount field is supported only by 2D addressing channels.
555 * - BlkRptSrcAddrUpdateMode: DMA_CBR1_BRSDEC bit
556 * BlkRptSrcAddrUpdateMode field is supported only by 2D addressing channels.
557 * - BlkRptDestAddrUpdateMode: DMA_CBR1_BRDDEC bit
558 * BlkRptDestAddrUpdateMode field is supported only by 2D addressing channels.
559 * - SrcAddrUpdateMode: DMA_CBR1_SDEC bit
560 * SrcAddrUpdateMode field is supported only by 2D addressing channels.
561 * - DestAddrUpdateMode: DMA_CBR1_DDEC bit
562 * DestAddrUpdateMode field is supported only by 2D addressing channels.
563 */
564 LL_DMA_SetBlkDataLength(DMAx, Channel, DMA_InitStruct->BlkDataLength);
565
566 /* Check DMA channel */
567 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
568 {
569 LL_DMA_SetBlkRptCount(DMAx, Channel, DMA_InitStruct->BlkRptCount);
570 LL_DMA_ConfigBlkRptAddrUpdate(DMAx, Channel, DMA_InitStruct->BlkRptSrcAddrUpdateMode | \
571 DMA_InitStruct->BlkRptDestAddrUpdateMode | \
572 DMA_InitStruct->SrcAddrUpdateMode | \
573 DMA_InitStruct->DestAddrUpdateMode);
574 }
575
576 /*-------------------------- DMAx CSAR and CDAR Configuration ----------------
577 * Configure the Transfer source address with parameter :
578 * - SrcAddress: DMA_CSAR_SA[31:0] bits
579 * - DestAddress: DMA_CDAR_DA[31:0] bits
580 */
581 LL_DMA_ConfigAddresses(DMAx, Channel, DMA_InitStruct->SrcAddress, DMA_InitStruct->DestAddress);
582
583 /* Check DMA channel */
584 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
585 {
586 /*------------------------ DMAx CTR3 Configuration -------------------------
587 * Configure the Transfer Block counters and update mode with parameter :
588 * - SrcAddrOffset: DMA_CTR3_SAO[28:16] bits
589 * SrcAddrOffset field is supported only by 2D addressing channels.
590 * - DestAddrOffset: DMA_CTR3_DAO[12:0] bits
591 * DestAddrOffset field is supported only by 2D addressing channels.
592 */
593 LL_DMA_ConfigAddrUpdateValue(DMAx, Channel, DMA_InitStruct->SrcAddrOffset, DMA_InitStruct->DestAddrOffset);
594
595 /*------------------------ DMAx CBR2 Configuration -----------------------
596 * Configure the Transfer Block counters and update mode with parameter :
597 * - BlkRptSrcAddrOffset: DMA_CBR2_BRSAO[15:0] bits
598 * BlkRptSrcAddrOffset field is supported only by 2D addressing channels.
599 * - BlkRptDestAddrOffset: DMA_CBR2_BRDAO[31:16] bits
600 * BlkRptDestAddrOffset field is supported only by 2D addressing channels.
601 */
602 LL_DMA_ConfigBlkRptAddrUpdateValue(DMAx, Channel, DMA_InitStruct->BlkRptSrcAddrOffset,
603 DMA_InitStruct->BlkRptDestAddrOffset);
604 }
605
606 /*-------------------------- DMAx CLLR Configuration -------------------------
607 * Configure the Transfer linked list address with parameter :
608 * - DestAddrOffset: DMA_CLLR_LA[15:2] bits
609 */
610 LL_DMA_SetLinkedListAddrOffset(DMAx, Channel, DMA_InitStruct->LinkedListAddrOffset);
611
612 return (uint32_t)SUCCESS;
613 }
614
615 /**
616 * @brief Set each @ref LL_DMA_InitTypeDef field to default value.
617 * @param DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure.
618 * @retval None.
619 */
LL_DMA_StructInit(LL_DMA_InitTypeDef * DMA_InitStruct)620 void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct)
621 {
622 /* Set DMA_InitStruct fields to default values */
623 DMA_InitStruct->SrcAddress = 0x00000000U;
624 DMA_InitStruct->DestAddress = 0x00000000U;
625 DMA_InitStruct->Direction = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
626 DMA_InitStruct->BlkHWRequest = LL_DMA_HWREQUEST_SINGLEBURST;
627 DMA_InitStruct->DataAlignment = LL_DMA_DATA_ALIGN_ZEROPADD;
628 DMA_InitStruct->SrcBurstLength = 1U;
629 DMA_InitStruct->DestBurstLength = 1U;
630 DMA_InitStruct->SrcDataWidth = LL_DMA_SRC_DATAWIDTH_BYTE;
631 DMA_InitStruct->DestDataWidth = LL_DMA_DEST_DATAWIDTH_BYTE;
632 DMA_InitStruct->SrcIncMode = LL_DMA_SRC_FIXED;
633 DMA_InitStruct->DestIncMode = LL_DMA_DEST_FIXED;
634 DMA_InitStruct->Priority = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
635 DMA_InitStruct->BlkDataLength = 0x00000000U;
636 DMA_InitStruct->BlkRptCount = 0x00000000U;
637 DMA_InitStruct->TriggerMode = LL_DMA_TRIGM_BLK_TRANSFER;
638 DMA_InitStruct->TriggerPolarity = LL_DMA_TRIG_POLARITY_MASKED;
639 DMA_InitStruct->TriggerSelection = 0x00000000U;
640 DMA_InitStruct->Request = 0x00000000U;
641 DMA_InitStruct->TransferEventMode = LL_DMA_TCEM_BLK_TRANSFER;
642 DMA_InitStruct->DestHWordExchange = LL_DMA_DEST_HALFWORD_PRESERVE;
643 DMA_InitStruct->DestByteExchange = LL_DMA_DEST_BYTE_PRESERVE;
644 DMA_InitStruct->SrcByteExchange = LL_DMA_SRC_BYTE_PRESERVE;
645 DMA_InitStruct->SrcAllocatedPort = LL_DMA_SRC_ALLOCATED_PORT0;
646 DMA_InitStruct->DestAllocatedPort = LL_DMA_DEST_ALLOCATED_PORT0;
647 DMA_InitStruct->LinkAllocatedPort = LL_DMA_LINK_ALLOCATED_PORT0;
648 DMA_InitStruct->LinkStepMode = LL_DMA_LSM_FULL_EXECUTION;
649 DMA_InitStruct->SrcAddrUpdateMode = LL_DMA_BURST_SRC_ADDR_INCREMENT;
650 DMA_InitStruct->DestAddrUpdateMode = LL_DMA_BURST_DEST_ADDR_INCREMENT;
651 DMA_InitStruct->SrcAddrOffset = 0x00000000U;
652 DMA_InitStruct->DestAddrOffset = 0x00000000U;
653 DMA_InitStruct->BlkRptSrcAddrUpdateMode = LL_DMA_BLKRPT_SRC_ADDR_INCREMENT;
654 DMA_InitStruct->BlkRptDestAddrUpdateMode = LL_DMA_BLKRPT_DEST_ADDR_INCREMENT;
655 DMA_InitStruct->BlkRptSrcAddrOffset = 0x00000000U;
656 DMA_InitStruct->BlkRptDestAddrOffset = 0x00000000U;
657 DMA_InitStruct->LinkedListBaseAddr = 0x00000000U;
658 DMA_InitStruct->LinkedListAddrOffset = 0x00000000U;
659 }
660
661 /**
662 * @brief Set each @ref LL_DMA_InitLinkedListTypeDef field to default value.
663 * @param DMA_InitLinkedListStruct Pointer to
664 * a @ref LL_DMA_InitLinkedListTypeDef structure.
665 * @retval None.
666 */
LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)667 void LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
668 {
669 /* Set LL_DMA_InitLinkedListTypeDef fields to default values */
670 DMA_InitLinkedListStruct->Priority = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
671 DMA_InitLinkedListStruct->LinkStepMode = LL_DMA_LSM_FULL_EXECUTION;
672 DMA_InitLinkedListStruct->TransferEventMode = LL_DMA_TCEM_LAST_LLITEM_TRANSFER;
673 DMA_InitLinkedListStruct->LinkAllocatedPort = LL_DMA_LINK_ALLOCATED_PORT0;
674 }
675
676 /**
677 * @brief De-initialize the DMA linked list.
678 * @note This API is used for all available DMA channels.
679 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
680 * helper macros :
681 * @arg @ref LL_DMA_GET_INSTANCE
682 * @arg @ref LL_DMA_GET_CHANNEL
683 * @param DMAx DMAx Instance
684 * @param Channel This parameter can be one of the following values:
685 * @arg @ref LL_DMA_CHANNEL_0
686 * @arg @ref LL_DMA_CHANNEL_1
687 * @arg @ref LL_DMA_CHANNEL_2
688 * @arg @ref LL_DMA_CHANNEL_3
689 * @arg @ref LL_DMA_CHANNEL_4
690 * @arg @ref LL_DMA_CHANNEL_5
691 * @arg @ref LL_DMA_CHANNEL_6
692 * @arg @ref LL_DMA_CHANNEL_7
693 * @arg @ref LL_DMA_CHANNEL_8
694 * @arg @ref LL_DMA_CHANNEL_9
695 * @arg @ref LL_DMA_CHANNEL_10
696 * @arg @ref LL_DMA_CHANNEL_11
697 * @arg @ref LL_DMA_CHANNEL_12
698 * @arg @ref LL_DMA_CHANNEL_13
699 * @arg @ref LL_DMA_CHANNEL_14
700 * @arg @ref LL_DMA_CHANNEL_15
701 * @retval An ErrorStatus enumeration value:
702 * - SUCCESS : DMA registers are de-initialized.
703 * - ERROR : DMA registers are not de-initialized.
704 */
LL_DMA_List_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)705 uint32_t LL_DMA_List_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
706 {
707 return LL_DMA_DeInit(DMAx, Channel);
708 }
709
710 /**
711 * @brief Initialize the DMA linked list according to the specified parameters
712 * in LL_DMA_InitLinkedListTypeDef.
713 * @note This API is used for all available DMA channels.
714 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
715 * helper macros :
716 * @arg @ref LL_DMA_GET_INSTANCE
717 * @arg @ref LL_DMA_GET_CHANNEL
718 * @param DMAx DMAx Instance
719 * @param Channel This parameter can be one of the following values:
720 * @arg @ref LL_DMA_CHANNEL_0
721 * @arg @ref LL_DMA_CHANNEL_1
722 * @arg @ref LL_DMA_CHANNEL_2
723 * @arg @ref LL_DMA_CHANNEL_3
724 * @arg @ref LL_DMA_CHANNEL_4
725 * @arg @ref LL_DMA_CHANNEL_5
726 * @arg @ref LL_DMA_CHANNEL_6
727 * @arg @ref LL_DMA_CHANNEL_7
728 * @arg @ref LL_DMA_CHANNEL_8
729 * @arg @ref LL_DMA_CHANNEL_9
730 * @arg @ref LL_DMA_CHANNEL_10
731 * @arg @ref LL_DMA_CHANNEL_11
732 * @arg @ref LL_DMA_CHANNEL_12
733 * @arg @ref LL_DMA_CHANNEL_13
734 * @arg @ref LL_DMA_CHANNEL_14
735 * @arg @ref LL_DMA_CHANNEL_15
736 * @param DMA_InitLinkedListStruct pointer to
737 * a @ref LL_DMA_InitLinkedListTypeDef structure.
738 * @retval An ErrorStatus enumeration value:
739 * - SUCCESS : DMA registers are initialized.
740 * - ERROR : Not applicable.
741 */
LL_DMA_List_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)742 uint32_t LL_DMA_List_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
743 {
744 /* Check the DMA Instance DMAx and Channel parameters*/
745 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
746
747 /* Check the DMA parameters from DMA_InitLinkedListStruct */
748 assert_param(IS_LL_DMA_PRIORITY(DMA_InitLinkedListStruct->Priority));
749 assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitLinkedListStruct->LinkStepMode));
750 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitLinkedListStruct->TransferEventMode));
751 /* Check DMA instance */
752 if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
753 {
754 assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitLinkedListStruct->LinkAllocatedPort));
755 }
756
757 /*-------------------------- DMAx CCR Configuration --------------------------
758 * Configure the control parameter :
759 * - LinkAllocatedPort: DMA_CCR_LAP bit
760 * LinkAllocatedPort field is supported only by GPDMA channels.
761 * - LinkStepMode: DMA_CCR_LSM bit
762 * - Priority: DMA_CCR_PRIO [23:22] bits
763 */
764 LL_DMA_ConfigControl(DMAx, Channel, DMA_InitLinkedListStruct->Priority | \
765 DMA_InitLinkedListStruct->LinkAllocatedPort | \
766 DMA_InitLinkedListStruct->LinkStepMode);
767
768 /*-------------------------- DMAx CTR2 Configuration -------------------------
769 * Configure the channel transfer parameter :
770 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
771 */
772 LL_DMA_SetTransferEventMode(DMAx, Channel, DMA_InitLinkedListStruct->TransferEventMode);
773
774 return (uint32_t)SUCCESS;
775 }
776
777 /**
778 * @brief Set each @ref LL_DMA_InitNodeTypeDef field to default value.
779 * @param DMA_InitNodeStruct Pointer to a @ref LL_DMA_InitNodeTypeDef
780 * structure.
781 * @retval None.
782 */
LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct)783 void LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct)
784 {
785 /* Set DMA_InitNodeStruct fields to default values */
786 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
787 DMA_InitNodeStruct->DestSecure = LL_DMA_CHANNEL_DEST_NSEC;
788 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
789 DMA_InitNodeStruct->DestAllocatedPort = LL_DMA_DEST_ALLOCATED_PORT0;
790 DMA_InitNodeStruct->DestHWordExchange = LL_DMA_DEST_HALFWORD_PRESERVE;
791 DMA_InitNodeStruct->DestByteExchange = LL_DMA_DEST_BYTE_PRESERVE;
792 DMA_InitNodeStruct->DestBurstLength = 1U;
793 DMA_InitNodeStruct->DestIncMode = LL_DMA_DEST_FIXED;
794 DMA_InitNodeStruct->DestDataWidth = LL_DMA_DEST_DATAWIDTH_BYTE;
795 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
796 DMA_InitNodeStruct->SrcSecure = LL_DMA_CHANNEL_SRC_NSEC;
797 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
798 DMA_InitNodeStruct->SrcAllocatedPort = LL_DMA_SRC_ALLOCATED_PORT0;
799 DMA_InitNodeStruct->SrcByteExchange = LL_DMA_SRC_BYTE_PRESERVE;
800 DMA_InitNodeStruct->DataAlignment = LL_DMA_DATA_ALIGN_ZEROPADD;
801 DMA_InitNodeStruct->SrcBurstLength = 1U;
802 DMA_InitNodeStruct->SrcIncMode = LL_DMA_SRC_FIXED;
803 DMA_InitNodeStruct->SrcDataWidth = LL_DMA_SRC_DATAWIDTH_BYTE;
804 DMA_InitNodeStruct->TransferEventMode = LL_DMA_TCEM_BLK_TRANSFER;
805 DMA_InitNodeStruct->TriggerPolarity = LL_DMA_TRIG_POLARITY_MASKED;
806 DMA_InitNodeStruct->TriggerSelection = 0x00000000U;
807 DMA_InitNodeStruct->TriggerMode = LL_DMA_TRIGM_BLK_TRANSFER;
808 DMA_InitNodeStruct->BlkHWRequest = LL_DMA_HWREQUEST_SINGLEBURST;
809 DMA_InitNodeStruct->Direction = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
810 DMA_InitNodeStruct->Request = 0x00000000U;
811 DMA_InitNodeStruct->BlkRptDestAddrUpdateMode = LL_DMA_BLKRPT_DEST_ADDR_INCREMENT;
812 DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode = LL_DMA_BLKRPT_SRC_ADDR_INCREMENT;
813 DMA_InitNodeStruct->DestAddrUpdateMode = LL_DMA_BURST_DEST_ADDR_INCREMENT;
814 DMA_InitNodeStruct->SrcAddrUpdateMode = LL_DMA_BURST_SRC_ADDR_INCREMENT;
815 DMA_InitNodeStruct->BlkRptCount = 0x00000000U;
816 DMA_InitNodeStruct->BlkDataLength = 0x00000000U;
817 DMA_InitNodeStruct->SrcAddress = 0x00000000U;
818 DMA_InitNodeStruct->DestAddress = 0x00000000U;
819 DMA_InitNodeStruct->DestAddrOffset = 0x00000000U;
820 DMA_InitNodeStruct->SrcAddrOffset = 0x00000000U;
821 DMA_InitNodeStruct->BlkRptDestAddrOffset = 0x00000000U;
822 DMA_InitNodeStruct->BlkRptSrcAddrOffset = 0x00000000U;
823 DMA_InitNodeStruct->UpdateRegisters = (LL_DMA_UPDATE_CTR1 | LL_DMA_UPDATE_CTR2 | \
824 LL_DMA_UPDATE_CBR1 | LL_DMA_UPDATE_CSAR | \
825 LL_DMA_UPDATE_CDAR | LL_DMA_UPDATE_CTR3 | \
826 LL_DMA_UPDATE_CBR2 | LL_DMA_UPDATE_CLLR);
827 DMA_InitNodeStruct->NodeType = LL_DMA_GPDMA_LINEAR_NODE;
828 }
829
830 /**
831 * @brief Initializes DMA linked list node according to the specified
832 * parameters in the DMA_InitNodeStruct.
833 * @param DMA_InitNodeStruct Pointer to a LL_DMA_InitNodeTypeDef structure
834 * that contains linked list node
835 * registers configurations.
836 * @param pNode Pointer to linked list node to fill according to
837 * LL_DMA_LinkNodeTypeDef parameters.
838 * @retval None
839 */
LL_DMA_CreateLinkNode(LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct,LL_DMA_LinkNodeTypeDef * pNode)840 uint32_t LL_DMA_CreateLinkNode(LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct, LL_DMA_LinkNodeTypeDef *pNode)
841 {
842 uint32_t reg_counter = 0U;
843
844 /* Check the DMA Node type */
845 assert_param(IS_LL_DMA_LINK_NODETYPE(DMA_InitNodeStruct->NodeType));
846
847 /* Check the DMA parameters from DMA_InitNodeStruct */
848 assert_param(IS_LL_DMA_DIRECTION(DMA_InitNodeStruct->Direction));
849
850 /* Check direction */
851 if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
852 {
853 assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitNodeStruct->Request));
854 }
855
856 assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitNodeStruct->DataAlignment));
857 assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitNodeStruct->SrcDataWidth));
858 assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitNodeStruct->DestDataWidth));
859 assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitNodeStruct->SrcIncMode));
860 assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitNodeStruct->DestIncMode));
861 assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitNodeStruct->BlkDataLength));
862 assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitNodeStruct->TriggerPolarity));
863 assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitNodeStruct->BlkHWRequest));
864 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitNodeStruct->TransferEventMode));
865 assert_param(IS_LL_DMA_LINK_UPDATE_REGISTERS(DMA_InitNodeStruct->UpdateRegisters));
866
867 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
868 assert_param(IS_LL_DMA_CHANNEL_SRC_SEC(DMA_InitNodeStruct->SrcSecure));
869 assert_param(IS_LL_DMA_CHANNEL_DEST_SEC(DMA_InitNodeStruct->DestSecure));
870 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
871
872 /* Check trigger polarity */
873 if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
874 {
875 assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitNodeStruct->TriggerMode));
876 assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitNodeStruct->TriggerSelection));
877 }
878 /* Check non 2D addressing settings */
879 if (DMA_InitNodeStruct->NodeType != LL_DMA_LPDMA_LINEAR_NODE)
880 {
881 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitNodeStruct->SrcBurstLength));
882 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitNodeStruct->DestBurstLength));
883 assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitNodeStruct->DestHWordExchange));
884 assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitNodeStruct->DestByteExchange));
885 assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitNodeStruct->SrcByteExchange));
886 assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitNodeStruct->SrcAllocatedPort));
887 assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitNodeStruct->DestAllocatedPort));
888 }
889
890 /* Check DMA channel */
891 if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE)
892 {
893 assert_param(IS_LL_DMA_BLK_REPEATCOUNT(DMA_InitNodeStruct->BlkRptCount));
894 assert_param(IS_LL_DMA_BURST_SRC_ADDR_UPDATE(DMA_InitNodeStruct->SrcAddrUpdateMode));
895 assert_param(IS_LL_DMA_BURST_DEST_ADDR_UPDATE(DMA_InitNodeStruct->DestAddrUpdateMode));
896 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->SrcAddrOffset));
897 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->DestAddrOffset));
898 assert_param(IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode));
899 assert_param(IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(DMA_InitNodeStruct->BlkRptDestAddrUpdateMode));
900 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->BlkRptSrcAddrOffset));
901 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->BlkRptDestAddrOffset));
902 }
903
904 /* Check if CTR1 register update is enabled */
905 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR1) == LL_DMA_UPDATE_CTR1)
906 {
907 /*-------------------------- DMAx CTR1 Configuration -----------------------
908 * Configure the Data transfer parameter :
909 * - DestAllocatedPort: DMA_CTR1_DAP bit
910 * DestAllocatedPort field is not supported by LPDMA channels.
911 * - DestHWordExchange: DMA_CTR1_DHX bit
912 * DestHWordExchange field is not supported by LPDMA channels.
913 * - DestByteExchange: DMA_CTR1_DBX bit
914 * DestByteExchange field is not supported by LPDMA channels.
915 * - DestIncMode: DMA_CTR1_DINC bit
916 * - DestDataWidth: DMA_CTR1_DDW_LOG2 [17:16] bits
917 * - SrcAllocatedPort: DMA_CTR1_SAP bit
918 * SrcAllocatedPort field is not supported by LPDMA channels.
919 * - SrcByteExchange: DMA_CTR1_SBX bit
920 * SrcByteExchange field is not supported by LPDMA channels.
921 * - DataAlignment: DMA_CTR1_PAM [12:11] bits
922 * DataAlignment field is reduced to one bit for LPDMA channels.
923 * - SrcIncMode: DMA_CTR1_SINC bit
924 * - SrcDataWidth: DMA_CTR1_SDW_LOG2 [1:0] bits
925 * - SrcBurstLength: DMA_CTR1_SBL_1 [9:4] bits
926 * SrcBurstLength field is not supported by LPDMA channels.
927 * - DestBurstLength: DMA_CTR1_DBL_1 [25:20] bits
928 * DestBurstLength field is not supported by LPDMA channels.
929 */
930
931 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->DestIncMode | \
932 DMA_InitNodeStruct->DestDataWidth | \
933 DMA_InitNodeStruct->DataAlignment | \
934 DMA_InitNodeStruct->SrcIncMode | \
935 DMA_InitNodeStruct->SrcDataWidth);
936
937 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
938 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestSecure | \
939 DMA_InitNodeStruct->SrcSecure);
940 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
941
942 /* Update CTR1 register fields for not LPDMA channels */
943 if (DMA_InitNodeStruct->NodeType != LL_DMA_LPDMA_LINEAR_NODE)
944 {
945 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestAllocatedPort | \
946 DMA_InitNodeStruct->DestHWordExchange | \
947 DMA_InitNodeStruct->DestByteExchange | \
948 ((DMA_InitNodeStruct->DestBurstLength - 1U) << DMA_CTR1_DBL_1_Pos) | \
949 DMA_InitNodeStruct->SrcAllocatedPort | \
950 DMA_InitNodeStruct->SrcByteExchange | \
951 ((DMA_InitNodeStruct->SrcBurstLength - 1U) << DMA_CTR1_SBL_1_Pos));
952 }
953
954 /* Increment counter for the next register */
955 reg_counter++;
956 }
957
958
959 /* Check if CTR2 register update is enabled */
960 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR2) == LL_DMA_UPDATE_CTR2)
961 {
962 /*-------------------------- DMAx CTR2 Configuration -----------------------
963 * Configure the channel transfer parameter :
964 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
965 * - TriggerPolarity: DMA_CTR2_TRIGPOL [25:24] bits
966 * - TriggerMode: DMA_CTR2_TRIGM [15:14] bits
967 * - BlkHWRequest: DMA_CTR2_BREQ bit
968 * - Direction: DMA_CTR2_DREQ bit
969 * - Direction: DMA_CTR2_SWREQ bit
970 * Direction field is reduced to one bit for LPDMA channels (SWREQ).
971 * - TriggerSelection: DMA_CTR2_TRIGSEL [21:16] bits
972 * DataAlignment field is reduced to 5 bits for LPDMA channels.
973 * - Request: DMA_CTR2_REQSEL [6:0] bits
974 * DataAlignment field is reduced to 5 bits for LPDMA channels.
975 */
976 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->TransferEventMode | \
977 DMA_InitNodeStruct->TriggerPolarity | \
978 DMA_InitNodeStruct->BlkHWRequest | \
979 DMA_InitNodeStruct->Direction);
980
981 /* Check direction */
982 if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
983 {
984 pNode->LinkRegisters[reg_counter] |= DMA_InitNodeStruct->Request & DMA_CTR2_REQSEL;
985 }
986
987 /* Check trigger polarity */
988 if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
989 {
990 pNode->LinkRegisters[reg_counter] |= (((DMA_InitNodeStruct->TriggerSelection << DMA_CTR2_TRIGSEL_Pos) & \
991 DMA_CTR2_TRIGSEL) | DMA_InitNodeStruct->TriggerMode);
992 }
993
994 /* Update CTR2 register fields for LPDMA */
995 if (DMA_InitNodeStruct->NodeType == LL_DMA_LPDMA_LINEAR_NODE)
996 {
997 pNode->LinkRegisters[reg_counter] &= (~(1UL << 21U) & ~(3UL << 5U));
998 }
999
1000 /* Increment counter for the next register */
1001 reg_counter++;
1002 }
1003
1004 /* Check if CBR1 register update is enabled */
1005 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CBR1) == LL_DMA_UPDATE_CBR1)
1006 {
1007 /*-------------------------- DMAx CBR1 Configuration -----------------------
1008 * Configure the Transfer Block counters and update mode with parameter :
1009 * - BlkDataLength: DMA_CBR1_BNDT[15:0] bits
1010 * - BlkRptCount: DMA_CBR1_BRC[26:16] bits
1011 * BlkRptCount field is supported only by 2D addressing channels.
1012 * - BlkRptSrcAddrUpdateMode: DMA_CBR1_BRSDEC bit
1013 * BlkRptSrcAddrUpdateMode field is supported only by 2D addressing channels.
1014 * - BlkRptDestAddrUpdateMode: DMA_CBR1_BRDDEC bit
1015 * BlkRptDestAddrUpdateMode field is supported only by 2D addressing channels.
1016 * - SrcAddrUpdateMode: DMA_CBR1_SDEC bit
1017 * SrcAddrUpdateMode field is supported only by 2D addressing channels.
1018 * - DestAddrUpdateMode: DMA_CBR1_DDEC bit
1019 * DestAddrUpdateMode field is supported only by 2D addressing channels.
1020 */
1021 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->BlkDataLength;
1022
1023 /* Update CBR1 register fields for 2D addressing channels */
1024 if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE)
1025 {
1026 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->BlkRptDestAddrUpdateMode | \
1027 DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode | \
1028 DMA_InitNodeStruct->DestAddrUpdateMode | \
1029 DMA_InitNodeStruct->SrcAddrUpdateMode | \
1030 ((DMA_InitNodeStruct->BlkRptCount << DMA_CBR1_BRC_Pos) & DMA_CBR1_BRC));
1031 }
1032
1033 /* Increment counter for the next register */
1034 reg_counter++;
1035 }
1036
1037 /* Check if CSAR register update is enabled */
1038 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CSAR) == LL_DMA_UPDATE_CSAR)
1039 {
1040 /*-------------------------- DMAx CSAR Configuration -----------------------
1041 * Configure the Transfer Block counters and update mode with parameter :
1042 * - SrcAddress: DMA_CSAR_SA[31:0] bits
1043 */
1044 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->SrcAddress;
1045
1046 /* Increment counter for the next register */
1047 reg_counter++;
1048 }
1049
1050
1051 /* Check if CDAR register update is enabled */
1052 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CDAR) == LL_DMA_UPDATE_CDAR)
1053 {
1054 /*-------------------------- DMAx CDAR Configuration -----------------------
1055 * Configure the Transfer Block counters and update mode with parameter :
1056 * - DestAddress: DMA_CDAR_DA[31:0] bits
1057 */
1058 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->DestAddress;
1059
1060 /* Increment counter for the next register */
1061 reg_counter++;
1062 }
1063
1064
1065 /* Update CTR3 register fields for 2D addressing channels */
1066 if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE)
1067 {
1068 /* Check if CTR3 register update is enabled */
1069 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR3) == LL_DMA_UPDATE_CTR3)
1070 {
1071 /*-------------------------- DMAx CTR3 Configuration ---------------------
1072 * Configure the Block counters and update mode with parameter :
1073 * - DestAddressOffset: DMA_CTR3_DAO[12:0] bits
1074 * DestAddressOffset field is supported only by 2D addressing channels.
1075 * - SrcAddressOffset: DMA_CTR3_SAO[12:0] bits
1076 * SrcAddressOffset field is supported only by 2D addressing channels.
1077 */
1078 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->SrcAddrOffset | \
1079 ((DMA_InitNodeStruct->DestAddrOffset << DMA_CTR3_DAO_Pos) & DMA_CTR3_DAO));
1080
1081 /* Increment counter for the next register */
1082 reg_counter++;
1083 }
1084 }
1085
1086
1087 /* Update CBR2 register fields for 2D addressing channels */
1088 if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE)
1089 {
1090 /* Check if CBR2 register update is enabled */
1091 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CBR2) == LL_DMA_UPDATE_CBR2)
1092 {
1093 /*-------------------------- DMAx CBR2 Configuration ---------------------
1094 * Configure the Block counters and update mode with parameter :
1095 * - BlkRptDestAddrOffset: DMA_CBR2_BRDAO[31:16] bits
1096 * BlkRptDestAddrOffset field is supported only by 2D addressing channels.
1097 * - BlkRptSrcAddrOffset: DMA_CBR2_BRSAO[15:0] bits
1098 * BlkRptSrcAddrOffset field is supported only by 2D addressing channels.
1099 */
1100 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->BlkRptSrcAddrOffset | \
1101 ((DMA_InitNodeStruct->BlkRptDestAddrOffset << DMA_CBR2_BRDAO_Pos) & \
1102 DMA_CBR2_BRDAO));
1103
1104 /* Increment counter for the next register */
1105 reg_counter++;
1106 }
1107 }
1108
1109 /* Check if CLLR register update is enabled */
1110 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CLLR) == LL_DMA_UPDATE_CLLR)
1111 {
1112 /*-------------------------- DMAx CLLR Configuration -----------------------
1113 * Configure the Transfer Block counters and update mode with parameter :
1114 * - UpdateRegisters DMA_CLLR_UT1 bit
1115 * - UpdateRegisters DMA_CLLR_UT2 bit
1116 * - UpdateRegisters DMA_CLLR_UB1 bit
1117 * - UpdateRegisters DMA_CLLR_USA bit
1118 * - UpdateRegisters DMA_CLLR_UDA bit
1119 * - UpdateRegisters DMA_CLLR_UT3 bit
1120 * DMA_CLLR_UT3 bit is discarded for linear addressing channels.
1121 * - UpdateRegisters DMA_CLLR_UB2 bit
1122 * DMA_CLLR_UB2 bit is discarded for linear addressing channels.
1123 * - UpdateRegisters DMA_CLLR_ULL bit
1124 */
1125 pNode->LinkRegisters[reg_counter] = ((DMA_InitNodeStruct->UpdateRegisters & (DMA_CLLR_UT1 | DMA_CLLR_UT2 | \
1126 DMA_CLLR_UB1 | DMA_CLLR_USA | \
1127 DMA_CLLR_UDA | DMA_CLLR_ULL)));
1128
1129 /* Update CLLR register fields for 2D addressing channels */
1130 if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE)
1131 {
1132 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->UpdateRegisters & (DMA_CLLR_UT3 | DMA_CLLR_UB2));
1133 }
1134 }
1135 else
1136 {
1137 /* Reset of the CLLR of the node being created */
1138 pNode->LinkRegisters[reg_counter] = 0U;
1139 }
1140
1141 return (uint32_t)SUCCESS;
1142 }
1143
1144 /**
1145 * @brief Connect Linked list Nodes.
1146 * @param pPrevLinkNode Pointer to previous linked list node to be connected to new Linked list node.
1147 * @param PrevNodeCLLRIdx Offset of Previous Node CLLR register.
1148 * This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
1149 * @param pNewLinkNode Pointer to new Linked list.
1150 * @param NewNodeCLLRIdx Offset of New Node CLLR register.
1151 * This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
1152 * @retval None
1153 */
LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef * pPrevLinkNode,uint32_t PrevNodeCLLRIdx,LL_DMA_LinkNodeTypeDef * pNewLinkNode,uint32_t NewNodeCLLRIdx)1154 void LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef *pPrevLinkNode, uint32_t PrevNodeCLLRIdx,
1155 LL_DMA_LinkNodeTypeDef *pNewLinkNode, uint32_t NewNodeCLLRIdx)
1156 {
1157 pPrevLinkNode->LinkRegisters[PrevNodeCLLRIdx] = (((uint32_t)pNewLinkNode & DMA_CLLR_LA) | \
1158 (pNewLinkNode->LinkRegisters[NewNodeCLLRIdx] & (DMA_CLLR_UT1 | \
1159 DMA_CLLR_UT2 | DMA_CLLR_UB1 | DMA_CLLR_USA | DMA_CLLR_UDA | \
1160 DMA_CLLR_UT3 | DMA_CLLR_UB2 | DMA_CLLR_ULL)));
1161 }
1162
1163 /**
1164 * @brief Disconnect the next linked list node.
1165 * @param pLinkNode Pointer to linked list node to be disconnected from the next one.
1166 * @param LinkNodeCLLRIdx Offset of Link Node CLLR register.
1167 * @retval None.
1168 */
LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef * pLinkNode,uint32_t LinkNodeCLLRIdx)1169 void LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef *pLinkNode, uint32_t LinkNodeCLLRIdx)
1170 {
1171 pLinkNode->LinkRegisters[LinkNodeCLLRIdx] = 0;
1172 }
1173
1174 /**
1175 * @}
1176 */
1177
1178 /**
1179 * @}
1180 */
1181
1182 /**
1183 * @}
1184 */
1185
1186 #endif /* GPDMA1 || LPDMA1 */
1187
1188 /**
1189 * @}
1190 */
1191
1192 #endif /* USE_FULL_LL_DRIVER */
1193
1194