fm33lc0xx_fl_dma.c 9.7 KB

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