1 /** 2 ********************************************************************************************************************** 3 * @file stm32u5xx_hal_dma_ex.h 4 * @author MCD Application Team 5 * @brief Header file of DMA HAL extension module. 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 */ 18 19 /* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/ 20 #ifndef STM32U5xx_HAL_DMA_EX_H 21 #define STM32U5xx_HAL_DMA_EX_H 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Includes ----------------------------------------------------------------------------------------------------------*/ 28 #include "stm32u5xx_hal_def.h" 29 30 /** @addtogroup STM32U5xx_HAL_Driver 31 * @{ 32 */ 33 34 /** @addtogroup DMAEx 35 * @{ 36 */ 37 38 /* Exported types ----------------------------------------------------------------------------------------------------*/ 39 /** @defgroup DMAEx_Exported_Types DMAEx Exported Types 40 * @brief DMAEx Exported types 41 * @{ 42 */ 43 44 /** 45 * @brief DMAEx Data Handling Configuration Structure Definition. 46 */ 47 typedef struct 48 { 49 uint32_t DataExchange; /*!< Specifies the DMA channel data exchange mode. 50 This parameter can be a value of @ref DMAEx_Data_Exchange */ 51 52 uint32_t DataAlignment; /*!< Specifies the DMA channel data padding and alignment mode 53 This parameter can be a value of @ref DMAEx_Data_Alignment */ 54 55 } DMA_DataHandlingConfTypeDef; 56 57 /** 58 * @brief DMAEx Trigger Configuration Structure Definition. 59 */ 60 typedef struct 61 { 62 uint32_t TriggerMode; /*!< Specifies the DMA channel trigger mode. 63 This parameter can be a value of @ref DMAEx_Trigger_Mode */ 64 65 uint32_t TriggerPolarity; /*!< Specifies the DMA channel trigger event polarity. 66 This parameter can be a value of @ref DMAEx_Trigger_Polarity */ 67 68 uint32_t TriggerSelection; /*!< Specifies the DMA channel trigger event selection. 69 This parameter can be a value of @ref DMAEx_Trigger_Selection */ 70 71 } DMA_TriggerConfTypeDef; 72 73 /** 74 * @brief DMAEx Repeated Block Configuration Structure Definition. 75 */ 76 typedef struct 77 { 78 uint32_t RepeatCount; /*!< Specifies the DMA channel repeat count (the number of repetitions of block). 79 This parameter can be a value between 1 and 2048 */ 80 81 int32_t SrcAddrOffset; /*!< Specifies the DMA channel single/burst source address offset : 82 This parameter can be a value between -8191 and 8191. 83 * If source address offset > 0 => Increment the source address by offset from where 84 the last single/burst transfer ends. 85 * If source address offset < 0 => Decrement the source address by offset from where 86 the last single/burst transfer ends. 87 * If source address offset == 0 => The next single/burst source address starts from 88 where the last transfer ends */ 89 90 int32_t DestAddrOffset; /*!< Specifies the DMA channel single/burst destination address offset signed value : 91 This parameter can be a value between -8191 and 8191. 92 * If destination address offset > 0 => Increment the destination address by offset 93 from where the last single/burst transfer ends. 94 * If destination address offset < 0 => Decrement the destination address by offset 95 from where the last single/burst transfer ends. 96 * If destination address offset == 0 => The next single/burst destination address 97 starts from where the last transfer ends. */ 98 99 int32_t BlkSrcAddrOffset; /*!< Specifies the DMA channel block source address offset signed value : 100 This parameter can be a value between -65535 and 65535. 101 * If block source address offset > 0 => Increment the block source address by offset 102 from where the last block ends. 103 * If block source address offset < 0 => Decrement the next block source address by 104 offset from where the last block ends. 105 * If block source address offset == 0 => the next block source address starts from 106 where the last block ends */ 107 108 int32_t BlkDestAddrOffset; /*!< Specifies the DMA channel block destination address offset signed value : 109 This parameter can be a value between -65535 and 65535. 110 * If block destination address offset > 0 => Increment the block destination address 111 by offset from where the last block ends. 112 * If block destination address offset < 0 => Decrement the next block destination 113 address by offset from where the last block ends. 114 * If block destination address offset == 0 => the next block destination address 115 starts from where the last block ends */ 116 117 } DMA_RepeatBlockConfTypeDef; 118 119 /** 120 * @brief DMAEx Queue State Enumeration Definition. 121 */ 122 typedef enum 123 { 124 HAL_DMA_QUEUE_STATE_RESET = 0x00U, /*!< DMA queue empty */ 125 HAL_DMA_QUEUE_STATE_READY = 0x01U, /*!< DMA queue ready for use */ 126 HAL_DMA_QUEUE_STATE_BUSY = 0x02U /*!< DMA queue execution on going */ 127 128 } HAL_DMA_QStateTypeDef; 129 130 /** 131 * @brief DMAEx Linked-List Node Configuration Structure Definition. 132 */ 133 typedef struct 134 { 135 uint32_t NodeType; /*!< Specifies the DMA channel node type. 136 This parameter can be a value of @ref DMAEx_Node_Type */ 137 138 DMA_InitTypeDef Init; /*!< Specifies the DMA channel basic configuration */ 139 140 DMA_DataHandlingConfTypeDef DataHandlingConfig; /*!< Specifies the DMA channel data handling channel configuration */ 141 142 DMA_TriggerConfTypeDef TriggerConfig; /*!< Specifies the DMA channel trigger configuration */ 143 144 DMA_RepeatBlockConfTypeDef RepeatBlockConfig; /*!< Specifies the DMA channel repeated block configuration */ 145 146 uint32_t SrcAddress; /*!< Specifies the source memory address */ 147 uint32_t DstAddress; /*!< Specifies the destination memory address */ 148 uint32_t DataSize; /*!< Specifies the source data size in bytes */ 149 150 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) 151 uint32_t SrcSecure; /*!< Specifies the source security attribute */ 152 uint32_t DestSecure; /*!< Specifies the destination security attribute */ 153 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ 154 155 } DMA_NodeConfTypeDef; 156 157 /** 158 * @brief DMAEx Linked-List Node Structure Definition. 159 */ 160 typedef struct 161 { 162 uint32_t LinkRegisters[8U]; /*!< Physical Node register description */ 163 uint32_t NodeInfo; /*!< Node information */ 164 165 } DMA_NodeTypeDef; 166 167 /** 168 * @brief DMAEx Linked-List Queue Structure Definition. 169 */ 170 typedef struct __DMA_QListTypeDef 171 { 172 DMA_NodeTypeDef *Head; /*!< Specifies the queue head node */ 173 174 DMA_NodeTypeDef *FirstCircularNode; /*!< Specifies the queue first circular node */ 175 176 uint32_t NodeNumber; /*!< Specifies the queue node number */ 177 178 __IO HAL_DMA_QStateTypeDef State; /*!< Specifies the queue state */ 179 180 __IO uint32_t ErrorCode; /*!< Specifies the queue error code */ 181 182 __IO uint32_t Type; /*!< Specifies whether the queue is static or dynamic */ 183 184 } DMA_QListTypeDef; 185 /** 186 * @} 187 */ 188 189 /* Exported constants ------------------------------------------------------------------------------------------------*/ 190 /** @defgroup DMAEx_Exported_Constants DMAEx Exported Constants 191 * @brief DMAEx Exported Constants 192 * @{ 193 */ 194 195 /** @defgroup Queue_Error_Codes Queue Error Codes 196 * @brief Queue Error Codes 197 * @{ 198 */ 199 #define HAL_DMA_QUEUE_ERROR_NONE (0x00U) /*!< No error */ 200 #define HAL_DMA_QUEUE_ERROR_BUSY (0x01U) /*!< Error busy */ 201 #define HAL_DMA_QUEUE_ERROR_EMPTY (0x02U) /*!< Error unallowed operation for empty queue */ 202 #define HAL_DMA_QUEUE_ERROR_UNSUPPORTED (0x03U) /*!< Error unsupported feature */ 203 #define HAL_DMA_QUEUE_ERROR_INVALIDTYPE (0x04U) /*!< Error incompatible node type or circular initialization 204 and queue circular types are incompatible */ 205 #define HAL_DMA_QUEUE_ERROR_OUTOFRANGE (0x05U) /*!< Error out of range node memory */ 206 #define HAL_DMA_QUEUE_ERROR_NOTFOUND (0x06U) /*!< Error node not found in queue */ 207 /** 208 * @} 209 */ 210 211 /** @defgroup DMAEx_LinkedList_Mode DMAEx LinkedList Mode 212 * @brief DMAEx LinkedList Mode 213 * @{ 214 */ 215 #define DMA_LINKEDLIST_NORMAL DMA_LINKEDLIST /*!< Linear linked-list DMA channel transfer */ 216 #define DMA_LINKEDLIST_CIRCULAR (DMA_LINKEDLIST | (0x01U)) /*!< Circular linked-list DMA channel transfer */ 217 /** 218 * @} 219 */ 220 221 /** @defgroup DMAEx_Data_Alignment DMAEx Data Alignment 222 * @brief DMAEx Data Alignment 223 * @{ 224 */ 225 #define DMA_DATA_RIGHTALIGN_ZEROPADDED 0x00000000U /*!< If source data width < destination data width 226 => Right aligned padded with 0 up to destination data 227 width */ 228 #define DMA_DATA_RIGHTALIGN_LEFTTRUNC 0x00000000U /*!< If source data width > destination data width 229 => Right aligned left Truncated down to destination 230 data width */ 231 #define DMA_DATA_RIGHTALIGN_SIGNEXT DMA_CTR1_PAM_0 /*!< If source data width < destination data width 232 => Right Aligned padded with sign extended up to 233 destination data width */ 234 #define DMA_DATA_LEFTALIGN_RIGHTTRUNC DMA_CTR1_PAM_0 /*!< If source data width > destination data width 235 => Left Aligned Right Truncated down to the 236 destination data width */ 237 #define DMA_DATA_PACK DMA_CTR1_PAM_1 /*!< If source data width < destination data width 238 => Packed at the destination data width 239 (Not available on LPDMA) */ 240 #define DMA_DATA_UNPACK DMA_CTR1_PAM_1 /*!< If source data width > destination data width 241 => Unpacked at the destination data width 242 (Not available on LPDMA) */ 243 /** 244 * @} 245 */ 246 247 /** @defgroup DMAEx_Data_Exchange DMAEx Data Exchange 248 * @brief DMAEx Data Exchange 249 * @{ 250 */ 251 #define DMA_EXCHANGE_NONE 0x00000000U /*!< No data exchange */ 252 #define DMA_EXCHANGE_DEST_BYTE DMA_CTR1_DBX /*!< Destination Byte exchange when destination data width is > Byte */ 253 #define DMA_EXCHANGE_DEST_HALFWORD DMA_CTR1_DHX /*!< Destination Half-Word exchange when destination data width is > Half-Word */ 254 #define DMA_EXCHANGE_SRC_BYTE DMA_CTR1_SBX /*!< Source Byte endianness exchange when source data width is word */ 255 /** 256 * @} 257 */ 258 259 /** @defgroup DMAEx_Trigger_Polarity DMAEx Trigger Polarity 260 * @brief DMAEx Trigger Polarity 261 * @{ 262 */ 263 #define DMA_TRIG_POLARITY_MASKED 0x00000000U /*!< No trigger of the selected DMA request. Masked trigger event */ 264 #define DMA_TRIG_POLARITY_RISING DMA_CTR2_TRIGPOL_0 /*!< Trigger of the selected DMA request on the rising edge of the selected trigger event input */ 265 #define DMA_TRIG_POLARITY_FALLING DMA_CTR2_TRIGPOL_1 /*!< Trigger of the selected DMA request on the falling edge of the selected trigger event input */ 266 /** 267 * @} 268 */ 269 270 /** @defgroup DMAEx_Trigger_Mode DMAEx Trigger Mode 271 * @brief DMAEx Trigger Mode 272 * @{ 273 */ 274 #define DMA_TRIGM_BLOCK_TRANSFER 0x00000000U /*!< A block transfer is conditioned by (at least) one hit trigger */ 275 #define DMA_TRIGM_REPEATED_BLOCK_TRANSFER DMA_CTR2_TRIGM_0 /*!< A repeated block transfer is conditioned by (at least) one hit trigger */ 276 #define DMA_TRIGM_LLI_LINK_TRANSFER DMA_CTR2_TRIGM_1 /*!< A LLI link transfer is conditioned by (at least) one hit trigger */ 277 #define DMA_TRIGM_SINGLE_BURST_TRANSFER DMA_CTR2_TRIGM /*!< A single/burst transfer is conditioned by (at least) one hit trigger */ 278 /** 279 * @} 280 */ 281 282 /** @defgroup DMAEx_Trigger_Selection DMAEx Trigger Selection 283 * @brief DMAEx Trigger Selection 284 * @{ 285 */ 286 /* GPDMA1 triggers */ 287 #define GPDMA1_TRIGGER_EXTI_LINE0 0U /*!< GPDMA1 HW Trigger signal is EXTI_LINE0 */ 288 #define GPDMA1_TRIGGER_EXTI_LINE1 1U /*!< GPDMA1 HW Trigger signal is EXTI_LINE1 */ 289 #define GPDMA1_TRIGGER_EXTI_LINE2 2U /*!< GPDMA1 HW Trigger signal is EXTI_LINE2 */ 290 #define GPDMA1_TRIGGER_EXTI_LINE3 3U /*!< GPDMA1 HW Trigger signal is EXTI_LINE3 */ 291 #define GPDMA1_TRIGGER_EXTI_LINE4 4U /*!< GPDMA1 HW Trigger signal is EXTI_LINE4 */ 292 #define GPDMA1_TRIGGER_EXTI_LINE5 5U /*!< GPDMA1 HW Trigger signal is EXTI_LINE5 */ 293 #define GPDMA1_TRIGGER_EXTI_LINE6 6U /*!< GPDMA1 HW Trigger signal is EXTI_LINE6 */ 294 #define GPDMA1_TRIGGER_EXTI_LINE7 7U /*!< GPDMA1 HW Trigger signal is EXTI_LINE7 */ 295 #define GPDMA1_TRIGGER_TAMP_TRG1 8U /*!< GPDMA1 HW Trigger signal is TAMP_TRG1 */ 296 #define GPDMA1_TRIGGER_TAMP_TRG2 9U /*!< GPDMA1 HW Trigger signal is TAMP_TRG2 */ 297 #define GPDMA1_TRIGGER_TAMP_TRG3 10U /*!< GPDMA1 HW Trigger signal is TAMP_TRG3 */ 298 #define GPDMA1_TRIGGER_LPTIM1_CH1 11U /*!< GPDMA1 HW Trigger signal is LPTIM1_CH1 */ 299 #define GPDMA1_TRIGGER_LPTIM1_CH2 12U /*!< GPDMA1 HW Trigger signal is LPTIM1_CH2 */ 300 #define GPDMA1_TRIGGER_LPTIM2_CH1 13U /*!< GPDMA1 HW Trigger signal is LPTIM2_CH1 */ 301 #define GPDMA1_TRIGGER_LPTIM2_CH2 14U /*!< GPDMA1 HW Trigger signal is LPTIM2_CH2 */ 302 #define GPDMA1_TRIGGER_LPTIM4_OUT 15U /*!< GPDMA1 HW Trigger signal is LPTIM4_OUT */ 303 #define GPDMA1_TRIGGER_COMP1_OUT 16U /*!< GPDMA1 HW Trigger signal is COMP1_OUT */ 304 #if defined(COMP2) 305 #define GPDMA1_TRIGGER_COMP2_OUT 17U /*!< GPDMA1 HW Trigger signal is COMP2_OUT */ 306 #endif /* COMP2 */ 307 #define GPDMA1_TRIGGER_RTC_ALRA_TRG 18U /*!< GPDMA1 HW Trigger signal is RTC_ALRA_TRG */ 308 #define GPDMA1_TRIGGER_RTC_ALRB_TRG 19U /*!< GPDMA1 HW Trigger signal is RTC_ALRB_TRG */ 309 #define GPDMA1_TRIGGER_RTC_WUT_TRG 20U /*!< GPDMA1 HW Trigger signal is RTC_WUT_TRG */ 310 #define GPDMA1_TRIGGER_GPDMA1_CH0_TCF 22U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH0_TCF */ 311 #define GPDMA1_TRIGGER_GPDMA1_CH1_TCF 23U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH1_TCF */ 312 #define GPDMA1_TRIGGER_GPDMA1_CH2_TCF 24U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH2_TCF */ 313 #define GPDMA1_TRIGGER_GPDMA1_CH3_TCF 25U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH3_TCF */ 314 #define GPDMA1_TRIGGER_GPDMA1_CH4_TCF 26U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH4_TCF */ 315 #define GPDMA1_TRIGGER_GPDMA1_CH5_TCF 27U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH5_TCF */ 316 #define GPDMA1_TRIGGER_GPDMA1_CH6_TCF 28U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH6_TCF */ 317 #define GPDMA1_TRIGGER_GPDMA1_CH7_TCF 29U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH7_TCF */ 318 #define GPDMA1_TRIGGER_GPDMA1_CH8_TCF 30U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH8_TCF */ 319 #define GPDMA1_TRIGGER_GPDMA1_CH9_TCF 31U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH9_TCF */ 320 #define GPDMA1_TRIGGER_GPDMA1_CH10_TCF 32U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH10_TCF */ 321 #define GPDMA1_TRIGGER_GPDMA1_CH11_TCF 33U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH11_TCF */ 322 #define GPDMA1_TRIGGER_GPDMA1_CH12_TCF 34U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH12_TCF */ 323 #define GPDMA1_TRIGGER_GPDMA1_CH13_TCF 35U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH13_TCF */ 324 #define GPDMA1_TRIGGER_GPDMA1_CH14_TCF 36U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH14_TCF */ 325 #define GPDMA1_TRIGGER_GPDMA1_CH15_TCF 37U /*!< GPDMA1 HW Trigger signal is GPDMA1_CH15_TCF */ 326 #define GPDMA1_TRIGGER_LPDMA1_CH0_TCF 38U /*!< GPDMA1 HW Trigger signal is LPDMA1_CH0_TCF */ 327 #define GPDMA1_TRIGGER_LPDMA1_CH1_TCF 39U /*!< GPDMA1 HW Trigger signal is LPDMA1_CH1_TCF */ 328 #define GPDMA1_TRIGGER_LPDMA1_CH2_TCF 40U /*!< GPDMA1 HW Trigger signal is LPDMA1_CH2_TCF */ 329 #define GPDMA1_TRIGGER_LPDMA1_CH3_TCF 41U /*!< GPDMA1 HW Trigger signal is LPDMA1_CH3_TCF */ 330 #define GPDMA1_TRIGGER_TIM2_TRGO 42U /*!< GPDMA1 HW Trigger signal is TIM2_TRGO */ 331 #define GPDMA1_TRIGGER_TIM15_TRGO 43U /*!< GPDMA1 HW Trigger signal is TIM15_TRGO */ 332 #if defined (TIM3_TRGO_TRIGGER_SUPPORT) 333 #define GPDMA1_TRIGGER_TIM3_TRGO 44U /*!< GPDMA1 HW Trigger signal is TIM3_TRGO */ 334 #endif /* TIM3_TRGO_TRIGGER_SUPPORT */ 335 #if defined (TIM4_TRGO_TRIGGER_SUPPORT) 336 #define GPDMA1_TRIGGER_TIM4_TRGO 45U /*!< GPDMA1 HW Trigger signal is TIM4_TRGO */ 337 #endif /* TIM4_TRGO_TRIGGER_SUPPORT */ 338 #if defined (TIM5_TRGO_TRIGGER_SUPPORT) 339 #define GPDMA1_TRIGGER_TIM5_TRGO 46U /*!< GPDMA1 HW Trigger signal is TIM5_TRGO */ 340 #endif /* TIM5_TRGO_TRIGGER_SUPPORT */ 341 #if defined (LTDC) 342 #define GPDMA1_TRIGGER_LTDC_LI 47U /*!< GPDMA1 HW Trigger signal is LTDC_LI */ 343 #endif /* LTDC */ 344 #if defined (DSI) 345 #define GPDMA1_TRIGGER_DSI_TE 48U /*!< GPDMA1 HW Trigger signal is DSI_TE */ 346 #define GPDMA1_TRIGGER_DSI_ER 49U /*!< GPDMA1 HW Trigger signal is DSI_ER */ 347 #endif /* DSI */ 348 #if defined (DMA2D_TRIGGER_SUPPORT) 349 #define GPDMA1_TRIGGER_DMA2D_TC 50U /*!< GPDMA1 HW Trigger signal is DMA2D_TC */ 350 #define GPDMA1_TRIGGER_DMA2D_CTC 51U /*!< GPDMA1 HW Trigger signal is DMA2D_CTC */ 351 #define GPDMA1_TRIGGER_DMA2D_TW 52U /*!< GPDMA1 HW Trigger signal is DMA2D_TW */ 352 #endif /* DMA2D_TRIGGER_SUPPORT */ 353 #if defined (GPU2D) 354 #define GPDMA1_TRIGGER_GPU2D_FLAG0 53U /*!< GPDMA1 HW Trigger signal is GPU2D_FLAG0 */ 355 #define GPDMA1_TRIGGER_GPU2D_FLAG1 54U /*!< GPDMA1 HW Trigger signal is GPU2D_FLAG1 */ 356 #define GPDMA1_TRIGGER_GPU2D_FLAG2 55U /*!< GPDMA1 HW Trigger signal is GPU2D_FLAG2 */ 357 #define GPDMA1_TRIGGER_GPU2D_FLAG3 56U /*!< GPDMA1 HW Trigger signal is GPU2D_FLAG3 */ 358 #endif /* GPU2D */ 359 #define GPDMA1_TRIGGER_ADC4_AWD1 57U /*!< GPDMA1 HW Trigger signal is ADC4_AWD1 */ 360 #define GPDMA1_TRIGGER_ADC1_AWD1 58U /*!< GPDMA1 HW Trigger signal is ADC1_AWD1 */ 361 #if defined (GFXTIM) 362 #define GPDMA1_TRIGGER_GFXTIM_EVT3 59U /*!< GPDMA1 HW Trigger signal is GFXTIM_EVT3 */ 363 #define GPDMA1_TRIGGER_GFXTIM_EVT2 60U /*!< GPDMA1 HW Trigger signal is GFXTIM_EVT2 */ 364 #define GPDMA1_TRIGGER_GFXTIM_EVT1 61U /*!< GPDMA1 HW Trigger signal is GFXTIM_EVT1 */ 365 #define GPDMA1_TRIGGER_GFXTIM_EVT0 62U /*!< GPDMA1 HW Trigger signal is GFXTIM_EVT0 */ 366 #endif /* GFXTIM */ 367 #if defined (JPEG) 368 #define GPDMA1_TRIGGER_JPEG_EOC 63U /*!< GPDMA1 HW Trigger signal is JPEG_EOC */ 369 #define GPDMA1_TRIGGER_JPEG_IFNF 64U /*!< GPDMA1 HW Trigger signal is JPEG_IFNF */ 370 #define GPDMA1_TRIGGER_JPEG_IFT 65U /*!< GPDMA1 HW Trigger signal is JPEG_IFT */ 371 #define GPDMA1_TRIGGER_JPEG_OFNE 66U /*!< GPDMA1 HW Trigger signal is JPEG_OFNE */ 372 #define GPDMA1_TRIGGER_JPEG_OFT 67U /*!< GPDMA1 HW Trigger signal is JPEG_OFT */ 373 #endif /* JPEG */ 374 375 /* LPDMA1 triggers */ 376 #define LPDMA1_TRIGGER_EXTI_LINE0 0U /*!< LPDMA1 HW Trigger signal is EXTI_LINE0 */ 377 #define LPDMA1_TRIGGER_EXTI_LINE1 1U /*!< LPDMA1 HW Trigger signal is EXTI_LINE1 */ 378 #define LPDMA1_TRIGGER_EXTI_LINE2 2U /*!< LPDMA1 HW Trigger signal is EXTI_LINE2 */ 379 #define LPDMA1_TRIGGER_EXTI_LINE3 3U /*!< LPDMA1 HW Trigger signal is EXTI_LINE3 */ 380 #define LPDMA1_TRIGGER_EXTI_LINE4 4U /*!< LPDMA1 HW Trigger signal is EXTI_LINE4 */ 381 #define LPDMA1_TRIGGER_TAMP_TRG1 5U /*!< LPDMA1 HW Trigger signal is TAMP_TRG1 */ 382 #define LPDMA1_TRIGGER_TAMP_TRG2 6U /*!< LPDMA1 HW Trigger signal is TAMP_TRG2 */ 383 #define LPDMA1_TRIGGER_TAMP_TRG3 7U /*!< LPDMA1 HW Trigger signal is TAMP_TRG3 */ 384 #define LPDMA1_TRIGGER_LPTIM1_CH1 8U /*!< LPDMA1 HW Trigger signal is LPTIM1_CH1 */ 385 #define LPDMA1_TRIGGER_LPTIM1_CH2 9U /*!< LPDMA1 HW Trigger signal is LPTIM1_CH2 */ 386 #define LPDMA1_TRIGGER_LPTIM3_CH1 10U /*!< LPDMA1 HW Trigger signal is LPTIM3_CH1 */ 387 #define LPDMA1_TRIGGER_LPTIM4_OUT 11U /*!< LPDMA1 HW Trigger signal is LPTIM4_OUT */ 388 #define LPDMA1_TRIGGER_COMP1_OUT 12U /*!< LPDMA1 HW Trigger signal is COMP1_OUT */ 389 #if defined(COMP2) 390 #define LPDMA1_TRIGGER_COMP2_OUT 13U /*!< LPDMA1 HW Trigger signal is COMP2_OUT */ 391 #endif /* COMP2 */ 392 #define LPDMA1_TRIGGER_RTC_ALRA_TRG 14U /*!< LPDMA1 HW Trigger signal is RTC_ALRA_TRG */ 393 #define LPDMA1_TRIGGER_RTC_ALRB_TRG 15U /*!< LPDMA1 HW Trigger signal is RTC_ALRB_TRG */ 394 #define LPDMA1_TRIGGER_RTC_WUT_TRG 16U /*!< LPDMA1 HW Trigger signal is RTC_WUT_TRG */ 395 #define LPDMA1_TRIGGER_ADC4_AWD1 17U /*!< LPDMA1 HW Trigger signal is ADC4_AWD1 */ 396 #define LPDMA1_TRIGGER_LPDMA1_CH0_TCF 18U /*!< LPDMA1 HW Trigger signal is LPDMA1_CH0_TCF */ 397 #define LPDMA1_TRIGGER_LPDMA1_CH1_TCF 19U /*!< LPDMA1 HW Trigger signal is LPDMA1_CH1_TCF */ 398 #define LPDMA1_TRIGGER_LPDMA1_CH2_TCF 20U /*!< LPDMA1 HW Trigger signal is LPDMA1_CH2_TCF */ 399 #define LPDMA1_TRIGGER_LPDMA1_CH3_TCF 21U /*!< LPDMA1 HW Trigger signal is LPDMA1_CH3_TCF */ 400 #define LPDMA1_TRIGGER_GPDMA1_CH0_TCF 22U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH0_TCF */ 401 #define LPDMA1_TRIGGER_GPDMA1_CH1_TCF 23U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH1_TCF */ 402 #define LPDMA1_TRIGGER_GPDMA1_CH4_TCF 24U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH4_TCF */ 403 #define LPDMA1_TRIGGER_GPDMA1_CH5_TCF 25U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH5_TCF */ 404 #define LPDMA1_TRIGGER_GPDMA1_CH6_TCF 26U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH6_TCF */ 405 #define LPDMA1_TRIGGER_GPDMA1_CH7_TCF 27U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH7_TCF */ 406 #define LPDMA1_TRIGGER_GPDMA1_CH12_TCF 28U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH12_TCF */ 407 #define LPDMA1_TRIGGER_GPDMA1_CH13_TCF 29U /*!< LPDMA1 HW Trigger signal is GPDMA1_CH13_TCF */ 408 #define LPDMA1_TRIGGER_TIM2_TRGO 30U /*!< LPDMA1 HW Trigger signal is TIM2_TRGO */ 409 #define LPDMA1_TRIGGER_TIM15_TRGO 31U /*!< LPDMA1 HW Trigger signal is TIM15_TRGO */ 410 /** 411 * @} 412 */ 413 414 /** @defgroup DMAEx_Node_Type DMAEx Node Type 415 * @brief DMAEx Node Type 416 * @{ 417 */ 418 #define DMA_LPDMA_LINEAR_NODE (DMA_CHANNEL_TYPE_LPDMA | DMA_CHANNEL_TYPE_LINEAR_ADDR) /*!< Defines the LPDMA linear addressing node type */ 419 #define DMA_GPDMA_LINEAR_NODE (DMA_CHANNEL_TYPE_GPDMA | DMA_CHANNEL_TYPE_LINEAR_ADDR) /*!< Defines the GPDMA linear addressing node type */ 420 #define DMA_GPDMA_2D_NODE (DMA_CHANNEL_TYPE_GPDMA | DMA_CHANNEL_TYPE_2D_ADDR) /*!< Defines the GPDMA 2 dimension addressing node type */ 421 /** 422 * @} 423 */ 424 425 /** @defgroup DMAEx_Link_Allocated_Port DMAEx Linked-List Allocated Port 426 * @brief DMAEx Linked-List Allocated Port 427 * @{ 428 */ 429 #define DMA_LINK_ALLOCATED_PORT0 0x00000000U /*!< Link allocated port 0 */ 430 #define DMA_LINK_ALLOCATED_PORT1 DMA_CCR_LAP /*!< Link allocated port 1 */ 431 /** 432 * @} 433 */ 434 435 /** @defgroup DMAEx_Link_Step_Mode DMAEx Link Step Mode 436 * @brief DMAEx Link Step Mode 437 * @{ 438 */ 439 #define DMA_LSM_FULL_EXECUTION 0x00000000U /*!< Channel is executed for the full linked-list */ 440 #define DMA_LSM_1LINK_EXECUTION DMA_CCR_LSM /*!< Channel is executed once for the current LLI */ 441 /** 442 * @} 443 */ 444 445 /** 446 * @} 447 */ 448 449 /* Exported functions ------------------------------------------------------------------------------------------------*/ 450 /** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions 451 * @brief DMAEx Exported functions 452 * @{ 453 */ 454 455 /** @defgroup DMAEx_Exported_Functions_Group1 Linked-List Initialization and De-Initialization Functions 456 * @brief Linked-List Initialization and De-Initialization Functions 457 * @{ 458 */ 459 HAL_StatusTypeDef HAL_DMAEx_List_Init(DMA_HandleTypeDef *const hdma); 460 HAL_StatusTypeDef HAL_DMAEx_List_DeInit(DMA_HandleTypeDef *const hdma); 461 /** 462 * @} 463 */ 464 465 /** @defgroup DMAEx_Exported_Functions_Group2 Linked-List IO Operation Functions 466 * @brief Linked-List IO Operation Functions 467 * @{ 468 */ 469 HAL_StatusTypeDef HAL_DMAEx_List_Start(DMA_HandleTypeDef *const hdma); 470 HAL_StatusTypeDef HAL_DMAEx_List_Start_IT(DMA_HandleTypeDef *const hdma); 471 /** 472 * @} 473 */ 474 475 /** @defgroup DMAEx_Exported_Functions_Group3 Linked-List Management Functions 476 * @brief Linked-List Management Functions 477 * @{ 478 */ 479 HAL_StatusTypeDef HAL_DMAEx_List_BuildNode(DMA_NodeConfTypeDef const *const pNodeConfig, 480 DMA_NodeTypeDef *const pNode); 481 HAL_StatusTypeDef HAL_DMAEx_List_GetNodeConfig(DMA_NodeConfTypeDef *const pNodeConfig, 482 DMA_NodeTypeDef const *const pNode); 483 484 HAL_StatusTypeDef HAL_DMAEx_List_InsertNode(DMA_QListTypeDef *const pQList, 485 DMA_NodeTypeDef *const pPrevNode, 486 DMA_NodeTypeDef *const pNewNode); 487 HAL_StatusTypeDef HAL_DMAEx_List_InsertNode_Head(DMA_QListTypeDef *const pQList, 488 DMA_NodeTypeDef *const pNewNode); 489 HAL_StatusTypeDef HAL_DMAEx_List_InsertNode_Tail(DMA_QListTypeDef *const pQList, 490 DMA_NodeTypeDef *const pNewNode); 491 492 HAL_StatusTypeDef HAL_DMAEx_List_RemoveNode(DMA_QListTypeDef *const pQList, 493 DMA_NodeTypeDef *const pNode); 494 HAL_StatusTypeDef HAL_DMAEx_List_RemoveNode_Head(DMA_QListTypeDef *const pQList); 495 HAL_StatusTypeDef HAL_DMAEx_List_RemoveNode_Tail(DMA_QListTypeDef *const pQList); 496 497 HAL_StatusTypeDef HAL_DMAEx_List_ReplaceNode(DMA_QListTypeDef *const pQList, 498 DMA_NodeTypeDef *const pOldNode, 499 DMA_NodeTypeDef *const pNewNode); 500 HAL_StatusTypeDef HAL_DMAEx_List_ReplaceNode_Head(DMA_QListTypeDef *const pQList, 501 DMA_NodeTypeDef *const pNewNode); 502 HAL_StatusTypeDef HAL_DMAEx_List_ReplaceNode_Tail(DMA_QListTypeDef *const pQList, 503 DMA_NodeTypeDef *const pNewNode); 504 505 HAL_StatusTypeDef HAL_DMAEx_List_ResetQ(DMA_QListTypeDef *const pQList); 506 507 HAL_StatusTypeDef HAL_DMAEx_List_InsertQ(DMA_QListTypeDef *const pSrcQList, 508 DMA_NodeTypeDef const *const pPrevNode, 509 DMA_QListTypeDef *const pDestQList); 510 HAL_StatusTypeDef HAL_DMAEx_List_InsertQ_Head(DMA_QListTypeDef *const pSrcQList, 511 DMA_QListTypeDef *const pDestQList); 512 HAL_StatusTypeDef HAL_DMAEx_List_InsertQ_Tail(DMA_QListTypeDef *const pSrcQList, 513 DMA_QListTypeDef *const pDestQList); 514 515 HAL_StatusTypeDef HAL_DMAEx_List_SetCircularModeConfig(DMA_QListTypeDef *const pQList, 516 DMA_NodeTypeDef *const pFirstCircularNode); 517 HAL_StatusTypeDef HAL_DMAEx_List_SetCircularMode(DMA_QListTypeDef *const pQList); 518 HAL_StatusTypeDef HAL_DMAEx_List_ClearCircularMode(DMA_QListTypeDef *const pQList); 519 520 HAL_StatusTypeDef HAL_DMAEx_List_ConvertQToDynamic(DMA_QListTypeDef *const pQList); 521 HAL_StatusTypeDef HAL_DMAEx_List_ConvertQToStatic(DMA_QListTypeDef *const pQList); 522 523 HAL_StatusTypeDef HAL_DMAEx_List_LinkQ(DMA_HandleTypeDef *const hdma, 524 DMA_QListTypeDef *const pQList); 525 HAL_StatusTypeDef HAL_DMAEx_List_UnLinkQ(DMA_HandleTypeDef *const hdma); 526 /** 527 * @} 528 */ 529 530 /** @defgroup DMAEx_Exported_Functions_Group4 Data Handling, Repeated Block and Trigger Configuration Functions 531 * @brief Data Handling, Repeated Block and Trigger Configuration Functions 532 * @{ 533 */ 534 HAL_StatusTypeDef HAL_DMAEx_ConfigDataHandling(DMA_HandleTypeDef *const hdma, 535 DMA_DataHandlingConfTypeDef const *const pConfigDataHandling); 536 HAL_StatusTypeDef HAL_DMAEx_ConfigTrigger(DMA_HandleTypeDef *const hdma, 537 DMA_TriggerConfTypeDef const *const pConfigTrigger); 538 HAL_StatusTypeDef HAL_DMAEx_ConfigRepeatBlock(DMA_HandleTypeDef *const hdma, 539 DMA_RepeatBlockConfTypeDef const *const pConfigRepeatBlock); 540 /** 541 * @} 542 */ 543 544 /** @defgroup DMAEx_Exported_Functions_Group5 Suspend and Resume Operation Functions 545 * @brief Suspend and Resume Operation Functions 546 * @{ 547 */ 548 HAL_StatusTypeDef HAL_DMAEx_Suspend(DMA_HandleTypeDef *const hdma); 549 HAL_StatusTypeDef HAL_DMAEx_Suspend_IT(DMA_HandleTypeDef *const hdma); 550 HAL_StatusTypeDef HAL_DMAEx_Resume(DMA_HandleTypeDef *const hdma); 551 /** 552 * @} 553 */ 554 555 /** @defgroup DMAEx_Exported_Functions_Group6 FIFO Status Function 556 * @brief FIFO Status Function 557 * @{ 558 */ 559 uint32_t HAL_DMAEx_GetFifoLevel(DMA_HandleTypeDef const *const hdma); 560 /** 561 * @} 562 */ 563 564 /** 565 * @} 566 */ 567 568 /* Private types -----------------------------------------------------------------------------------------------------*/ 569 /** @defgroup DMAEx_Private_Types DMAEx Private Types 570 * @brief DMAEx Private Types 571 * @{ 572 */ 573 574 /** 575 * @brief DMA Node in Queue Information Structure Definition. 576 */ 577 typedef struct 578 { 579 uint32_t cllr_offset; /* CLLR register offset */ 580 581 uint32_t previousnode_addr; /* Previous node address */ 582 583 uint32_t currentnode_pos; /* Current node position */ 584 585 uint32_t currentnode_addr; /* Current node address */ 586 587 uint32_t nextnode_addr; /* Next node address */ 588 589 } DMA_NodeInQInfoTypeDef; 590 /** 591 * @} 592 */ 593 594 /* Private constants -------------------------------------------------------------------------------------------------*/ 595 /** @defgroup DMAEx_Private_Constants DMAEx Private Constants 596 * @brief DMAEx Private Constants 597 * @{ 598 */ 599 #define DMA_LINKEDLIST (0x0080U) /* DMA channel linked-list mode */ 600 601 #define DMA_CHANNEL_TYPE_LINEAR_ADDR (0x0001U) /* DMA channel linear addressing mode */ 602 #define DMA_CHANNEL_TYPE_2D_ADDR (0x0002U) /* DMA channel 2D addressing mode */ 603 #define DMA_CHANNEL_TYPE_LPDMA (0x0010U) /* LPDMA channel node */ 604 #define DMA_CHANNEL_TYPE_GPDMA (0x0020U) /* GPDMA channel node */ 605 606 #define NODE_TYPE_MASK (0x00FFU) /* DMA channel node type */ 607 #define NODE_CLLR_IDX (0x0700U) /* DMA channel node CLLR index mask */ 608 #define NODE_CLLR_IDX_POS (0x0008U) /* DMA channel node CLLR index position */ 609 610 #define NODE_MAXIMUM_SIZE (0x0008U) /* Amount of registers of the node */ 611 612 #define NODE_STATIC_FORMAT (0x0000U) /* DMA channel node static format */ 613 #define NODE_DYNAMIC_FORMAT (0x0001U) /* DMA channel node dynamic format */ 614 615 #define UPDATE_CLLR_POSITION (0x0000U) /* DMA channel update CLLR position */ 616 #define UPDATE_CLLR_VALUE (0x0001U) /* DMA channel update CLLR value */ 617 618 #define LASTNODE_ISNOT_CIRCULAR (0x0000U) /* Last node is not first circular node */ 619 #define LASTNODE_IS_CIRCULAR (0x0001U) /* Last node is first circular node */ 620 621 #define QUEUE_TYPE_STATIC (0x0000U) /* DMA channel static queue */ 622 #define QUEUE_TYPE_DYNAMIC (0x0001U) /* DMA channel dynamic queue */ 623 624 #define NODE_CTR1_DEFAULT_OFFSET (0x0000U) /* CTR1 default offset */ 625 #define NODE_CTR2_DEFAULT_OFFSET (0x0001U) /* CTR2 default offset */ 626 #define NODE_CBR1_DEFAULT_OFFSET (0x0002U) /* CBR1 default offset */ 627 #define NODE_CSAR_DEFAULT_OFFSET (0x0003U) /* CSAR default offset */ 628 #define NODE_CDAR_DEFAULT_OFFSET (0x0004U) /* CDAR default offset */ 629 #define NODE_CTR3_DEFAULT_OFFSET (0x0005U) /* CTR3 2D addressing default offset */ 630 #define NODE_CBR2_DEFAULT_OFFSET (0x0006U) /* CBR2 2D addressing default offset */ 631 #define NODE_CLLR_2D_DEFAULT_OFFSET (0x0007U) /* CLLR 2D addressing default offset */ 632 #define NODE_CLLR_LINEAR_DEFAULT_OFFSET (0x0005U) /* CLLR linear addressing default offset */ 633 634 #define DMA_BURST_ADDR_OFFSET_MIN (-8192L) /* DMA burst minimum address offset */ 635 #define DMA_BURST_ADDR_OFFSET_MAX (8192L) /* DMA burst maximum address offset */ 636 #define DMA_BLOCK_ADDR_OFFSET_MIN (-65536L) /* DMA block minimum address offset */ 637 #define DMA_BLOCK_ADDR_OFFSET_MAX (65536L) /* DMA block maximum address offset */ 638 /** 639 * @} 640 */ 641 642 /* Private macros ----------------------------------------------------------------------------------------------------*/ 643 /** @defgroup DMAEx_Private_Macros DMAEx Private Macros 644 * @brief DMAEx Private Macros 645 * @{ 646 */ 647 #define IS_DMA_DATA_ALIGNMENT(ALIGNMENT) \ 648 (((ALIGNMENT) == DMA_DATA_RIGHTALIGN_ZEROPADDED) || \ 649 ((ALIGNMENT) == DMA_DATA_RIGHTALIGN_SIGNEXT) || \ 650 ((ALIGNMENT) == DMA_DATA_PACK)) 651 652 #define IS_DMA_DATA_EXCHANGE(EXCHANGE) \ 653 (((EXCHANGE) & (~(DMA_EXCHANGE_SRC_BYTE | DMA_EXCHANGE_DEST_BYTE | DMA_EXCHANGE_DEST_HALFWORD))) == 0U) 654 655 #define IS_DMA_REPEAT_COUNT(COUNT) \ 656 (((COUNT) > 0U) && ((COUNT) <= (DMA_CBR1_BRC >> DMA_CBR1_BRC_Pos))) 657 658 #define IS_DMA_BURST_ADDR_OFFSET(BURST_ADDR_OFFSET) \ 659 (((BURST_ADDR_OFFSET) > DMA_BURST_ADDR_OFFSET_MIN) && \ 660 ((BURST_ADDR_OFFSET) < DMA_BURST_ADDR_OFFSET_MAX)) 661 662 #define IS_DMA_BLOCK_ADDR_OFFSET(BLOCK_ADDR_OFFSET) \ 663 (((BLOCK_ADDR_OFFSET) > DMA_BLOCK_ADDR_OFFSET_MIN) && \ 664 ((BLOCK_ADDR_OFFSET) < DMA_BLOCK_ADDR_OFFSET_MAX)) 665 666 #define IS_DMA_LINK_ALLOCATED_PORT(LINK_ALLOCATED_PORT) \ 667 (((LINK_ALLOCATED_PORT) & (~(DMA_CCR_LAP))) == 0U) 668 669 #define IS_DMA_LINK_STEP_MODE(MODE) \ 670 (((MODE) == DMA_LSM_FULL_EXECUTION) || \ 671 ((MODE) == DMA_LSM_1LINK_EXECUTION)) 672 673 #define IS_DMA_TRIGGER_MODE(MODE) \ 674 (((MODE) == DMA_TRIGM_BLOCK_TRANSFER) || \ 675 ((MODE) == DMA_TRIGM_REPEATED_BLOCK_TRANSFER) || \ 676 ((MODE) == DMA_TRIGM_LLI_LINK_TRANSFER) || \ 677 ((MODE) == DMA_TRIGM_SINGLE_BURST_TRANSFER)) 678 679 #define IS_DMA_TCEM_LINKEDLIST_EVENT_MODE(MODE) \ 680 (((MODE) == DMA_TCEM_BLOCK_TRANSFER) || \ 681 ((MODE) == DMA_TCEM_REPEATED_BLOCK_TRANSFER) || \ 682 ((MODE) == DMA_TCEM_EACH_LL_ITEM_TRANSFER) || \ 683 ((MODE) == DMA_TCEM_LAST_LL_ITEM_TRANSFER)) 684 685 #define IS_DMA_LINKEDLIST_MODE(MODE) \ 686 (((MODE) == DMA_LINKEDLIST_NORMAL) || \ 687 ((MODE) == DMA_LINKEDLIST_CIRCULAR)) 688 689 #define IS_DMA_TRIGGER_POLARITY(POLARITY) \ 690 (((POLARITY) == DMA_TRIG_POLARITY_MASKED) || \ 691 ((POLARITY) == DMA_TRIG_POLARITY_RISING) || \ 692 ((POLARITY) == DMA_TRIG_POLARITY_FALLING)) 693 694 #if defined (GPDMA1_TRIGGER_JPEG_OFT) 695 #define IS_DMA_TRIGGER_SELECTION(TRIGGER) ((TRIGGER) <= GPDMA1_TRIGGER_JPEG_OFT) 696 #else 697 #define IS_DMA_TRIGGER_SELECTION(TRIGGER) ((TRIGGER) <= GPDMA1_TRIGGER_ADC1_AWD1) 698 #endif /* GPDMA1_TRIGGER_JPEG_OFT */ 699 700 #define IS_DMA_NODE_TYPE(TYPE) \ 701 (((TYPE) == DMA_LPDMA_LINEAR_NODE) || \ 702 ((TYPE) == DMA_GPDMA_LINEAR_NODE) || \ 703 ((TYPE) == DMA_GPDMA_2D_NODE)) 704 /** 705 * @} 706 */ 707 708 709 /* Private functions -------------------------------------------------------------------------------------------------*/ 710 /** @defgroup DMAEx_Private_Functions DMAEx Private Functions 711 * @brief DMAEx Private Functions 712 * @{ 713 */ 714 715 /** 716 * @} 717 */ 718 719 /** 720 * @} 721 */ 722 723 /** 724 * @} 725 */ 726 727 /** 728 * @} 729 */ 730 731 #ifdef __cplusplus 732 } 733 #endif /* __cplusplus */ 734 735 #endif /* STM32U5xx_HAL_DMA_EX_H */ 736