gd32f10x_dma.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /**
  2. ******************************************************************************
  3. * @brief DMA functions of the firmware library.
  4. ******************************************************************************
  5. */
  6. /* Includes ------------------------------------------------------------------*/
  7. #include "gd32f10x_dma.h"
  8. #include "gd32f10x_rcc.h"
  9. /** @addtogroup GD32F10x_Firmware
  10. * @{
  11. */
  12. /** @defgroup DMA
  13. * @brief DMA driver modules
  14. * @{
  15. */
  16. /** @defgroup DMA_Private_Defines
  17. * @{
  18. */
  19. /* DMA Reset registers mask */
  20. #define DMA_REGISTERS_RESET ((uint32_t)0x00000000)
  21. /* DMA Channel config registers Masks */
  22. #define CTLR_CLEAR_MASK ((uint32_t)0xFFFF800F)
  23. /* DMA Reset registers mask */
  24. #define DMA_INT_RESET ((uint32_t)0x00000000)
  25. /* DMA2 FLAG mask */
  26. #define DMA2_FLAG_Mask ((uint32_t)0x10000000)
  27. /* DMA1 Channelx interrupt pending bit masks */
  28. #define DMA1_Channel1_INT_Mask ((uint32_t)(DMA_IFR_GIF1 | DMA_IFR_TCIF1 | DMA_IFR_HTIF1 | DMA_IFR_ERRIF1))
  29. #define DMA1_Channel2_INT_Mask ((uint32_t)(DMA_IFR_GIF2 | DMA_IFR_TCIF2 | DMA_IFR_HTIF2 | DMA_IFR_ERRIF2))
  30. #define DMA1_Channel3_INT_Mask ((uint32_t)(DMA_IFR_GIF3 | DMA_IFR_TCIF3 | DMA_IFR_HTIF3 | DMA_IFR_ERRIF3))
  31. #define DMA1_Channel4_INT_Mask ((uint32_t)(DMA_IFR_GIF4 | DMA_IFR_TCIF4 | DMA_IFR_HTIF4 | DMA_IFR_ERRIF4))
  32. #define DMA1_Channel5_INT_Mask ((uint32_t)(DMA_IFR_GIF5 | DMA_IFR_TCIF5 | DMA_IFR_HTIF5 | DMA_IFR_ERRIF5))
  33. #define DMA1_Channel6_INT_Mask ((uint32_t)(DMA_IFR_GIF6 | DMA_IFR_TCIF6 | DMA_IFR_HTIF6 | DMA_IFR_ERRIF6))
  34. #define DMA1_Channel7_INT_Mask ((uint32_t)(DMA_IFR_GIF7 | DMA_IFR_TCIF7 | DMA_IFR_HTIF7 | DMA_IFR_ERRIF7))
  35. /* DMA2 Channelx interrupt pending bit masks */
  36. #define DMA2_Channel1_INT_Mask ((uint32_t)(DMA_IFR_GIF1 | DMA_IFR_TCIF1 | DMA_IFR_HTIF1 | DMA_IFR_ERRIF1))
  37. #define DMA2_Channel2_INT_Mask ((uint32_t)(DMA_IFR_GIF2 | DMA_IFR_TCIF2 | DMA_IFR_HTIF2 | DMA_IFR_ERRIF2))
  38. #define DMA2_Channel3_INT_Mask ((uint32_t)(DMA_IFR_GIF3 | DMA_IFR_TCIF3 | DMA_IFR_HTIF3 | DMA_IFR_ERRIF3))
  39. #define DMA2_Channel4_INT_Mask ((uint32_t)(DMA_IFR_GIF4 | DMA_IFR_TCIF4 | DMA_IFR_HTIF4 | DMA_IFR_ERRIF4))
  40. #define DMA2_Channel5_INT_Mask ((uint32_t)(DMA_IFR_GIF5 | DMA_IFR_TCIF5 | DMA_IFR_HTIF5 | DMA_IFR_ERRIF5))
  41. /**
  42. * @}
  43. */
  44. /** @defgroup DMA_Private_Functions
  45. * @{
  46. */
  47. /**
  48. * @brief Deinitialize the DMAy Channelx registers
  49. * @param DMAy_Channelx: where y:[1,2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  50. * @retval None
  51. */
  52. void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx)
  53. {
  54. /* Disable the selected DMAy Channelx */
  55. DMAy_Channelx->CTLR &= (uint16_t)(~DMA_CTLR_CHEN);
  56. /* Reset DMAy Channelx control register */
  57. DMAy_Channelx->CTLR = DMA_REGISTERS_RESET;
  58. /* Reset DMAy Channelx remaining bytes register */
  59. DMAy_Channelx->RCNT = DMA_REGISTERS_RESET;
  60. /* Reset DMAy Channelx peripheral address register */
  61. DMAy_Channelx->PBAR = DMA_REGISTERS_RESET;
  62. /* Reset DMAy Channelx memory address register */
  63. DMAy_Channelx->MBAR = DMA_REGISTERS_RESET;
  64. if (DMAy_Channelx == DMA1_CHANNEL1) {
  65. /* Reset interrupt pending bits for DMA1 Channel1 */
  66. DMA1->ICR |= DMA1_Channel1_INT_Mask;
  67. } else if (DMAy_Channelx == DMA1_CHANNEL2) {
  68. /* Reset interrupt pending bits for DMA1 Channel2 */
  69. DMA1->ICR |= DMA1_Channel2_INT_Mask;
  70. } else if (DMAy_Channelx == DMA1_CHANNEL3) {
  71. /* Reset interrupt pending bits for DMA1 Channel3 */
  72. DMA1->ICR |= DMA1_Channel3_INT_Mask;
  73. } else if (DMAy_Channelx == DMA1_CHANNEL4) {
  74. /* Reset interrupt pending bits for DMA1 Channel4 */
  75. DMA1->ICR |= DMA1_Channel4_INT_Mask;
  76. } else if (DMAy_Channelx == DMA1_CHANNEL5) {
  77. /* Reset interrupt pending bits for DMA1 Channel5 */
  78. DMA1->ICR |= DMA1_Channel5_INT_Mask;
  79. } else if (DMAy_Channelx == DMA1_CHANNEL6) {
  80. /* Reset interrupt pending bits for DMA1 Channel6 */
  81. DMA1->ICR |= DMA1_Channel6_INT_Mask;
  82. } else if (DMAy_Channelx == DMA1_CHANNEL7) {
  83. /* Reset interrupt pending bits for DMA1 Channel7 */
  84. DMA1->ICR |= DMA1_Channel7_INT_Mask;
  85. } else if (DMAy_Channelx == DMA2_CHANNEL1) {
  86. /* Reset interrupt pending bits for DMA2 Channel1 */
  87. DMA2->ICR |= DMA2_Channel1_INT_Mask;
  88. } else if (DMAy_Channelx == DMA2_CHANNEL2) {
  89. /* Reset interrupt pending bits for DMA2 Channel2 */
  90. DMA2->ICR |= DMA2_Channel2_INT_Mask;
  91. } else if (DMAy_Channelx == DMA2_CHANNEL3) {
  92. /* Reset interrupt pending bits for DMA2 Channel3 */
  93. DMA2->ICR |= DMA2_Channel3_INT_Mask;
  94. } else if (DMAy_Channelx == DMA2_CHANNEL4) {
  95. /* Reset interrupt pending bits for DMA2 Channel4 */
  96. DMA2->ICR |= DMA2_Channel4_INT_Mask;
  97. } else {
  98. if (DMAy_Channelx == DMA2_CHANNEL5) {
  99. /* Reset interrupt pending bits for DMA2 Channel5 */
  100. DMA2->ICR |= DMA2_Channel5_INT_Mask;
  101. }
  102. }
  103. }
  104. /**
  105. * @brief Initialize the DMAy Channelx according to the DMA_InitParaStruct.
  106. * @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  107. * @param DMA_InitParaStruct: contain the configuration information for the specified DMA Channel.
  108. * @retval None
  109. */
  110. void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitPara *DMA_InitParaStruct)
  111. {
  112. uint32_t temp = 0;
  113. /* Get the DMAy_Channelx CCR value */
  114. temp = DMAy_Channelx->CTLR;
  115. /* Clear MEMTOMEM, PRIO, MSIZE, PSIZE, MNAGA, PNAGA, CIRC and DIR bits */
  116. temp &= CTLR_CLEAR_MASK;
  117. /* Configure DMAy Channelx: data transfer, data size, priority level and mode */
  118. /* Set MEMTOMEM, PRIO, MSIZE, PSIZE, MNAGA, PNAGA, CIRC and DIR bits according to DMA_InitParaStruct */
  119. temp |= DMA_InitParaStruct->DMA_DIR | DMA_InitParaStruct->DMA_Mode |
  120. DMA_InitParaStruct->DMA_PeripheralInc | DMA_InitParaStruct->DMA_MemoryInc |
  121. DMA_InitParaStruct->DMA_PeripheralDataSize | DMA_InitParaStruct->DMA_MemoryDataSize |
  122. DMA_InitParaStruct->DMA_Priority | DMA_InitParaStruct->DMA_MTOM;
  123. /* Write to DMAy Channelx CTLR */
  124. DMAy_Channelx->CTLR = temp;
  125. /* Write to DMAy Channelx RCNT */
  126. DMAy_Channelx->RCNT = DMA_InitParaStruct->DMA_BufferSize;
  127. /* Write to DMAy Channelx PBAR */
  128. DMAy_Channelx->PBAR = DMA_InitParaStruct->DMA_PeripheralBaseAddr;
  129. /* Write to DMAy Channelx MBAR */
  130. DMAy_Channelx->MBAR = DMA_InitParaStruct->DMA_MemoryBaseAddr;
  131. }
  132. /**
  133. * @brief Set each DMA_InitParaStruct member to its default value.
  134. * @param DMA_InitParaStruct: The structure pointer to DMA_InitParaStruct will be initialized.
  135. * @retval None
  136. */
  137. void DMA_ParaInit(DMA_InitPara *DMA_InitParaStruct)
  138. {
  139. /* Reset DMA init structure parameters values */
  140. DMA_InitParaStruct->DMA_PeripheralBaseAddr = DMA_INT_RESET;
  141. DMA_InitParaStruct->DMA_MemoryBaseAddr = DMA_INT_RESET;
  142. DMA_InitParaStruct->DMA_DIR = DMA_DIR_PERIPHERALSRC;
  143. DMA_InitParaStruct->DMA_BufferSize = DMA_INT_RESET;
  144. DMA_InitParaStruct->DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
  145. DMA_InitParaStruct->DMA_MemoryInc = DMA_MEMORYINC_DISABLE;
  146. DMA_InitParaStruct->DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_BYTE;
  147. DMA_InitParaStruct->DMA_MemoryDataSize = DMA_MEMORYDATASIZE_BYTE;
  148. DMA_InitParaStruct->DMA_Mode = DMA_MODE_NORMAL;
  149. DMA_InitParaStruct->DMA_Priority = DMA_PRIORITY_LOW;
  150. DMA_InitParaStruct->DMA_MTOM = DMA_MEMTOMEM_DISABLE;
  151. }
  152. /**
  153. * @brief Enable or disable the DMAy Channelx.
  154. * @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  155. * @param NewValue: new state of the DMAy Channelx.
  156. * This parameter can be: ENABLE or DISABLE.
  157. * @retval None
  158. */
  159. void DMA_Enable(DMA_Channel_TypeDef *DMAy_Channelx, TypeState NewValue)
  160. {
  161. if (NewValue != DISABLE) {
  162. /* Enable the DMAy Channelx */
  163. DMAy_Channelx->CTLR |= DMA_CTLR_CHEN;
  164. } else {
  165. /* Disable the DMAy Channelx */
  166. DMAy_Channelx->CTLR &= (uint16_t)(~DMA_CTLR_CHEN);
  167. }
  168. }
  169. /**
  170. * @brief Enable or disable the DMAy Channelx interrupts.
  171. * @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  172. * @param DMA_INT: specify the DMA interrupts sources to be enabled or disabled.
  173. * This parameter can be any combination of the following values:
  174. * @arg DMA_INT_TC: Transfer complete interrupt mask
  175. * @arg DMA_INT_HT: Half transfer interrupt mask
  176. * @arg DMA_INT_ERR: Transfer error interrupt mask
  177. * @param NewValue: new state of the DMA interrupts.
  178. * This parameter can be: ENABLE or DISABLE.
  179. * @retval None
  180. */
  181. void DMA_INTConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_INT, TypeState NewValue)
  182. {
  183. if (NewValue != DISABLE) {
  184. /* Enable the DMA interrupts */
  185. DMAy_Channelx->CTLR |= DMA_INT;
  186. } else {
  187. /* Disable the DMA interrupts */
  188. DMAy_Channelx->CTLR &= ~DMA_INT;
  189. }
  190. }
  191. /**
  192. * @brief Set the number of the remaining counter in the current DMAy Channelx transfer.
  193. * @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  194. * @param DataNumber: The number of the remaining counter in the current DMAy Channelx transfer.
  195. * @retval None.
  196. */
  197. void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber)
  198. {
  199. /* Write to DMAy Channelx RCNT */
  200. DMAy_Channelx->RCNT = DataNumber;
  201. }
  202. /**
  203. * @brief Return the number of remaining counter in the current DMAy Channelx transfer.
  204. * @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
  205. * @retval The number of remaining counter in the current DMAy Channelx transfer.
  206. */
  207. uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx)
  208. {
  209. /* Return the number of remaining counter for DMAy Channelx */
  210. return ((uint16_t)(DMAy_Channelx->RCNT));
  211. }
  212. /**
  213. * @brief Check whether the DMAy Channelx flag is set or not.
  214. * @param DMAy_FLAG: specifies the flag to check.
  215. * This parameter can be one of the following values:
  216. * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.
  217. * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
  218. * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
  219. * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
  220. * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.
  221. * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
  222. * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
  223. * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
  224. * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.
  225. * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
  226. * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
  227. * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
  228. * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.
  229. * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
  230. * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
  231. * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
  232. * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.
  233. * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
  234. * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
  235. * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
  236. * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.
  237. * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
  238. * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
  239. * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
  240. * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.
  241. * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
  242. * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
  243. * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
  244. * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.
  245. * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
  246. * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
  247. * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
  248. * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.
  249. * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
  250. * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
  251. * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
  252. * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.
  253. * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
  254. * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
  255. * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
  256. * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.
  257. * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
  258. * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
  259. * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
  260. * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.
  261. * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
  262. * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
  263. * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
  264. * @retval The new state of DMAy_FLAG (SET or RESET).
  265. */
  266. TypeState DMA_GetBitState(uint32_t DMAy_FLAG)
  267. {
  268. uint32_t temp = 0;
  269. /* Check the used DMAy */
  270. if ((DMAy_FLAG & DMA2_FLAG_Mask) != (uint32_t)RESET) {
  271. /* Get DMA2 ISR register value */
  272. temp = DMA2->IFR ;
  273. } else {
  274. /* Get DMA1 ISR register value */
  275. temp = DMA1->IFR ;
  276. }
  277. /* Check the status of the DMAy flag */
  278. if ((temp & DMAy_FLAG) != (uint32_t)RESET) {
  279. /* DMAy_FLAG is set */
  280. return SET;
  281. } else {
  282. /* DMAy_FLAG is reset */
  283. return RESET;
  284. }
  285. }
  286. /**
  287. * @brief Clear the DMAy Channelx's bit flags.
  288. * @param DMAy_FLAG: specifies the flag to clear.
  289. * This parameter can be any combination (for the same DMA) of the following values:
  290. * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.
  291. * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
  292. * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
  293. * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
  294. * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.
  295. * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
  296. * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
  297. * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
  298. * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.
  299. * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
  300. * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
  301. * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
  302. * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.
  303. * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
  304. * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
  305. * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
  306. * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.
  307. * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
  308. * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
  309. * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
  310. * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.
  311. * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
  312. * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
  313. * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
  314. * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.
  315. * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
  316. * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
  317. * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
  318. * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.
  319. * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
  320. * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
  321. * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
  322. * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.
  323. * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
  324. * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
  325. * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
  326. * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.
  327. * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
  328. * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
  329. * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
  330. * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.
  331. * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
  332. * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
  333. * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
  334. * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.
  335. * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
  336. * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
  337. * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
  338. * @retval None
  339. */
  340. void DMA_ClearBitState(uint32_t DMAy_FLAG)
  341. {
  342. /* Check the used DMAy */
  343. if ((DMAy_FLAG & DMA2_FLAG_Mask) != (uint32_t)RESET) {
  344. /* Clear the selected DMAy flags */
  345. DMA2->ICR = DMAy_FLAG;
  346. } else {
  347. /* Clear the selected DMAy flags */
  348. DMA1->ICR = DMAy_FLAG;
  349. }
  350. }
  351. /**
  352. * @brief Check whether the DMAy Channelx interrupt has occurred or not.
  353. * @param DMAy_INT: specify the DMAy interrupt source to check.
  354. * This parameter can be one of the following values:
  355. * @arg DMA1_INT_GL1: DMA1 Channel1 global interrupt.
  356. * @arg DMA1_INT_TC1: DMA1 Channel1 transfer complete interrupt.
  357. * @arg DMA1_INT_HT1: DMA1 Channel1 half transfer interrupt.
  358. * @arg DMA1_INT_TE1: DMA1 Channel1 transfer error interrupt.
  359. * @arg DMA1_INT_GL2: DMA1 Channel2 global interrupt.
  360. * @arg DMA1_INT_TC2: DMA1 Channel2 transfer complete interrupt.
  361. * @arg DMA1_INT_HT2: DMA1 Channel2 half transfer interrupt.
  362. * @arg DMA1_INT_TE2: DMA1 Channel2 transfer error interrupt.
  363. * @arg DMA1_INT_GL3: DMA1 Channel3 global interrupt.
  364. * @arg DMA1_INT_TC3: DMA1 Channel3 transfer complete interrupt.
  365. * @arg DMA1_INT_HT3: DMA1 Channel3 half transfer interrupt.
  366. * @arg DMA1_INT_TE3: DMA1 Channel3 transfer error interrupt.
  367. * @arg DMA1_INT_GL4: DMA1 Channel4 global interrupt.
  368. * @arg DMA1_INT_TC4: DMA1 Channel4 transfer complete interrupt.
  369. * @arg DMA1_INT_HT4: DMA1 Channel4 half transfer interrupt.
  370. * @arg DMA1_INT_TE4: DMA1 Channel4 transfer error interrupt.
  371. * @arg DMA1_INT_GL5: DMA1 Channel5 global interrupt.
  372. * @arg DMA1_INT_TC5: DMA1 Channel5 transfer complete interrupt.
  373. * @arg DMA1_INT_HT5: DMA1 Channel5 half transfer interrupt.
  374. * @arg DMA1_INT_TE5: DMA1 Channel5 transfer error interrupt.
  375. * @arg DMA1_INT_GL6: DMA1 Channel6 global interrupt.
  376. * @arg DMA1_INT_TC6: DMA1 Channel6 transfer complete interrupt.
  377. * @arg DMA1_INT_HT6: DMA1 Channel6 half transfer interrupt.
  378. * @arg DMA1_INT_TE6: DMA1 Channel6 transfer error interrupt.
  379. * @arg DMA1_INT_GL7: DMA1 Channel7 global interrupt.
  380. * @arg DMA1_INT_TC7: DMA1 Channel7 transfer complete interrupt.
  381. * @arg DMA1_INT_HT7: DMA1 Channel7 half transfer interrupt.
  382. * @arg DMA1_INT_TE7: DMA1 Channel7 transfer error interrupt.
  383. * @arg DMA2_INT_GL1: DMA2 Channel1 global interrupt.
  384. * @arg DMA2_INT_TC1: DMA2 Channel1 transfer complete interrupt.
  385. * @arg DMA2_INT_HT1: DMA2 Channel1 half transfer interrupt.
  386. * @arg DMA2_INT_TE1: DMA2 Channel1 transfer error interrupt.
  387. * @arg DMA2_INT_GL2: DMA2 Channel2 global interrupt.
  388. * @arg DMA2_INT_TC2: DMA2 Channel2 transfer complete interrupt.
  389. * @arg DMA2_INT_HT2: DMA2 Channel2 half transfer interrupt.
  390. * @arg DMA2_INT_TE2: DMA2 Channel2 transfer error interrupt.
  391. * @arg DMA2_INT_GL3: DMA2 Channel3 global interrupt.
  392. * @arg DMA2_INT_TC3: DMA2 Channel3 transfer complete interrupt.
  393. * @arg DMA2_INT_HT3: DMA2 Channel3 half transfer interrupt.
  394. * @arg DMA2_INT_TE3: DMA2 Channel3 transfer error interrupt.
  395. * @arg DMA2_INT_GL4: DMA2 Channel4 global interrupt.
  396. * @arg DMA2_INT_TC4: DMA2 Channel4 transfer complete interrupt.
  397. * @arg DMA2_INT_HT4: DMA2 Channel4 half transfer interrupt.
  398. * @arg DMA2_INT_TE4: DMA2 Channel4 transfer error interrupt.
  399. * @arg DMA2_INT_GL5: DMA2 Channel5 global interrupt.
  400. * @arg DMA2_INT_TC5: DMA2 Channel5 transfer complete interrupt.
  401. * @arg DMA2_INT_HT5: DMA2 Channel5 half transfer interrupt.
  402. * @arg DMA2_INT_TE5: DMA2 Channel5 transfer error interrupt.
  403. * @retval The new state of DMAy_IT (SET or RESET).
  404. */
  405. TypeState DMA_GetIntBitState(uint32_t DMAy_INT)
  406. {
  407. uint32_t temp = 0;
  408. /* Calculate the used DMA */
  409. if ((DMAy_INT & DMA2_FLAG_Mask) != (uint32_t)RESET) {
  410. /* Get DMA2 IFR register value */
  411. temp = DMA2->IFR;
  412. } else {
  413. /* Get DMA1 IFR register value */
  414. temp = DMA1->IFR;
  415. }
  416. /* Check the status of the DMAy interrupt */
  417. if ((temp & DMAy_INT) != (uint32_t)RESET) {
  418. /* DMA_INT is set */
  419. return SET;
  420. } else {
  421. /* DMA_INT is reset */
  422. return RESET;
  423. }
  424. }
  425. /**
  426. * @brief Clear the DMAy Channelx's interrupt bits.
  427. * @param DMAy_INT: specify the DMAy interrupt pending bit to clear.
  428. * This parameter can be any combination (for the same DMA) of the following values:
  429. * @arg DMA1_INT_GL1: DMA1 Channel1 global interrupt.
  430. * @arg DMA1_INT_TC1: DMA1 Channel1 transfer complete interrupt.
  431. * @arg DMA1_INT_HT1: DMA1 Channel1 half transfer interrupt.
  432. * @arg DMA1_INT_TE1: DMA1 Channel1 transfer error interrupt.
  433. * @arg DMA1_INT_GL2: DMA1 Channel2 global interrupt.
  434. * @arg DMA1_INT_TC2: DMA1 Channel2 transfer complete interrupt.
  435. * @arg DMA1_INT_HT2: DMA1 Channel2 half transfer interrupt.
  436. * @arg DMA1_INT_TE2: DMA1 Channel2 transfer error interrupt.
  437. * @arg DMA1_INT_GL3: DMA1 Channel3 global interrupt.
  438. * @arg DMA1_INT_TC3: DMA1 Channel3 transfer complete interrupt.
  439. * @arg DMA1_INT_HT3: DMA1 Channel3 half transfer interrupt.
  440. * @arg DMA1_INT_TE3: DMA1 Channel3 transfer error interrupt.
  441. * @arg DMA1_INT_GL4: DMA1 Channel4 global interrupt.
  442. * @arg DMA1_INT_TC4: DMA1 Channel4 transfer complete interrupt.
  443. * @arg DMA1_INT_HT4: DMA1 Channel4 half transfer interrupt.
  444. * @arg DMA1_INT_TE4: DMA1 Channel4 transfer error interrupt.
  445. * @arg DMA1_INT_GL5: DMA1 Channel5 global interrupt.
  446. * @arg DMA1_INT_TC5: DMA1 Channel5 transfer complete interrupt.
  447. * @arg DMA1_INT_HT5: DMA1 Channel5 half transfer interrupt.
  448. * @arg DMA1_INT_TE5: DMA1 Channel5 transfer error interrupt.
  449. * @arg DMA1_INT_GL6: DMA1 Channel6 global interrupt.
  450. * @arg DMA1_INT_TC6: DMA1 Channel6 transfer complete interrupt.
  451. * @arg DMA1_INT_HT6: DMA1 Channel6 half transfer interrupt.
  452. * @arg DMA1_INT_TE6: DMA1 Channel6 transfer error interrupt.
  453. * @arg DMA1_INT_GL7: DMA1 Channel7 global interrupt.
  454. * @arg DMA1_INT_TC7: DMA1 Channel7 transfer complete interrupt.
  455. * @arg DMA1_INT_HT7: DMA1 Channel7 half transfer interrupt.
  456. * @arg DMA1_INT_TE7: DMA1 Channel7 transfer error interrupt.
  457. * @arg DMA2_INT_GL1: DMA2 Channel1 global interrupt.
  458. * @arg DMA2_INT_TC1: DMA2 Channel1 transfer complete interrupt.
  459. * @arg DMA2_INT_HT1: DMA2 Channel1 half transfer interrupt.
  460. * @arg DMA2_INT_TE1: DMA2 Channel1 transfer error interrupt.
  461. * @arg DMA2_INT_GL2: DMA2 Channel2 global interrupt.
  462. * @arg DMA2_INT_TC2: DMA2 Channel2 transfer complete interrupt.
  463. * @arg DMA2_INT_HT2: DMA2 Channel2 half transfer interrupt.
  464. * @arg DMA2_INT_TE2: DMA2 Channel2 transfer error interrupt.
  465. * @arg DMA2_INT_GL3: DMA2 Channel3 global interrupt.
  466. * @arg DMA2_INT_TC3: DMA2 Channel3 transfer complete interrupt.
  467. * @arg DMA2_INT_HT3: DMA2 Channel3 half transfer interrupt.
  468. * @arg DMA2_INT_TE3: DMA2 Channel3 transfer error interrupt.
  469. * @arg DMA2_INT_GL4: DMA2 Channel4 global interrupt.
  470. * @arg DMA2_INT_TC4: DMA2 Channel4 transfer complete interrupt.
  471. * @arg DMA2_INT_HT4: DMA2 Channel4 half transfer interrupt.
  472. * @arg DMA2_INT_TE4: DMA2 Channel4 transfer error interrupt.
  473. * @arg DMA2_INT_GL5: DMA2 Channel5 global interrupt.
  474. * @arg DMA2_INT_TC5: DMA2 Channel5 transfer complete interrupt.
  475. * @arg DMA2_INT_HT5: DMA2 Channel5 half transfer interrupt.
  476. * @arg DMA2_INT_TE5: DMA2 Channel5 transfer error interrupt.
  477. * @retval None
  478. */
  479. void DMA_ClearIntBitState(uint32_t DMAy_INT)
  480. {
  481. /* Check the used DMAy */
  482. if ((DMAy_INT & DMA2_FLAG_Mask) != (uint32_t)RESET) {
  483. /* Clear the DMA2 interrupt bits */
  484. DMA2->ICR = DMAy_INT;
  485. } else {
  486. /* Clear the DMA1 interrupt bits */
  487. DMA1->ICR = DMAy_INT;
  488. }
  489. }
  490. /**
  491. * @}
  492. */
  493. /**
  494. * @}
  495. */
  496. /**
  497. * @}
  498. */