lib_dma.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /**
  2. ******************************************************************************
  3. * @file lib_dma.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 22018-09-27
  7. * @brief DMA library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_dma.h"
  14. //registers default reset values
  15. #define DMA_CxCTL_RSTValue (0UL)
  16. #define DMA_CxSRC_RSTValue (0UL)
  17. #define DMA_CxDST_RSTValue (0UL)
  18. #define DMA_AESCTL_RSTValue (0UL)
  19. #define DMA_AESKEY_RSTValue (0UL)
  20. /**
  21. * @brief Initializes the DMA Cx peripheral registers to their default reset values.
  22. * @param Channel: DMA_CHANNEL_0~DMA_CHANNEL_3
  23. * @retval None
  24. */
  25. void DMA_DeInit(uint32_t Channel)
  26. {
  27. __IO uint32_t *addr;
  28. /* Check parameters */
  29. assert_parameters(IS_DMA_CHANNEL(Channel));
  30. /* channel x disable, clear stop */
  31. addr = &DMA->C0CTL + Channel*4;
  32. *addr &= ~(DMA_CxCTL_EN | DMA_CTL_STOP);
  33. /* interrupt disable */
  34. DMA->IE &= ~((1<<(Channel))\
  35. |(1<<(Channel+4))\
  36. |(1<<(Channel+8)));
  37. /* interrupt state clear */
  38. DMA->STS = (1<<(Channel+4))\
  39. |(1<<(Channel+8))\
  40. |(1<<(Channel+12));
  41. /* DMA_CxCTL */
  42. addr = &DMA->C0CTL + Channel*4;
  43. *addr = DMA_CxCTL_RSTValue;
  44. /* DMA_CxSRC */
  45. addr = &DMA->C0SRC + Channel*4;
  46. *addr = DMA_CxSRC_RSTValue;
  47. /* DMA_CxDST */
  48. addr = &DMA->C0DST + Channel*4;
  49. *addr = DMA_CxDST_RSTValue;
  50. }
  51. /**
  52. * @brief DMA channel x initialization.
  53. * @param InitStruct: DMA configuration.
  54. DestAddr : destination address
  55. SrcAddr : source address
  56. FrameLen : Frame length (Ranges 0~255, actual length FrameLen+1)
  57. PackLen : Package length (Ranges 0~255, actual length PackLen+1)
  58. ContMode:
  59. DMA_CONTMODE_ENABLE
  60. DMA_CONTMODE_DISABLE
  61. TransMode:
  62. DMA_TRANSMODE_SINGLE
  63. DMA_TRANSMODE_PACK
  64. ReqSrc:
  65. DMA_REQSRC_SOFT
  66. DMA_REQSRC_UART0TX
  67. DMA_REQSRC_UART0RX
  68. DMA_REQSRC_UART1TX
  69. DMA_REQSRC_UART1RX
  70. DMA_REQSRC_UART2TX
  71. DMA_REQSRC_UART2RX
  72. DMA_REQSRC_UART3TX
  73. DMA_REQSRC_UART3RX
  74. DMA_REQSRC_UART4TX
  75. DMA_REQSRC_UART4RX
  76. DMA_REQSRC_UART5TX
  77. DMA_REQSRC_UART5RX
  78. DMA_REQSRC_ISO78160TX
  79. DMA_REQSRC_ISO78160RX
  80. DMA_REQSRC_ISO78161TX
  81. DMA_REQSRC_ISO78161RX
  82. DMA_REQSRC_TIMER0
  83. DMA_REQSRC_TIMER1
  84. DMA_REQSRC_TIMER2
  85. DMA_REQSRC_TIMER3
  86. DMA_REQSRC_SPI1TX
  87. DMA_REQSRC_SPI1RX
  88. DMA_REQSRC_U32K0
  89. DMA_REQSRC_U32K1
  90. DMA_REQSRC_CMP1
  91. DMA_REQSRC_CMP2
  92. DMA_REQSRC_SPI2TX
  93. DMA_REQSRC_SPI2RX
  94. DestAddrMode:
  95. DMA_DESTADDRMODE_FIX
  96. DMA_DESTADDRMODE_PEND
  97. DMA_DESTADDRMODE_FEND
  98. SrcAddrMode:
  99. DMA_SRCADDRMODE_FIX
  100. DMA_SRCADDRMODE_PEND
  101. DMA_SRCADDRMODE_FEND
  102. TransSize:
  103. DMA_TRANSSIZE_BYTE
  104. DMA_TRANSSIZE_HWORD
  105. DMA_TRANSSIZE_WORD
  106. Channel:
  107. DMA_CHANNEL_0
  108. DMA_CHANNEL_1
  109. DMA_CHANNEL_2
  110. DMA_CHANNEL_3
  111. * @retval None
  112. */
  113. void DMA_Init(DMA_InitType *InitStruct, uint32_t Channel)
  114. {
  115. uint32_t tmp;
  116. __IO uint32_t *addr;
  117. /* Check parameters */
  118. assert_parameters(IS_DMA_CHANNEL(Channel));
  119. assert_parameters(IS_DMA_CONTMOD(InitStruct->ContMode));
  120. assert_parameters(IS_DMA_TRANSMOD(InitStruct->TransMode));
  121. assert_parameters(IS_DMA_REQSRC(InitStruct->ReqSrc));
  122. assert_parameters(IS_DMA_DESTADDRMOD(InitStruct->DestAddrMode));
  123. assert_parameters(IS_DMA_SRCADDRMOD(InitStruct->SrcAddrMode));
  124. assert_parameters(IS_DMA_TRANSSIZE(InitStruct->TransSize));
  125. if (InitStruct->TransSize == DMA_TRANSSIZE_HWORD)
  126. {
  127. assert_parameters(IS_DMA_ALIGNEDADDR_HWORD(InitStruct->SrcAddr));
  128. assert_parameters(IS_DMA_ALIGNEDADDR_HWORD(InitStruct->DestAddr));
  129. }
  130. if (InitStruct->TransSize == DMA_TRANSSIZE_WORD)
  131. {
  132. assert_parameters(IS_DMA_ALIGNEDADDR_WORD(InitStruct->SrcAddr));
  133. assert_parameters(IS_DMA_ALIGNEDADDR_WORD(InitStruct->DestAddr));
  134. }
  135. addr = &DMA->C0DST + Channel*4;
  136. *addr = InitStruct->DestAddr;
  137. addr = &DMA->C0SRC + Channel*4;
  138. *addr = InitStruct->SrcAddr;
  139. addr = &DMA->C0CTL + Channel*4;
  140. tmp = *addr;
  141. tmp &= ~(DMA_CTL_FLEN\
  142. |DMA_CTL_PLEN\
  143. |DMA_CTL_CONT\
  144. |DMA_CTL_TMODE\
  145. |DMA_CTL_DMASEL\
  146. |DMA_CxCTL_DMODE\
  147. |DMA_CxCTL_SMODE\
  148. |DMA_CxCTL_SIZE);
  149. tmp |= ((InitStruct->FrameLen<<DMA_CTL_FLEN_Pos)\
  150. |(InitStruct->PackLen<<DMA_CTL_PLEN_Pos)\
  151. |(InitStruct->ContMode)\
  152. |(InitStruct->TransMode)\
  153. |(InitStruct->ReqSrc)\
  154. |(InitStruct->DestAddrMode)\
  155. |(InitStruct->SrcAddrMode)\
  156. |(InitStruct->TransSize));
  157. *addr = tmp;
  158. }
  159. /**
  160. * @brief Initializes the DMA AES channel3 registers to their default reset values.
  161. * @param None
  162. * @retval None
  163. */
  164. void DMA_AESDeInit(void)
  165. {
  166. DMA->AESCTL = DMA_AESCTL_RSTValue;
  167. DMA->AESKEY0 = DMA_AESKEY_RSTValue;
  168. DMA->AESKEY1 = DMA_AESKEY_RSTValue;
  169. DMA->AESKEY2 = DMA_AESKEY_RSTValue;
  170. DMA->AESKEY3 = DMA_AESKEY_RSTValue;
  171. DMA->AESKEY4 = DMA_AESKEY_RSTValue;
  172. DMA->AESKEY5 = DMA_AESKEY_RSTValue;
  173. DMA->AESKEY6 = DMA_AESKEY_RSTValue;
  174. DMA->AESKEY7 = DMA_AESKEY_RSTValue;
  175. }
  176. /**
  177. * @brief AES initialization.
  178. * @param InitStruct: AES configuration.
  179. Mode:
  180. DMA_AESMODE_128
  181. DMA_AESMODE_192
  182. DMA_AESMODE_256
  183. Direction:
  184. DMA_AESDIRECTION_ENCODE
  185. DMA_AESDIRECTION_DECODE
  186. KeyStr: the pointer to DMA_AESKEYx register
  187. * @retval None
  188. */
  189. void DMA_AESInit(DMA_AESInitType *InitStruct)
  190. {
  191. uint32_t tmp;
  192. /* Check parameters */
  193. assert_parameters(IS_DMA_AESMOD(InitStruct->Mode));
  194. assert_parameters(IS_DMA_AESDIR(InitStruct->Direction));
  195. tmp = DMA->AESCTL;
  196. tmp &= ~(DMA_AESCTL_MODE\
  197. |DMA_AESCTL_ENC);
  198. tmp |= (InitStruct->Mode\
  199. |InitStruct->Direction);
  200. DMA->AESCTL = tmp;
  201. DMA->AESKEY0 = InitStruct->KeyStr[0];
  202. DMA->AESKEY1 = InitStruct->KeyStr[1];
  203. DMA->AESKEY2 = InitStruct->KeyStr[2];
  204. DMA->AESKEY3 = InitStruct->KeyStr[3];
  205. if ((InitStruct->Mode == DMA_AESMODE_192) ||\
  206. (InitStruct->Mode == DMA_AESMODE_256))
  207. {
  208. DMA->AESKEY4 = InitStruct->KeyStr[4];
  209. DMA->AESKEY5 = InitStruct->KeyStr[5];
  210. }
  211. if (InitStruct->Mode == DMA_AESMODE_256)
  212. {
  213. DMA->AESKEY6 = InitStruct->KeyStr[6];
  214. DMA->AESKEY7 = InitStruct->KeyStr[7];
  215. }
  216. }
  217. /**
  218. * @brief Interrupt configure.
  219. * @param INTMask: can use the ¡®|¡¯ operator
  220. DMA_INT_C3DA
  221. DMA_INT_C2DA
  222. DMA_INT_C1DA
  223. DMA_INT_C0DA
  224. DMA_INT_C3FE
  225. DMA_INT_C2FE
  226. DMA_INT_C1FE
  227. DMA_INT_C0FE
  228. DMA_INT_C3PE
  229. DMA_INT_C2PE
  230. DMA_INT_C1PE
  231. DMA_INT_C0PE
  232. NewState:
  233. ENABLE
  234. DISABLE
  235. * @retval None
  236. */
  237. void DMA_INTConfig(uint32_t INTMask, uint32_t NewState)
  238. {
  239. /* Check parameters */
  240. assert_parameters(IS_DMA_INT(INTMask));
  241. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  242. if (NewState == ENABLE)
  243. DMA->IE |= INTMask;
  244. else
  245. DMA->IE &= ~INTMask;
  246. }
  247. /**
  248. * @brief Get interrupt status.
  249. * @param INTMask:
  250. DMA_INTSTS_C3DA
  251. DMA_INTSTS_C2DA
  252. DMA_INTSTS_C1DA
  253. DMA_INTSTS_C0DA
  254. DMA_INTSTS_C3FE
  255. DMA_INTSTS_C2FE
  256. DMA_INTSTS_C1FE
  257. DMA_INTSTS_C0FE
  258. DMA_INTSTS_C3PE
  259. DMA_INTSTS_C2PE
  260. DMA_INTSTS_C1PE
  261. DMA_INTSTS_C0PE
  262. DMA_INTSTS_C3BUSY
  263. DMA_INTSTS_C2BUSY
  264. DMA_INTSTS_C1BUSY
  265. DMA_INTSTS_C0BUSY
  266. * @retval interrupt status.
  267. */
  268. uint8_t DMA_GetINTStatus(uint32_t INTMask)
  269. {
  270. /* Check parameters */
  271. assert_parameters(IS_DMA_INTFLAGR(INTMask));
  272. if (DMA->STS&INTMask)
  273. return 1;
  274. else
  275. return 0;
  276. }
  277. /**
  278. * @brief Clear interrupt status.
  279. * @param INTMask: can use the ¡®|¡¯ operator
  280. DMA_INTSTS_C3DA
  281. DMA_INTSTS_C2DA
  282. DMA_INTSTS_C1DA
  283. DMA_INTSTS_C0DA
  284. DMA_INTSTS_C3FE
  285. DMA_INTSTS_C2FE
  286. DMA_INTSTS_C1FE
  287. DMA_INTSTS_C0FE
  288. DMA_INTSTS_C3PE
  289. DMA_INTSTS_C2PE
  290. DMA_INTSTS_C1PE
  291. DMA_INTSTS_C0PE
  292. * @retval None
  293. */
  294. void DMA_ClearINTStatus(uint32_t INTMask)
  295. {
  296. /* Check parameters */
  297. assert_parameters(IS_DMA_INTFLAGC(INTMask));
  298. DMA->STS = INTMask;
  299. }
  300. /**
  301. * @brief DMA channel enable.
  302. * @param Channel:
  303. DMA_CHANNEL_0
  304. DMA_CHANNEL_1
  305. DMA_CHANNEL_2
  306. DMA_CHANNEL_3
  307. NewState:
  308. ENABLE
  309. DISABLE
  310. * @retval None
  311. */
  312. void DMA_Cmd(uint32_t Channel, uint32_t NewState)
  313. {
  314. __IO uint32_t *addr;
  315. /* Check parameters */
  316. assert_parameters(IS_DMA_CHANNEL(Channel));
  317. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  318. addr = &DMA->C0CTL + Channel*4;
  319. if (NewState == ENABLE)
  320. *addr |= DMA_CxCTL_EN;
  321. else
  322. *addr &= ~DMA_CxCTL_EN;
  323. }
  324. /**
  325. * @brief Enable AES encrypt/decrypt function of DMA channel3.
  326. * @param NewState:
  327. ENABLE
  328. DISABLE
  329. * @retval None
  330. */
  331. void DMA_AESCmd(uint32_t NewState)
  332. {
  333. /* Check parameters */
  334. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  335. if (NewState == ENABLE)
  336. DMA->C3CTL |= DMA_CTL_AESEN;
  337. else
  338. DMA->C3CTL &= ~DMA_CTL_AESEN;
  339. }
  340. /**
  341. * @brief DMA stop transmit.
  342. * @param Channel:
  343. DMA_CHANNEL_0
  344. DMA_CHANNEL_1
  345. DMA_CHANNEL_2
  346. DMA_CHANNEL_3
  347. NewState:
  348. ENABLE
  349. DISABLE
  350. * @retval None
  351. */
  352. void DMA_StopTransmit(uint32_t Channel, uint32_t NewState)
  353. {
  354. __IO uint32_t *addr;
  355. /* Check parameters */
  356. assert_parameters(IS_DMA_CHANNEL(Channel));
  357. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  358. addr = &DMA->C0CTL + Channel*4;
  359. if (NewState == ENABLE)
  360. *addr |= DMA_CTL_STOP;
  361. else
  362. *addr &= ~DMA_CTL_STOP;
  363. }
  364. /**
  365. * @brief Get current frame transferred length.
  366. * @param Channel:
  367. DMA_CHANNEL_0
  368. DMA_CHANNEL_1
  369. DMA_CHANNEL_2
  370. DMA_CHANNEL_3
  371. * @retval Current frame transferred length.
  372. */
  373. uint8_t DMA_GetFrameLenTransferred(uint32_t Channel)
  374. {
  375. __IO uint32_t *addr;
  376. /* Check parameters */
  377. assert_parameters(IS_DMA_CHANNEL(Channel));
  378. addr = &DMA->C0LEN + Channel*4;
  379. return ((*addr&0xFF00)>>8);
  380. }
  381. /**
  382. * @brief Get current package transferred length.
  383. * @param Channel:
  384. DMA_CHANNEL_0
  385. DMA_CHANNEL_1
  386. DMA_CHANNEL_2
  387. DMA_CHANNEL_3
  388. * @retval Current package transferred length.
  389. */
  390. uint8_t DMA_GetPackLenTransferred(uint32_t Channel)
  391. {
  392. __IO uint32_t *addr;
  393. /* Check parameters */
  394. assert_parameters(IS_DMA_CHANNEL(Channel));
  395. addr = &DMA->C0LEN + Channel*4;
  396. return (*addr&0xFF);
  397. }
  398. /*********************************** END OF FILE ******************************/