1 /**
2 *******************************************************************************************************
3 * @file fm33lc0xx_fl_dma.c
4 * @author FMSH Application Team
5 * @brief Src file of DMA FL Module
6 *******************************************************************************************************
7 * @attention
8 *
9 * Copyright (c) [2021] [Fudan Microelectronics]
10 * THIS SOFTWARE is licensed under Mulan PSL v2.
11 * You can use this software according to the terms and conditions of the Mulan PSL v2.
12 * You may obtain a copy of Mulan PSL v2 at:
13 * http://license.coscl.org.cn/MulanPSL2
14 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
15 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
16 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
17 * See the Mulan PSL v2 for more details.
18 *
19 *******************************************************************************************************
20 */
21
22
23 /* Includes ------------------------------------------------------------------*/
24 #include "fm33lc0xx_fl.h"
25
26 /** @addtogroup FM33LC0XX_FL_Driver
27 * @{
28 */
29
30 /** @addtogroup DMA
31 * @{
32 */
33
34 #ifdef FL_DMA_DRIVER_ENABLED
35
36 /* Private macros ------------------------------------------------------------*/
37 /** @addtogroup DMA_FL_Private_Macros
38 * @{
39 */
40
41 #define IS_FL_DMA_INSTANCE(INTANCE) ((INTANCE) == DMA)
42
43 #define IS_FL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == FL_DMA_PRIORITY_LOW)||\
44 ((__VALUE__) == FL_DMA_PRIORITY_MEDIUM)||\
45 ((__VALUE__) == FL_DMA_PRIORITY_HIGH)||\
46 ((__VALUE__) == FL_DMA_PRIORITY_VERYHIGH))
47
48 #define IS_FL_DMA_CIRC_MODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
49 ((__VALUE__) == FL_ENABLE))
50
51
52 #define IS_FL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == FL_DMA_DIR_PERIPHERAL_TO_RAM)||\
53 ((__VALUE__) == FL_DMA_DIR_RAM_TO_PERIPHERAL)||\
54 ((__VALUE__) == FL_DMA_DIR_FLASH_TO_RAM)||\
55 ((__VALUE__) == FL_DMA_DIR_RAM_TO_FLASH))
56
57
58 #define IS_FL_DMA_DATA_SIZE(__VALUE__) (((__VALUE__) == FL_DMA_BANDWIDTH_8B)||\
59 ((__VALUE__) == FL_DMA_BANDWIDTH_32B)||\
60 ((__VALUE__) == FL_DMA_BANDWIDTH_16B))
61
62 #define IS_FL_DMA_INCMODE(__VALUE__) (((__VALUE__) == FL_DMA_MEMORY_INC_MODE_INCREASE)||\
63 ((__VALUE__) == FL_DMA_MEMORY_INC_MODE_DECREASE) ||\
64 ((__VALUE__) == FL_DMA_CH7_MEMORY_INC_MODE_INCREASE)||\
65 ((__VALUE__) == FL_DMA_CH7_MEMORY_INC_MODE_DECREASE)||\
66 ((__VALUE__) == FL_DMA_CH7_FLASH_INC_MODE_INCREASE)||\
67 ((__VALUE__) == FL_DMA_CH7_FLASH_INC_MODE_DECREASE))
68
69 #define IS_FL_DMA_PERIPH(__VALUE__) (((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION1)||\
70 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION2)||\
71 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION3)||\
72 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION4)||\
73 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION5)||\
74 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION6)||\
75 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION7)||\
76 ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION8))
77 /**
78 * @}
79 */
80
81 /** @addtogroup DMA_FL_EF_Init
82 * @{
83 */
84
85 /**
86 * @brief 复位DMA相关寄存器
87 * @param DMAx 外设入口地址
88 * @retval 错误状态,可能值
89 * -FL_PASS 外设寄存器值恢复复位值
90 * -FL_FAIL 未成功执行
91 */
FL_DMA_DeInit(DMA_Type * DMAx)92 FL_ErrorStatus FL_DMA_DeInit(DMA_Type *DMAx)
93 {
94 assert_param(IS_FL_DMA_INSTANCE(DMAx));
95 /* 使能外设复位 */
96 FL_RCC_EnablePeripheralReset();
97 /* 复位外设寄存器 */
98 FL_RCC_EnableResetAHBPeripheral(FL_RCC_RSTAHB_DMA);
99 FL_RCC_DisableResetAHBPeripheral(FL_RCC_RSTAHB_DMA);
100 /* 关闭外设总线始时钟和工作时钟 */
101 FL_RCC_DisableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_DMA);
102 /* 锁定外设复位 */
103 FL_RCC_DisablePeripheralReset();
104 return FL_PASS;
105 }
106
107 /**
108 * @brief 根据 initStruct 的配置信息初始化对应外设入口地址的寄存器值.
109 * @param DMAx 外设入口地址
110 * @param initStruct 指向一个 @ref FL_DMA_InitTypeDef 结构体
111 * 其中包含了外设的相关配置信息.
112 * @param Channel 此参数可取以下值:
113 * @arg @ref FL_DMA_CHANNEL_0
114 * @arg @ref FL_DMA_CHANNEL_1
115 * @arg @ref FL_DMA_CHANNEL_2
116 * @arg @ref FL_DMA_CHANNEL_3
117 * @arg @ref FL_DMA_CHANNEL_4
118 * @arg @ref FL_DMA_CHANNEL_5
119 * @arg @ref FL_DMA_CHANNEL_6
120 * @arg @ref FL_DMA_CHANNEL_7
121 * @retval 错误状态,可能值:
122 * -FL_FAIL 配置过程发生错误
123 * -FL_PASS 配置成功
124 */
FL_DMA_Init(DMA_Type * DMAx,FL_DMA_InitTypeDef * initStruct,uint32_t channel)125 FL_ErrorStatus FL_DMA_Init(DMA_Type *DMAx, FL_DMA_InitTypeDef *initStruct, uint32_t channel)
126 {
127 /* 参数检查 */
128 assert_param(IS_FL_DMA_INSTANCE(DMAx));
129 assert_param(IS_FL_DMA_PRIORITY(initStruct->priority));
130 assert_param(IS_FL_DMA_CIRC_MODE(initStruct->circMode));
131 assert_param(IS_FL_DMA_DIRECTION(initStruct->direction));
132 assert_param(IS_FL_DMA_DATA_SIZE(initStruct->dataSize));
133 assert_param(IS_FL_DMA_INCMODE(initStruct->memoryAddressIncMode));
134 /* 开启时钟 */
135 FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_DMA);
136 /* 配置通道优先级 */
137 FL_DMA_SetPriority(DMAx, initStruct->priority, channel);
138 /* RAM地址方向 */
139 FL_DMA_SetMemoryIncrementMode(DMAx, initStruct->memoryAddressIncMode, channel);
140 /* 传输方向 */
141 FL_DMA_SetTransmissionDirection(DMAx, initStruct->direction, channel);
142 /* 数据宽度 */
143 FL_DMA_SetBandwidth(DMAx, initStruct->dataSize, channel);
144 /* 循环模式 */
145 if(initStruct->circMode == FL_ENABLE)
146 {
147 FL_DMA_EnableCircularMode(DMAx, channel);
148 if(channel == FL_DMA_CHANNEL_7)
149 {
150 return FL_FAIL;
151 }
152 }
153 else
154 {
155 FL_DMA_DisableCircularMode(DMAx, channel);
156 }
157 /* 如果是通道7 外设地址实际就是FLASH地址,因此这里针对通道7做了单独处理 */
158 if(channel != FL_DMA_CHANNEL_7)
159 {
160 assert_param(IS_FL_DMA_PERIPH(initStruct->periphAddress));
161 FL_DMA_SetPeripheralMap(DMAx, initStruct->periphAddress, channel);
162 }
163 else
164 {
165 /* Flash地址方向 */
166 FL_DMA_SetFlashIncrementMode(DMAx, initStruct->flashAddressIncMode);
167 }
168 return FL_PASS;
169 }
170
171 /**
172 * @brief 将 @ref FL_DMA_InitTypeDef 结构体初始化为默认配置
173 * @param initStruct 指向需要将值设置为默认配置的结构体 @ref FL_DMA_InitTypeDef 结构体
174 *
175 * @retval None
176 */
FL_DMA_StructInit(FL_DMA_InitTypeDef * initStruct)177 void FL_DMA_StructInit(FL_DMA_InitTypeDef *initStruct)
178 {
179 initStruct->circMode = FL_DISABLE;
180 initStruct->dataSize = FL_DMA_BANDWIDTH_8B;
181 initStruct->direction = FL_DMA_DIR_PERIPHERAL_TO_RAM;
182 initStruct->periphAddress = FL_DMA_PERIPHERAL_FUNCTION1;
183 initStruct->priority = FL_DMA_PRIORITY_LOW;
184 initStruct->memoryAddressIncMode = FL_DMA_MEMORY_INC_MODE_INCREASE;
185 }
186
187 /**
188 *@}
189 */
190
191 /** @addtogroup DMA_FL_EF_Operation
192 * @{
193 */
194
195 /**
196 * @brief 启动一次DMA传输.
197 * @param DMAx 外设入口地址
198 * @param configStruct 指向一个 @ref FL_DMA_ConfigTypeDef 结构体
199 * 其中包含了外设的相关配置信息.
200 * @param channel 此参数可取以下值:
201 * @arg @ref FL_DMA_CHANNEL_0
202 * @arg @ref FL_DMA_CHANNEL_1
203 * @arg @ref FL_DMA_CHANNEL_2
204 * @arg @ref FL_DMA_CHANNEL_3
205 * @arg @ref FL_DMA_CHANNEL_4
206 * @arg @ref FL_DMA_CHANNEL_5
207 * @arg @ref FL_DMA_CHANNEL_6
208 * @arg @ref FL_DMA_CHANNEL_7
209 * @retval 错误状态,可能值:
210 * -FL_FAIL 配置过程发生错误可能是超时也可能是地址非法
211 * -FL_PASS 配置成功
212 */
FL_DMA_StartTransmission(DMA_Type * DMAx,FL_DMA_ConfigTypeDef * configStruct,uint32_t channel)213 FL_ErrorStatus FL_DMA_StartTransmission(DMA_Type *DMAx, FL_DMA_ConfigTypeDef *configStruct, uint32_t channel)
214 {
215 /* 配置传输个数 */
216 FL_DMA_WriteTransmissionSize(DMAx, configStruct->transmissionCount, channel);
217 /* 配置Memory地址 */
218 FL_DMA_WriteMemoryAddress(DMAx, configStruct->memoryAddress, channel);
219 /* 清除DMA通道中断标志位 */
220 FL_DMA_ClearFlag_TransferHalfComplete(DMAx, channel);
221 FL_DMA_ClearFlag_TransferComplete(DMAx, channel);
222 /* 使能DMA通道使能开关 */
223 FL_DMA_EnableChannel(DMAx, channel);
224 return FL_PASS;
225 }
226
227 /**
228 * @}
229 */
230
231 #endif /* FL_DMA_DRIVER_ENABLED */
232
233 /**
234 * @}
235 */
236
237 /**
238 * @}
239 */
240
241
242 /********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/
243