1 /**
2   ******************************************************************************
3   * @file    stm32wbaxx_ll_dma.c
4   * @author  MCD Application Team
5   * @brief   DMA LL module driver.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2022 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 "stm32wbaxx_ll_dma.h"
43 #include "stm32wbaxx_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 STM32WBAxx_LL_Driver
51   * @{
52   */
53 
54 #if defined (GPDMA1)
55 /** @addtogroup DMA_LL
56   * @{
57   */
58 
59 /* Private types -------------------------------------------------------------*/
60 /* Private variables ---------------------------------------------------------*/
61 /* Private constants ---------------------------------------------------------*/
62 /* Private macros ------------------------------------------------------------*/
63 
64 /** @addtogroup DMA_LL_Private_Macros
65   * @{
66   */
67 #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == GPDMA1)                && \
68                                                            (((Channel)  == LL_DMA_CHANNEL_0)     || \
69                                                             ((Channel)  == LL_DMA_CHANNEL_1)     || \
70                                                             ((Channel)  == LL_DMA_CHANNEL_2)     || \
71                                                             ((Channel)  == LL_DMA_CHANNEL_3)     || \
72                                                             ((Channel)  == LL_DMA_CHANNEL_4)     || \
73                                                             ((Channel)  == LL_DMA_CHANNEL_5)     || \
74                                                             ((Channel)  == LL_DMA_CHANNEL_6)     || \
75                                                             ((Channel)  == LL_DMA_CHANNEL_7)     || \
76                                                             ((Channel)  == LL_DMA_CHANNEL_ALL)))
77 
78 #define IS_LL_GPDMA_CHANNEL_INSTANCE(INSTANCE, Channel)   (((INSTANCE) == GPDMA1)                && \
79                                                            (((Channel)  == LL_DMA_CHANNEL_0)     || \
80                                                             ((Channel)  == LL_DMA_CHANNEL_1)     || \
81                                                             ((Channel)  == LL_DMA_CHANNEL_2)     || \
82                                                             ((Channel)  == LL_DMA_CHANNEL_3)     || \
83                                                             ((Channel)  == LL_DMA_CHANNEL_4)     || \
84                                                             ((Channel)  == LL_DMA_CHANNEL_5)     || \
85                                                             ((Channel)  == LL_DMA_CHANNEL_6)     || \
86                                                             ((Channel)  == LL_DMA_CHANNEL_7)))
87 
88 #define IS_LL_DMA_DIRECTION(__VALUE__)                    (((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY) || \
89                                                            ((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \
90                                                            ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH))
91 
92 #define IS_LL_DMA_DATA_ALIGNMENT(__VALUE__)               (((__VALUE__) == LL_DMA_DATA_ALIGN_ZEROPADD)    || \
93                                                            ((__VALUE__) == LL_DMA_DATA_ALIGN_SIGNEXTPADD) || \
94                                                            ((__VALUE__) == LL_DMA_DATA_PACK_UNPACK))
95 
96 #define IS_LL_DMA_BURST_LENGTH(__VALUE__)                 (((__VALUE__) > 0U) && ((__VALUE__) <= 64U))
97 
98 #define IS_LL_DMA_SRC_DATA_WIDTH(__VALUE__)               (((__VALUE__) == LL_DMA_SRC_DATAWIDTH_BYTE)     || \
99                                                            ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_HALFWORD) || \
100                                                            ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_WORD))
101 
102 #define IS_LL_DMA_DEST_DATA_WIDTH(__VALUE__)              (((__VALUE__) == LL_DMA_DEST_DATAWIDTH_BYTE)     || \
103                                                            ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_HALFWORD) || \
104                                                            ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_WORD))
105 
106 #define IS_LL_DMA_SRC_INCREMENT_MODE(__VALUE__)           (((__VALUE__) == LL_DMA_SRC_FIXED) || \
107                                                            ((__VALUE__) == LL_DMA_SRC_INCREMENT))
108 
109 #define IS_LL_DMA_DEST_INCREMENT_MODE(__VALUE__)          (((__VALUE__) == LL_DMA_DEST_FIXED) || \
110                                                            ((__VALUE__) == LL_DMA_DEST_INCREMENT))
111 
112 #define IS_LL_DMA_PRIORITY(__VALUE__)                     (((__VALUE__) == LL_DMA_LOW_PRIORITY_LOW_WEIGHT)  || \
113                                                            ((__VALUE__) == LL_DMA_LOW_PRIORITY_MID_WEIGHT)  || \
114                                                            ((__VALUE__) == LL_DMA_LOW_PRIORITY_HIGH_WEIGHT) || \
115                                                            ((__VALUE__) == LL_DMA_HIGH_PRIORITY))
116 
117 #define IS_LL_DMA_BLK_DATALENGTH(__VALUE__)                ((__VALUE__) <= 0xFFFFU)
118 
119 #define IS_LL_DMA_BLK_REPEATCOUNT(__VALUE__)               ((__VALUE__) <= 0x0EFFU)
120 
121 #define IS_LL_DMA_TRIGGER_MODE(__VALUE__)                 (((__VALUE__) == LL_DMA_TRIGM_BLK_TRANSFER)      || \
122                                                            ((__VALUE__) == LL_DMA_TRIGM_RPT_BLK_TRANSFER)  || \
123                                                            ((__VALUE__) == LL_DMA_TRIGM_LLI_LINK_TRANSFER) || \
124                                                            ((__VALUE__) == LL_DMA_TRIGM_SINGLBURST_TRANSFER ))
125 
126 #define IS_LL_DMA_TRIGGER_POLARITY(__VALUE__)             (((__VALUE__) == LL_DMA_TRIG_POLARITY_MASKED) || \
127                                                            ((__VALUE__) == LL_DMA_TRIG_POLARITY_RISING) || \
128                                                            ((__VALUE__) == LL_DMA_TRIG_POLARITY_FALLING))
129 
130 #define IS_LL_DMA_BLKHW_REQUEST(__VALUE__)                (((__VALUE__) == LL_DMA_HWREQUEST_SINGLEBURST) || \
131                                                            ((__VALUE__) == LL_DMA_HWREQUEST_BLK))
132 
133 #if defined (TIM3)
134 #define IS_LL_DMA_TRIGGER_SELECTION(__VALUE__)             ((__VALUE__) <= LL_GPDMA1_TRIGGER_TIM3_TRGO)
135 #else
136 #define IS_LL_DMA_TRIGGER_SELECTION(__VALUE__)             ((__VALUE__) <= LL_GPDMA1_TRIGGER_ADC4_AWD1)
137 #endif /* TIM3 */
138 
139 
140 #if defined (LPTIM2)
141 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__)             ((__VALUE__) <= LL_GPDMA1_REQUEST_LPTIM2_UE)
142 #else
143 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__)             ((__VALUE__) <= LL_GPDMA1_REQUEST_LPTIM1_UE)
144 #endif /* LPTIM2 */
145 
146 
147 #define IS_LL_DMA_TRANSFER_EVENT_MODE(__VALUE__)          (((__VALUE__) == LL_DMA_TCEM_BLK_TRANSFER)         || \
148                                                            ((__VALUE__) == LL_DMA_TCEM_RPT_BLK_TRANSFER)     || \
149                                                            ((__VALUE__) == LL_DMA_TCEM_EACH_LLITEM_TRANSFER) || \
150                                                            ((__VALUE__) == LL_DMA_TCEM_LAST_LLITEM_TRANSFER))
151 
152 #define IS_LL_DMA_DEST_HALFWORD_EXCHANGE(__VALUE__)       (((__VALUE__) == LL_DMA_DEST_HALFWORD_PRESERVE) || \
153                                                            ((__VALUE__) == LL_DMA_DEST_HALFWORD_EXCHANGE))
154 
155 #define IS_LL_DMA_DEST_BYTE_EXCHANGE(__VALUE__)           (((__VALUE__) == LL_DMA_DEST_BYTE_PRESERVE) || \
156                                                            ((__VALUE__) == LL_DMA_DEST_BYTE_EXCHANGE))
157 
158 #define IS_LL_DMA_SRC_BYTE_EXCHANGE(__VALUE__)            (((__VALUE__) == LL_DMA_SRC_BYTE_PRESERVE) || \
159                                                            ((__VALUE__) == LL_DMA_SRC_BYTE_EXCHANGE))
160 
161 #define IS_LL_DMA_LINK_ALLOCATED_PORT(__VALUE__)          (((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT0) || \
162                                                            ((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT1))
163 
164 #define IS_LL_DMA_SRC_ALLOCATED_PORT(__VALUE__)           (((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT0) || \
165                                                            ((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT1))
166 
167 #define IS_LL_DMA_DEST_ALLOCATED_PORT(__VALUE__)          (((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT0) || \
168                                                            ((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT1))
169 
170 #define IS_LL_DMA_LINK_STEP_MODE(__VALUE__)               (((__VALUE__) == LL_DMA_LSM_FULL_EXECUTION) || \
171                                                            ((__VALUE__) == LL_DMA_LSM_1LINK_EXECUTION))
172 
173 #define IS_LL_DMA_BURST_SRC_ADDR_UPDATE(__VALUE__)        (((__VALUE__) == LL_DMA_BURST_SRC_ADDR_INCREMENT) || \
174                                                            ((__VALUE__) == LL_DMA_BURST_SRC_ADDR_DECREMENT))
175 
176 #define IS_LL_DMA_BURST_DEST_ADDR_UPDATE(__VALUE__)       (((__VALUE__) == LL_DMA_BURST_DEST_ADDR_INCREMENT) || \
177                                                            ((__VALUE__) == LL_DMA_BURST_DEST_ADDR_DECREMENT))
178 
179 #define IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(__VALUE__)       ((__VALUE__) <= 0x1FFFU)
180 
181 #define IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(__VALUE__)       (((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_INCREMENT) || \
182                                                            ((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_DECREMENT))
183 
184 #define IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(__VALUE__)      (((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_INCREMENT) || \
185                                                            ((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_DECREMENT))
186 
187 #define IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(__VALUE__)      ((__VALUE__) <= 0xFFFFU)
188 
189 #define IS_LL_DMA_LINK_BASEADDR(__VALUE__)                (((__VALUE__) & 0xFFFFU) == 0U)
190 
191 #define IS_LL_DMA_LINK_ADDR_OFFSET(__VALUE__)             (((__VALUE__) & 0x03U) == 0U)
192 
193 #define IS_LL_DMA_LINK_UPDATE_REGISTERS(__VALUE__)       ((((__VALUE__) & 0x01FE0000U) == 0U) && ((__VALUE__) != 0U))
194 
195 #define IS_LL_DMA_LINK_NODETYPE(TYPE)          \
196   ((TYPE) == LL_DMA_GPDMA_LINEAR_NODE)
197 
198 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
199 #define IS_LL_DMA_CHANNEL_SRC_SEC(__VALUE__)              (((__VALUE__) == LL_DMA_CHANNEL_SRC_NSEC) || \
200                                                            ((__VALUE__) == LL_DMA_CHANNEL_SRC_SEC))
201 
202 #define IS_LL_DMA_CHANNEL_DEST_SEC(__VALUE__)             (((__VALUE__) == LL_DMA_CHANNEL_DEST_NSEC) || \
203                                                            ((__VALUE__) == LL_DMA_CHANNEL_DEST_SEC))
204 
205 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
206 /**
207   * @}
208   */
209 
210 /* Private function prototypes -----------------------------------------------*/
211 /* Exported functions --------------------------------------------------------*/
212 
213 /** @addtogroup DMA_LL_Exported_Functions
214   * @{
215   */
216 
217 /** @addtogroup DMA_LL_EF_Init
218   * @{
219   */
220 
221 /**
222   * @brief De-initialize the DMA registers to their default reset values.
223   * @note  This API is used for all available DMA channels.
224   * @note  To convert DMAx_Channely Instance to DMAx Instance and Channely, use
225   *        helper macros :
226   *        @arg @ref LL_DMA_GET_INSTANCE
227   *        @arg @ref LL_DMA_GET_CHANNEL
228   * @param  DMAx DMAx Instance
229   * @param  Channel This parameter can be one of the following values:
230   *         @arg @ref LL_DMA_CHANNEL_0
231   *         @arg @ref LL_DMA_CHANNEL_1
232   *         @arg @ref LL_DMA_CHANNEL_2
233   *         @arg @ref LL_DMA_CHANNEL_3
234   *         @arg @ref LL_DMA_CHANNEL_4
235   *         @arg @ref LL_DMA_CHANNEL_5
236   *         @arg @ref LL_DMA_CHANNEL_6
237   *         @arg @ref LL_DMA_CHANNEL_7
238   * @retval An ErrorStatus enumeration value:
239   *          - SUCCESS : DMA registers are de-initialized.
240   *          - ERROR   : DMA registers are not de-initialized.
241   */
LL_DMA_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)242 uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
243 {
244   DMA_Channel_TypeDef *tmp;
245   ErrorStatus status = SUCCESS;
246 
247   /* Check the DMA Instance DMAx and Channel parameters */
248   assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
249 
250   if (Channel == LL_DMA_CHANNEL_ALL)
251   {
252     /* Force reset of DMA clock */
253     LL_AHB2_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
254 
255     /* Release reset of DMA clock */
256     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
257   }
258   else
259   {
260     /* Get the DMA Channel Instance */
261     tmp = (DMA_Channel_TypeDef *)(LL_DMA_GET_CHANNEL_INSTANCE(DMAx, Channel));
262 
263     /* Suspend DMA channel */
264     LL_DMA_SuspendChannel(DMAx, Channel);
265 
266     /* Disable the selected Channel */
267     LL_DMA_ResetChannel(DMAx, Channel);
268 
269     /* Reset DMAx_Channely control register */
270     LL_DMA_WriteReg(tmp, CLBAR, 0U);
271 
272     /* Reset DMAx_Channely control register */
273     LL_DMA_WriteReg(tmp, CCR, 0U);
274 
275     /* Reset DMAx_Channely Configuration register */
276     LL_DMA_WriteReg(tmp, CTR1, 0U);
277 
278     /* Reset DMAx_Channely transfer register 2 */
279     LL_DMA_WriteReg(tmp, CTR2, 0U);
280 
281     /* Reset DMAx_Channely block number of data register */
282     LL_DMA_WriteReg(tmp, CBR1, 0U);
283 
284     /* Reset DMAx_Channely source address register */
285     LL_DMA_WriteReg(tmp, CSAR, 0U);
286 
287     /* Reset DMAx_Channely destination address register */
288     LL_DMA_WriteReg(tmp, CDAR, 0U);
289 
290 
291     /* Reset DMAx_Channely Linked list address register */
292     LL_DMA_WriteReg(tmp, CLLR, 0U);
293 
294     /* Reset DMAx_Channely pending flags */
295     LL_DMA_WriteReg(tmp, CFCR, 0x00003F00U);
296 #if defined (DMA_PRIVCFGR_PRIV0)
297     /* Reset DMAx_Channely attribute */
298     LL_DMA_DisableChannelPrivilege(DMAx, Channel);
299 #endif /* DMA_PRIVCFGR_PRIV0 */
300 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
301     LL_DMA_DisableChannelSecure(DMAx, Channel);
302 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
303   }
304 
305   return (uint32_t)status;
306 }
307 
308 /**
309   * @brief Initialize the DMA registers according to the specified parameters
310   *        in DMA_InitStruct.
311   * @note  This API is used for all available DMA channels.
312   * @note  A software request transfer can be done once programming the direction
313   *        field in memory to memory value.
314   * @note  To convert DMAx_Channely Instance to DMAx Instance and Channely, use
315   *        helper macros :
316   *        @arg @ref LL_DMA_GET_INSTANCE
317   *        @arg @ref LL_DMA_GET_CHANNEL
318   * @param  DMAx DMAx Instance
319   * @param  Channel This parameter can be one of the following values:
320   *         @arg @ref LL_DMA_CHANNEL_0
321   *         @arg @ref LL_DMA_CHANNEL_1
322   *         @arg @ref LL_DMA_CHANNEL_2
323   *         @arg @ref LL_DMA_CHANNEL_3
324   *         @arg @ref LL_DMA_CHANNEL_4
325   *         @arg @ref LL_DMA_CHANNEL_5
326   *         @arg @ref LL_DMA_CHANNEL_6
327   *         @arg @ref LL_DMA_CHANNEL_7
328   * @param  DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure.
329   * @retval An ErrorStatus enumeration value:
330   *          - SUCCESS : DMA registers are initialized.
331   *          - ERROR   : Not applicable.
332   */
LL_DMA_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitTypeDef * DMA_InitStruct)333 uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct)
334 {
335   /* Check the DMA Instance DMAx and Channel parameters*/
336   assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
337 
338   /* Check the DMA parameters from DMA_InitStruct */
339   assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction));
340 
341   /* Check direction */
342   if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
343   {
344     assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitStruct->Request));
345   }
346 
347   assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitStruct->DataAlignment));
348   assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitStruct->SrcDataWidth));
349   assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitStruct->DestDataWidth));
350   assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitStruct->SrcIncMode));
351   assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitStruct->DestIncMode));
352   assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority));
353   assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitStruct->BlkDataLength));
354   assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitStruct->TriggerPolarity));
355   assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitStruct->BlkHWRequest));
356   assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitStruct->TransferEventMode));
357   assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitStruct->LinkStepMode));
358   assert_param(IS_LL_DMA_LINK_BASEADDR(DMA_InitStruct->LinkedListBaseAddr));
359   assert_param(IS_LL_DMA_LINK_ADDR_OFFSET(DMA_InitStruct->LinkedListAddrOffset));
360 
361   /* Check DMA instance */
362   if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
363   {
364     assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->SrcBurstLength));
365     assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->DestBurstLength));
366     assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitStruct->DestHWordExchange));
367     assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitStruct->DestByteExchange));
368     assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitStruct->SrcByteExchange));
369     assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitStruct->LinkAllocatedPort));
370     assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitStruct->SrcAllocatedPort));
371     assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitStruct->DestAllocatedPort));
372   }
373 
374   /* Check trigger polarity */
375   if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
376   {
377     assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitStruct->TriggerMode));
378     assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitStruct->TriggerSelection));
379   }
380 
381 
382   /*-------------------------- DMAx CLBAR Configuration ------------------------
383    * Configure the Transfer linked list address with parameter :
384    * - LinkedListBaseAdd:                              DMA_CLBAR_LBA[31:16] bits
385    */
386   LL_DMA_SetLinkedListBaseAddr(DMAx, Channel, DMA_InitStruct->LinkedListBaseAddr);
387 
388   /*-------------------------- DMAx CCR Configuration --------------------------
389    * Configure the control parameter :
390    * - LinkAllocatedPort:                              DMA_CCR_LAP bit
391    * - LinkStepMode:                                   DMA_CCR_LSM bit
392    * - Priority:                                       DMA_CCR_PRIO [23:22] bits
393    */
394   LL_DMA_ConfigControl(DMAx, Channel, DMA_InitStruct->Priority | \
395                        DMA_InitStruct->LinkAllocatedPort       | \
396                        DMA_InitStruct->LinkStepMode);
397 
398   /*-------------------------- DMAx CTR1 Configuration -------------------------
399    * Configure the Data transfer  parameter :
400    * - DestAllocatedPort:                         DMA_CTR1_DAP bit
401    * - DestHWordExchange:                         DMA_CTR1_DHX bit
402    * - DestByteExchange:                          DMA_CTR1_DBX bit
403    * - DestIncMode:                               DMA_CTR1_DINC bit
404    * - DestDataWidth:                             DMA_CTR1_DDW_LOG2 [17:16] bits
405    * - SrcAllocatedPort:                          DMA_CTR1_SAP bit
406    * - SrcByteExchange:                           DMA_CTR1_SBX bit
407    * - DataAlignment:                             DMA_CTR1_PAM [12:11] bits
408    * - SrcIncMode:                                DMA_CTR1_SINC bit
409    * - SrcDataWidth:                              DMA_CTR1_SDW_LOG2 [1:0] bits
410    * - SrcBurstLength:                            DMA_CTR1_SBL_1 [9:4] bits
411    * - DestBurstLength:                           DMA_CTR1_DBL_1 [25:20] bits
412    */
413   LL_DMA_ConfigTransfer(DMAx, Channel, DMA_InitStruct->DestAllocatedPort | \
414                         DMA_InitStruct->DestHWordExchange                | \
415                         DMA_InitStruct->DestByteExchange                 | \
416                         DMA_InitStruct->DestIncMode                      | \
417                         DMA_InitStruct->DestDataWidth                    | \
418                         DMA_InitStruct->SrcAllocatedPort                 | \
419                         DMA_InitStruct->SrcByteExchange                  | \
420                         DMA_InitStruct->DataAlignment                    | \
421                         DMA_InitStruct->SrcIncMode                       | \
422                         DMA_InitStruct->SrcDataWidth);
423   /* Check DMA instance */
424   if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
425   {
426     LL_DMA_ConfigBurstLength(DMAx, Channel,  DMA_InitStruct->SrcBurstLength,
427                              DMA_InitStruct->DestBurstLength);
428   }
429   /*-------------------------- DMAx CTR2 Configuration -------------------------
430    * Configure the channel transfer parameter :
431    * - TransferEventMode:                          DMA_CTR2_TCEM [31:30] bits
432    * - TriggerPolarity:                            DMA_CTR2_TRIGPOL [25:24] bits
433    * - TriggerMode:                                DMA_CTR2_TRIGM  [15:14] bits
434    * - BlkHWRequest:                               DMA_CTR2_BREQ bit
435    * - Direction:                                  DMA_CTR2_DREQ bit
436    * - Direction:                                  DMA_CTR2_SWREQ bit
437    * - TriggerSelection:                           DMA_CTR2_TRIGSEL [21:16] bits
438    * - Request:                                    DMA_CTR2_REQSEL [6:0] bits
439    */
440   LL_DMA_ConfigChannelTransfer(DMAx, Channel, DMA_InitStruct->TransferEventMode | \
441                                DMA_InitStruct->TriggerPolarity                  | \
442                                DMA_InitStruct->BlkHWRequest                     | \
443                                DMA_InitStruct->Direction);
444 
445   /* Check direction */
446   if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
447   {
448     LL_DMA_SetPeriphRequest(DMAx, Channel, DMA_InitStruct->Request);
449   }
450 
451   /* Check trigger polarity */
452   if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
453   {
454     LL_DMA_SetHWTrigger(DMAx, Channel, DMA_InitStruct->TriggerSelection);
455     LL_DMA_SetTriggerMode(DMAx, Channel, DMA_InitStruct->TriggerMode);
456   }
457 
458   /*-------------------------- DMAx CBR1 Configuration -------------------------
459    * Configure the Transfer Block counters and update mode with parameter :
460    * - BlkDataLength:                                   DMA_CBR1_BNDT[15:0] bits
461    */
462   LL_DMA_SetBlkDataLength(DMAx, Channel, DMA_InitStruct->BlkDataLength);
463 
464   /*-------------------------- DMAx CSAR and CDAR Configuration ----------------
465    * Configure the Transfer source address with parameter :
466    * - SrcAddress:                                        DMA_CSAR_SA[31:0] bits
467    * - DestAddress:                                       DMA_CDAR_DA[31:0] bits
468    */
469   LL_DMA_ConfigAddresses(DMAx, Channel, DMA_InitStruct->SrcAddress, DMA_InitStruct->DestAddress);
470 
471   /*-------------------------- DMAx CLLR Configuration -------------------------
472    * Configure the Transfer linked list address with parameter :
473    * - DestAddrOffset:                                    DMA_CLLR_LA[15:2] bits
474    */
475   LL_DMA_SetLinkedListAddrOffset(DMAx, Channel, DMA_InitStruct->LinkedListAddrOffset);
476 
477   return (uint32_t)SUCCESS;
478 }
479 
480 /**
481   * @brief  Set each @ref LL_DMA_InitTypeDef field to default value.
482   * @param  DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure.
483   * @retval None.
484   */
LL_DMA_StructInit(LL_DMA_InitTypeDef * DMA_InitStruct)485 void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct)
486 {
487   /* Set DMA_InitStruct fields to default values */
488   DMA_InitStruct->SrcAddress               = 0x00000000U;
489   DMA_InitStruct->DestAddress              = 0x00000000U;
490   DMA_InitStruct->Direction                = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
491   DMA_InitStruct->BlkHWRequest             = LL_DMA_HWREQUEST_SINGLEBURST;
492   DMA_InitStruct->DataAlignment            = LL_DMA_DATA_ALIGN_ZEROPADD;
493   DMA_InitStruct->SrcBurstLength           = 1U;
494   DMA_InitStruct->DestBurstLength          = 1U;
495   DMA_InitStruct->SrcDataWidth             = LL_DMA_SRC_DATAWIDTH_BYTE;
496   DMA_InitStruct->DestDataWidth            = LL_DMA_DEST_DATAWIDTH_BYTE;
497   DMA_InitStruct->SrcIncMode               = LL_DMA_SRC_FIXED;
498   DMA_InitStruct->DestIncMode              = LL_DMA_DEST_FIXED;
499   DMA_InitStruct->Priority                 = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
500   DMA_InitStruct->BlkDataLength            = 0x00000000U;
501   DMA_InitStruct->TriggerMode              = LL_DMA_TRIGM_BLK_TRANSFER;
502   DMA_InitStruct->TriggerPolarity          = LL_DMA_TRIG_POLARITY_MASKED;
503   DMA_InitStruct->TriggerSelection         = 0x00000000U;
504   DMA_InitStruct->Request                  = 0x00000000U;
505   DMA_InitStruct->TransferEventMode        = LL_DMA_TCEM_BLK_TRANSFER;
506   DMA_InitStruct->DestHWordExchange        = LL_DMA_DEST_HALFWORD_PRESERVE;
507   DMA_InitStruct->DestByteExchange         = LL_DMA_DEST_BYTE_PRESERVE;
508   DMA_InitStruct->SrcByteExchange          = LL_DMA_SRC_BYTE_PRESERVE;
509   DMA_InitStruct->SrcAllocatedPort         = LL_DMA_SRC_ALLOCATED_PORT0;
510   DMA_InitStruct->DestAllocatedPort        = LL_DMA_DEST_ALLOCATED_PORT0;
511   DMA_InitStruct->LinkAllocatedPort        = LL_DMA_LINK_ALLOCATED_PORT0;
512   DMA_InitStruct->LinkStepMode             = LL_DMA_LSM_FULL_EXECUTION;
513   DMA_InitStruct->LinkedListBaseAddr       = 0x00000000U;
514   DMA_InitStruct->LinkedListAddrOffset     = 0x00000000U;
515 }
516 
517 /**
518   * @brief  Set each @ref LL_DMA_InitLinkedListTypeDef field to default value.
519   * @param  DMA_InitLinkedListStruct Pointer to
520   *         a @ref LL_DMA_InitLinkedListTypeDef structure.
521   * @retval None.
522   */
LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)523 void LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
524 {
525   /* Set LL_DMA_InitLinkedListTypeDef fields to default values */
526   DMA_InitLinkedListStruct->Priority          = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
527   DMA_InitLinkedListStruct->LinkStepMode      = LL_DMA_LSM_FULL_EXECUTION;
528   DMA_InitLinkedListStruct->TransferEventMode = LL_DMA_TCEM_LAST_LLITEM_TRANSFER;
529   DMA_InitLinkedListStruct->LinkAllocatedPort = LL_DMA_LINK_ALLOCATED_PORT0;
530 }
531 
532 /**
533   * @brief De-initialize the DMA linked list.
534   * @note  This API is used for all available DMA channels.
535   * @note  To convert DMAx_Channely Instance to DMAx Instance and Channely, use
536   *        helper macros :
537   *        @arg @ref LL_DMA_GET_INSTANCE
538   *        @arg @ref LL_DMA_GET_CHANNEL
539   * @param  DMAx DMAx Instance
540   * @param  Channel This parameter can be one of the following values:
541   *         @arg @ref LL_DMA_CHANNEL_0
542   *         @arg @ref LL_DMA_CHANNEL_1
543   *         @arg @ref LL_DMA_CHANNEL_2
544   *         @arg @ref LL_DMA_CHANNEL_3
545   *         @arg @ref LL_DMA_CHANNEL_4
546   *         @arg @ref LL_DMA_CHANNEL_5
547   *         @arg @ref LL_DMA_CHANNEL_6
548   *         @arg @ref LL_DMA_CHANNEL_7
549   * @retval An ErrorStatus enumeration value:
550   *          - SUCCESS : DMA registers are de-initialized.
551   *          - ERROR   : DMA registers are not de-initialized.
552   */
LL_DMA_List_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)553 uint32_t LL_DMA_List_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
554 {
555   return LL_DMA_DeInit(DMAx, Channel);
556 }
557 
558 /**
559   * @brief Initialize the DMA linked list according to the specified parameters
560   *        in LL_DMA_InitLinkedListTypeDef.
561   * @note  This API is used for all available DMA channels.
562   * @note  To convert DMAx_Channely Instance to DMAx Instance and Channely, use
563   *        helper macros :
564   *        @arg @ref LL_DMA_GET_INSTANCE
565   *        @arg @ref LL_DMA_GET_CHANNEL
566   * @param  DMAx DMAx Instance
567   * @param  Channel This parameter can be one of the following values:
568   *         @arg @ref LL_DMA_CHANNEL_0
569   *         @arg @ref LL_DMA_CHANNEL_1
570   *         @arg @ref LL_DMA_CHANNEL_2
571   *         @arg @ref LL_DMA_CHANNEL_3
572   *         @arg @ref LL_DMA_CHANNEL_4
573   *         @arg @ref LL_DMA_CHANNEL_5
574   *         @arg @ref LL_DMA_CHANNEL_6
575   *         @arg @ref LL_DMA_CHANNEL_7
576   * @param  DMA_InitLinkedListStruct pointer to
577   *         a @ref LL_DMA_InitLinkedListTypeDef structure.
578   * @retval An ErrorStatus enumeration value:
579   *          - SUCCESS : DMA registers are initialized.
580   *          - ERROR   : Not applicable.
581   */
LL_DMA_List_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)582 uint32_t LL_DMA_List_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
583 {
584   /* Check the DMA Instance DMAx and Channel parameters*/
585   assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
586 
587   /* Check the DMA parameters from DMA_InitLinkedListStruct */
588   assert_param(IS_LL_DMA_PRIORITY(DMA_InitLinkedListStruct->Priority));
589   assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitLinkedListStruct->LinkStepMode));
590   assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitLinkedListStruct->TransferEventMode));
591   /* Check DMA instance */
592   if (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
593   {
594     assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitLinkedListStruct->LinkAllocatedPort));
595   }
596 
597   /*-------------------------- DMAx CCR Configuration --------------------------
598    * Configure the control parameter :
599    * - LinkAllocatedPort:                              DMA_CCR_LAP bit
600    *   LinkAllocatedPort field is supported only by GPDMA channels.
601    * - LinkStepMode:                                   DMA_CCR_LSM bit
602    * - Priority:                                       DMA_CCR_PRIO [23:22] bits
603    */
604   LL_DMA_ConfigControl(DMAx, Channel, DMA_InitLinkedListStruct->Priority | \
605                        DMA_InitLinkedListStruct->LinkAllocatedPort       | \
606                        DMA_InitLinkedListStruct->LinkStepMode);
607   /*-------------------------- DMAx CTR2 Configuration -------------------------
608    * Configure the channel transfer parameter :
609    * - TransferEventMode:                          DMA_CTR2_TCEM [31:30] bits
610    */
611   LL_DMA_SetTransferEventMode(DMAx, Channel, DMA_InitLinkedListStruct->TransferEventMode);
612 
613   return (uint32_t)SUCCESS;
614 }
615 
616 /**
617   * @brief  Set each @ref LL_DMA_InitNodeTypeDef field to default value.
618   * @param  DMA_InitNodeStruct Pointer to a @ref LL_DMA_InitNodeTypeDef
619   *         structure.
620   * @retval None.
621   */
LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct)622 void LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct)
623 {
624   /* Set DMA_InitNodeStruct fields to default values */
625 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
626   DMA_InitNodeStruct->DestSecure               = LL_DMA_CHANNEL_DEST_NSEC;
627 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
628   DMA_InitNodeStruct->DestAllocatedPort        = LL_DMA_DEST_ALLOCATED_PORT0;
629   DMA_InitNodeStruct->DestHWordExchange        = LL_DMA_DEST_HALFWORD_PRESERVE;
630   DMA_InitNodeStruct->DestByteExchange         = LL_DMA_DEST_BYTE_PRESERVE;
631   DMA_InitNodeStruct->DestBurstLength          = 1U;
632   DMA_InitNodeStruct->DestIncMode              = LL_DMA_DEST_FIXED;
633   DMA_InitNodeStruct->DestDataWidth            = LL_DMA_DEST_DATAWIDTH_BYTE;
634 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
635   DMA_InitNodeStruct->SrcSecure                = LL_DMA_CHANNEL_SRC_NSEC;
636 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
637   DMA_InitNodeStruct->SrcAllocatedPort         = LL_DMA_SRC_ALLOCATED_PORT0;
638   DMA_InitNodeStruct->SrcByteExchange          = LL_DMA_SRC_BYTE_PRESERVE;
639   DMA_InitNodeStruct->DataAlignment            = LL_DMA_DATA_ALIGN_ZEROPADD;
640   DMA_InitNodeStruct->SrcBurstLength           = 1U;
641   DMA_InitNodeStruct->SrcIncMode               = LL_DMA_SRC_FIXED;
642   DMA_InitNodeStruct->SrcDataWidth             = LL_DMA_SRC_DATAWIDTH_BYTE;
643   DMA_InitNodeStruct->TransferEventMode        = LL_DMA_TCEM_BLK_TRANSFER;
644   DMA_InitNodeStruct->TriggerPolarity          = LL_DMA_TRIG_POLARITY_MASKED;
645   DMA_InitNodeStruct->TriggerSelection         = 0x00000000U;
646   DMA_InitNodeStruct->TriggerMode              = LL_DMA_TRIGM_BLK_TRANSFER;
647   DMA_InitNodeStruct->BlkHWRequest             = LL_DMA_HWREQUEST_SINGLEBURST;
648   DMA_InitNodeStruct->Direction                = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
649   DMA_InitNodeStruct->Request                  = 0x00000000U;
650   DMA_InitNodeStruct->BlkDataLength            = 0x00000000U;
651   DMA_InitNodeStruct->SrcAddress               = 0x00000000U;
652   DMA_InitNodeStruct->DestAddress              = 0x00000000U;
653   DMA_InitNodeStruct->UpdateRegisters          = (LL_DMA_UPDATE_CTR1 | LL_DMA_UPDATE_CTR2 | \
654                                                   LL_DMA_UPDATE_CBR1 | LL_DMA_UPDATE_CSAR | \
655                                                   LL_DMA_UPDATE_CDAR | LL_DMA_UPDATE_CLLR);
656   DMA_InitNodeStruct->NodeType                 = LL_DMA_GPDMA_LINEAR_NODE;
657 }
658 
659 /**
660   * @brief  Initializes DMA linked list node according to the specified
661   *         parameters in the DMA_InitNodeStruct.
662   * @param  DMA_InitNodeStruct Pointer to a LL_DMA_InitNodeTypeDef structure
663   *         that contains linked list node
664   *         registers configurations.
665   * @param  pNode Pointer to linked list node to fill according to
666   *         LL_DMA_LinkNodeTypeDef parameters.
667   * @retval None
668   */
LL_DMA_CreateLinkNode(const LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct,LL_DMA_LinkNodeTypeDef * pNode)669 uint32_t LL_DMA_CreateLinkNode(const LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct, LL_DMA_LinkNodeTypeDef *pNode)
670 {
671   uint32_t reg_counter = 0U;
672 
673   /* Check the DMA Node type */
674   assert_param(IS_LL_DMA_LINK_NODETYPE(DMA_InitNodeStruct->NodeType));
675 
676   /* Check the DMA parameters from DMA_InitNodeStruct */
677   assert_param(IS_LL_DMA_DIRECTION(DMA_InitNodeStruct->Direction));
678 
679   /* Check direction */
680   if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
681   {
682     assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitNodeStruct->Request));
683   }
684 
685   assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitNodeStruct->DataAlignment));
686   assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitNodeStruct->SrcDataWidth));
687   assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitNodeStruct->DestDataWidth));
688   assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitNodeStruct->SrcIncMode));
689   assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitNodeStruct->DestIncMode));
690   assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitNodeStruct->BlkDataLength));
691   assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitNodeStruct->TriggerPolarity));
692   assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitNodeStruct->BlkHWRequest));
693   assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitNodeStruct->TransferEventMode));
694   assert_param(IS_LL_DMA_LINK_UPDATE_REGISTERS(DMA_InitNodeStruct->UpdateRegisters));
695 
696 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
697   assert_param(IS_LL_DMA_CHANNEL_SRC_SEC(DMA_InitNodeStruct->SrcSecure));
698   assert_param(IS_LL_DMA_CHANNEL_DEST_SEC(DMA_InitNodeStruct->DestSecure));
699 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
700 
701   /* Check trigger polarity */
702   if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
703   {
704     assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitNodeStruct->TriggerMode));
705     assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitNodeStruct->TriggerSelection));
706   }
707 
708   /* Check node type */
709   if (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_LINEAR_NODE)
710   {
711     assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitNodeStruct->DestHWordExchange));
712     assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitNodeStruct->DestByteExchange));
713     assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitNodeStruct->SrcByteExchange));
714     assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitNodeStruct->SrcAllocatedPort));
715     assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitNodeStruct->DestAllocatedPort));
716   }
717 
718 
719   /* Check if CTR1 register update is enabled */
720   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR1) == LL_DMA_UPDATE_CTR1)
721   {
722     /*-------------------------- DMAx CTR1 Configuration -----------------------
723     * Configure the Data transfer  parameter :
724     * - DestAllocatedPort:                        DMA_CTR1_DAP bit
725     * - DestHWordExchange:                        DMA_CTR1_DHX bit
726     * - DestByteExchange:                         DMA_CTR1_DBX bit
727     * - DestIncMode:                              DMA_CTR1_DINC bit
728     * - DestDataWidth:                            DMA_CTR1_DDW_LOG2 [17:16] bits
729     * - SrcAllocatedPort:                         DMA_CTR1_SAP bit
730     * - SrcByteExchange:                          DMA_CTR1_SBX bit
731     * - DataAlignment:                            DMA_CTR1_PAM [12:11] bits
732     * - SrcIncMode:                               DMA_CTR1_SINC bit
733     * - SrcDataWidth:                             DMA_CTR1_SDW_LOG2 [1:0] bits
734     * - SrcBurstLength:                           DMA_CTR1_SBL_1 [9:4] bits
735     * - DestBurstLength:                          DMA_CTR1_DBL_1 [25:20] bits
736     */
737 
738     pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->DestIncMode   | \
739                                          DMA_InitNodeStruct->DestDataWidth | \
740                                          DMA_InitNodeStruct->DataAlignment | \
741                                          DMA_InitNodeStruct->SrcIncMode    | \
742                                          DMA_InitNodeStruct->SrcDataWidth);
743 
744 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
745     pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestSecure | \
746                                           DMA_InitNodeStruct->SrcSecure);
747 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
748 
749 
750     /* Update CTR1 register fields */
751     pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestAllocatedPort                              | \
752                                           DMA_InitNodeStruct->DestHWordExchange                              | \
753                                           DMA_InitNodeStruct->DestByteExchange                               | \
754                                           ((DMA_InitNodeStruct->DestBurstLength - 1U) << DMA_CTR1_DBL_1_Pos) | \
755                                           DMA_InitNodeStruct->SrcAllocatedPort                               | \
756                                           DMA_InitNodeStruct->SrcByteExchange                                | \
757                                           ((DMA_InitNodeStruct->SrcBurstLength - 1U) << DMA_CTR1_SBL_1_Pos));
758 
759     /* Increment counter for the next register */
760     reg_counter++;
761   }
762 
763 
764   /* Check if CTR2 register update is enabled */
765   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR2) == LL_DMA_UPDATE_CTR2)
766   {
767     /*-------------------------- DMAx CTR2 Configuration -----------------------
768      * Configure the channel transfer parameter :
769      * - TransferEventMode:                        DMA_CTR2_TCEM [31:30] bits
770      * - TriggerPolarity:                          DMA_CTR2_TRIGPOL [25:24] bits
771      * - TriggerMode:                              DMA_CTR2_TRIGM  [15:14] bits
772      * - BlkHWRequest:                             DMA_CTR2_BREQ bit
773      * - Direction:                                DMA_CTR2_DREQ bit
774      * - Direction:                                DMA_CTR2_SWREQ bit
775      * - TriggerSelection:                         DMA_CTR2_TRIGSEL [21:16] bits
776      * - Request:                                  DMA_CTR2_REQSEL [6:0] bits
777      */
778     pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->TransferEventMode | \
779                                          DMA_InitNodeStruct->TriggerPolarity   | \
780                                          DMA_InitNodeStruct->BlkHWRequest      | \
781                                          DMA_InitNodeStruct->Direction);
782 
783     /* Check direction */
784     if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
785     {
786       pNode->LinkRegisters[reg_counter] |= DMA_InitNodeStruct->Request & DMA_CTR2_REQSEL;
787     }
788 
789     /* Check trigger polarity */
790     if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
791     {
792       pNode->LinkRegisters[reg_counter] |= (((DMA_InitNodeStruct->TriggerSelection << DMA_CTR2_TRIGSEL_Pos) & \
793                                              DMA_CTR2_TRIGSEL) | DMA_InitNodeStruct->TriggerMode);
794     }
795 
796 
797     /* Increment counter for the next register */
798     reg_counter++;
799   }
800   /* Check if CBR1 register update is enabled */
801   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CBR1) == LL_DMA_UPDATE_CBR1)
802   {
803     /*-------------------------- DMAx CBR1 Configuration -----------------------
804      * Configure the Transfer Block counters and update mode with parameter :
805      * - BlkDataLength:                                 DMA_CBR1_BNDT[15:0] bits
806      */
807     pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->BlkDataLength;
808 
809     /* Increment counter for the next register */
810     reg_counter++;
811   }
812   /* Check if CSAR register update is enabled */
813   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CSAR) == LL_DMA_UPDATE_CSAR)
814   {
815     /*-------------------------- DMAx CSAR Configuration -----------------------
816      * Configure the Transfer Block counters and update mode with parameter :
817      * - SrcAddress:                                         DMA_CSAR_SA[31:0] bits
818      */
819     pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->SrcAddress;
820 
821     /* Increment counter for the next register */
822     reg_counter++;
823   }
824 
825 
826   /* Check if CDAR register update is enabled */
827   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CDAR) == LL_DMA_UPDATE_CDAR)
828   {
829     /*-------------------------- DMAx CDAR Configuration -----------------------
830      * Configure the Transfer Block counters and update mode with parameter :
831      * - DestAddress:                                        DMA_CDAR_DA[31:0] bits
832      */
833     pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->DestAddress;
834 
835     /* Increment counter for the next register */
836     reg_counter++;
837   }
838 
839 
840   /* Check if CLLR register update is enabled */
841   if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CLLR) == LL_DMA_UPDATE_CLLR)
842   {
843     /*-------------------------- DMAx CLLR Configuration -----------------------
844     * Configure the Transfer Block counters and update mode with parameter :
845     * - UpdateRegisters                                         DMA_CLLR_UT1 bit
846     * - UpdateRegisters                                         DMA_CLLR_UT2 bit
847     * - UpdateRegisters                                         DMA_CLLR_UB1 bit
848     * - UpdateRegisters                                         DMA_CLLR_USA bit
849     * - UpdateRegisters                                         DMA_CLLR_UDA bit
850     * - UpdateRegisters                                         DMA_CLLR_ULL bit
851     */
852     pNode->LinkRegisters[reg_counter] = ((DMA_InitNodeStruct->UpdateRegisters & (DMA_CLLR_UT1 | DMA_CLLR_UT2 | \
853                                                                                  DMA_CLLR_UB1 | DMA_CLLR_USA | \
854                                                                                  DMA_CLLR_UDA | DMA_CLLR_ULL)));
855 
856   }
857   else
858   {
859     /* Reset of the CLLR of the node being created */
860     pNode->LinkRegisters[reg_counter] = 0U;
861   }
862 
863   return (uint32_t)SUCCESS;
864 }
865 
866 /**
867   * @brief  Connect Linked list Nodes.
868   * @param  pPrevLinkNode Pointer to previous linked list node to be connected to new Linked list node.
869   * @param  PrevNodeCLLRIdx Offset of Previous Node CLLR register.
870   *         This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
871   * @param  pNewLinkNode Pointer to new Linked list.
872   * @param  NewNodeCLLRIdx Offset of New Node CLLR register.
873   *         This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
874   * @retval None
875   */
LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef * pPrevLinkNode,uint32_t PrevNodeCLLRIdx,LL_DMA_LinkNodeTypeDef * pNewLinkNode,uint32_t NewNodeCLLRIdx)876 void LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef *pPrevLinkNode, uint32_t PrevNodeCLLRIdx,
877                             LL_DMA_LinkNodeTypeDef *pNewLinkNode, uint32_t NewNodeCLLRIdx)
878 {
879   pPrevLinkNode->LinkRegisters[PrevNodeCLLRIdx] = (((uint32_t)pNewLinkNode & DMA_CLLR_LA)                        | \
880                                                    (pNewLinkNode->LinkRegisters[NewNodeCLLRIdx] & (DMA_CLLR_UT1  | \
881                                                        DMA_CLLR_UT2 | DMA_CLLR_UB1 | DMA_CLLR_USA | DMA_CLLR_UDA | \
882                                                        DMA_CLLR_ULL)));
883 }
884 
885 /**
886   * @brief  Disconnect the next linked list node.
887   * @param  pLinkNode Pointer to linked list node to be disconnected from the next one.
888   * @param  LinkNodeCLLRIdx Offset of Link Node CLLR register.
889   * @retval None.
890   */
LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef * pLinkNode,uint32_t LinkNodeCLLRIdx)891 void LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef *pLinkNode, uint32_t LinkNodeCLLRIdx)
892 {
893   pLinkNode->LinkRegisters[LinkNodeCLLRIdx] = 0;
894 }
895 
896 /**
897   * @}
898   */
899 
900 /**
901   * @}
902   */
903 
904 /**
905   * @}
906   */
907 
908 #endif /* GPDMA1 */
909 
910 /**
911   * @}
912   */
913 
914 #endif /* USE_FULL_LL_DRIVER */
915 
916