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