|
STM32G474xx HAL 用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_ll_dma.c 00004 * @author MCD Application Team 00005 * @brief DMA LL 模块驱动。 00006 ****************************************************************************** 00007 * @attention 00008 * 00009 * Copyright (c) 2019 STMicroelectronics. 00010 * All rights reserved. 00011 * 00012 * This software is licensed under terms that can be found in the LICENSE file 00013 * in the root directory of this software component. 00014 * If no LICENSE file comes with this software, it is provided AS-IS. 00015 * 00016 ****************************************************************************** 00017 */ 00018 00019 #if defined(USE_FULL_LL_DRIVER) 00020 00021 /* Includes ------------------------------------------------------------------*/ 00022 #include "stm32g4xx_ll_dma.h" 00023 #include "stm32g4xx_ll_bus.h" 00024 #ifdef USE_FULL_ASSERT 00025 #include "stm32_assert.h" 00026 #else 00027 #define assert_param(expr) ((void)0U) 00028 #endif /* USE_FULL_ASSERT */ 00029 00030 /** @addtogroup STM32G4xx_LL_Driver 00031 * @{ 00032 */ 00033 00034 #if defined (DMA1) || defined (DMA2) 00035 00036 /** @defgroup DMA_LL DMA 00037 * @{ 00038 */ 00039 00040 /* Private types -------------------------------------------------------------*/ 00041 /* Private variables ---------------------------------------------------------*/ 00042 /* Private constants ---------------------------------------------------------*/ 00043 /* Private macros ------------------------------------------------------------*/ 00044 /** @addtogroup DMA_LL_Private_Macros 00045 * @{ 00046 */ 00047 #define IS_LL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \ 00048 ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) || \ 00049 ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY)) 00050 00051 #define IS_LL_DMA_MODE(__VALUE__) (((__VALUE__) == LL_DMA_MODE_NORMAL) || \ 00052 ((__VALUE__) == LL_DMA_MODE_CIRCULAR)) 00053 00054 #define IS_LL_DMA_PERIPHINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_PERIPH_INCREMENT) || \ 00055 ((__VALUE__) == LL_DMA_PERIPH_NOINCREMENT)) 00056 00057 #define IS_LL_DMA_MEMORYINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_MEMORY_INCREMENT) || \ 00058 ((__VALUE__) == LL_DMA_MEMORY_NOINCREMENT)) 00059 00060 #define IS_LL_DMA_PERIPHDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_PDATAALIGN_BYTE) || \ 00061 ((__VALUE__) == LL_DMA_PDATAALIGN_HALFWORD) || \ 00062 ((__VALUE__) == LL_DMA_PDATAALIGN_WORD)) 00063 00064 #define IS_LL_DMA_MEMORYDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_MDATAALIGN_BYTE) || \ 00065 ((__VALUE__) == LL_DMA_MDATAALIGN_HALFWORD) || \ 00066 ((__VALUE__) == LL_DMA_MDATAALIGN_WORD)) 00067 00068 #define IS_LL_DMA_NBDATA(__VALUE__) ((__VALUE__) <= (uint32_t)0x0000FFFFU) 00069 00070 #define IS_LL_DMA_PERIPHREQUEST(__VALUE__) ((__VALUE__) <= 115U) 00071 00072 #define IS_LL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == LL_DMA_PRIORITY_LOW) || \ 00073 ((__VALUE__) == LL_DMA_PRIORITY_MEDIUM) || \ 00074 ((__VALUE__) == LL_DMA_PRIORITY_HIGH) || \ 00075 ((__VALUE__) == LL_DMA_PRIORITY_VERYHIGH)) 00076 00077 #if defined (DMA1_Channel8) 00078 #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL) ((((INSTANCE) == DMA1) && \ 00079 (((CHANNEL) == LL_DMA_CHANNEL_1) || \ 00080 ((CHANNEL) == LL_DMA_CHANNEL_2) || \ 00081 ((CHANNEL) == LL_DMA_CHANNEL_3) || \ 00082 ((CHANNEL) == LL_DMA_CHANNEL_4) || \ 00083 ((CHANNEL) == LL_DMA_CHANNEL_5) || \ 00084 ((CHANNEL) == LL_DMA_CHANNEL_6) || \ 00085 ((CHANNEL) == LL_DMA_CHANNEL_7) || \ 00086 ((CHANNEL) == LL_DMA_CHANNEL_8))) || \ 00087 (((INSTANCE) == DMA2) && \ 00088 (((CHANNEL) == LL_DMA_CHANNEL_1) || \ 00089 ((CHANNEL) == LL_DMA_CHANNEL_2) || \ 00090 ((CHANNEL) == LL_DMA_CHANNEL_3) || \ 00091 ((CHANNEL) == LL_DMA_CHANNEL_4) || \ 00092 ((CHANNEL) == LL_DMA_CHANNEL_5) || \ 00093 ((CHANNEL) == LL_DMA_CHANNEL_6) || \ 00094 ((CHANNEL) == LL_DMA_CHANNEL_7) || \ 00095 ((CHANNEL) == LL_DMA_CHANNEL_8)))) 00096 #elif defined (DMA1_Channel6) 00097 #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL) ((((INSTANCE) == DMA1) && \ 00098 (((CHANNEL) == LL_DMA_CHANNEL_1) || \ 00099 ((CHANNEL) == LL_DMA_CHANNEL_2) || \ 00100 ((CHANNEL) == LL_DMA_CHANNEL_3) || \ 00101 ((CHANNEL) == LL_DMA_CHANNEL_4) || \ 00102 ((CHANNEL) == LL_DMA_CHANNEL_5) || \ 00103 ((CHANNEL) == LL_DMA_CHANNEL_6))) || \ 00104 (((INSTANCE) == DMA2) && \ 00105 (((CHANNEL) == LL_DMA_CHANNEL_1) || \ 00106 ((CHANNEL) == LL_DMA_CHANNEL_2) || \ 00107 ((CHANNEL) == LL_DMA_CHANNEL_3) || \ 00108 ((CHANNEL) == LL_DMA_CHANNEL_4) || \ 00109 ((CHANNEL) == LL_DMA_CHANNEL_5) || \ 00110 ((CHANNEL) == LL_DMA_CHANNEL_6)))) 00111 #endif /* DMA1_Channel8 */ 00112 /** 00113 * @} 00114 */ 00115 00116 /* Private function prototypes -----------------------------------------------*/ 00117 00118 /* Exported functions --------------------------------------------------------*/ 00119 /** @addtogroup DMA_LL_Exported_Functions 00120 * @{ 00121 */ 00122 00123 /** @addtogroup DMA_LL_EF_Init 00124 * @{ 00125 */ 00126 00127 /** 00128 * @brief 将 DMA 寄存器反初始化为其默认复位值。 00129 * @param DMAx DMAx 实例 00130 * @param Channel 此参数可以是以下值之一: 00131 * @arg @ref LL_DMA_CHANNEL_1 00132 * @arg @ref LL_DMA_CHANNEL_2 00133 * @arg @ref LL_DMA_CHANNEL_3 00134 * @arg @ref LL_DMA_CHANNEL_4 00135 * @arg @ref LL_DMA_CHANNEL_5 00136 * @arg @ref LL_DMA_CHANNEL_6 00137 * @arg @ref LL_DMA_CHANNEL_7 (*) 00138 * @arg @ref LL_DMA_CHANNEL_8 (*) 00139 * @arg @ref LL_DMA_CHANNEL_ALL 00140 * (*) 并非所有 G4 设备都支持 00141 * @retval 一个 ErrorStatus 枚举值: 00142 * - SUCCESS:DMA 寄存器已反初始化 00143 * - ERROR:DMA 寄存器未反初始化 00144 */ 00145 uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel) 00146 { 00147 DMA_Channel_TypeDef *tmp; 00148 ErrorStatus status = SUCCESS; 00149 00150 /* 检查 DMA 实例 DMAx 和通道参数 */ 00151 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel) || (Channel == LL_DMA_CHANNEL_ALL)); 00152 00153 if (Channel == LL_DMA_CHANNEL_ALL) 00154 { 00155 if (DMAx == DMA1) 00156 { 00157 /* 强制复位 DMA 时钟 */ 00158 LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA1); 00159 00160 /* 释放 DMA 时钟复位 */ 00161 LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA1); 00162 } 00163 else if (DMAx == DMA2) 00164 { 00165 /* 强制复位 DMA 时钟 */ 00166 LL_AHB1_GRP1_ForceReset