lib_dma.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. /**
  2. ******************************************************************************
  3. * @file lib_dma.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  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 channel 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_CCTL_EN | DMA_CCTL_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 Fills each DMA_InitType member with its default value.
  53. * @param InitStruct: pointer to an DMA_InitType structure which will be initialized.
  54. * @retval None
  55. */
  56. void DMA_StructInit(DMA_InitType *InitStruct)
  57. {
  58. /*-------------- Reset DMA init structure parameters values ---------------*/
  59. /* Initialize the DestAddr member */
  60. InitStruct->DestAddr = 0;
  61. /* Initialize the SrcAddr member */
  62. InitStruct->SrcAddr = 0;
  63. /* Initialize the FrameLen member */
  64. InitStruct->FrameLen = 0;
  65. /* Initialize the PackLen member */
  66. InitStruct->PackLen = 0;
  67. /* Initialize the ContMode member */
  68. InitStruct->ContMode = DMA_CONTMODE_DISABLE;
  69. /* Initialize the TransMode member */
  70. InitStruct->TransMode = DMA_TRANSMODE_SINGLE;
  71. /* Initialize the ReqSrc member */
  72. InitStruct->ReqSrc = DMA_REQSRC_SOFT;
  73. /* Initialize the DestAddrMode member */
  74. InitStruct->DestAddrMode = DMA_DESTADDRMODE_FIX;
  75. /* Initialize the SrcAddrMode member */
  76. InitStruct->SrcAddrMode = DMA_SRCADDRMODE_FIX;
  77. /* Initialize the TransSize member */
  78. InitStruct->TransSize = DMA_TRANSSIZE_BYTE;
  79. }
  80. /**
  81. * @brief Initializes DMA channel.
  82. * @param InitStruct: DMA configuration.
  83. DestAddr : destination address
  84. SrcAddr : source address
  85. FrameLen : Frame length (Ranges 0~255, actual length FrameLen+1)
  86. PackLen : Package length (Ranges 0~255, actual length PackLen+1)
  87. ContMode:
  88. DMA_CONTMODE_ENABLE
  89. DMA_CONTMODE_DISABLE
  90. TransMode:
  91. DMA_TRANSMODE_SINGLE
  92. DMA_TRANSMODE_PACK
  93. ReqSrc:
  94. DMA_REQSRC_SOFT
  95. DMA_REQSRC_ADC
  96. DMA_REQSRC_UART0TX
  97. DMA_REQSRC_UART0RX
  98. DMA_REQSRC_UART1TX
  99. DMA_REQSRC_UART1RX
  100. DMA_REQSRC_UART2TX
  101. DMA_REQSRC_UART2RX
  102. DMA_REQSRC_UART3TX
  103. DMA_REQSRC_UART3RX
  104. DMA_REQSRC_UART4TX
  105. DMA_REQSRC_UART4RX
  106. DMA_REQSRC_UART5TX
  107. DMA_REQSRC_UART5RX
  108. DMA_REQSRC_ISO78160TX
  109. DMA_REQSRC_ISO78160RX
  110. DMA_REQSRC_ISO78161TX
  111. DMA_REQSRC_ISO78161RX
  112. DMA_REQSRC_TIMER0
  113. DMA_REQSRC_TIMER1
  114. DMA_REQSRC_TIMER2
  115. DMA_REQSRC_TIMER3
  116. DMA_REQSRC_SPI1TX
  117. DMA_REQSRC_SPI1RX
  118. DMA_REQSRC_U32K0
  119. DMA_REQSRC_U32K1
  120. DMA_REQSRC_CMP1
  121. DMA_REQSRC_CMP2
  122. DMA_REQSRC_SPI2TX
  123. DMA_REQSRC_SPI2RX
  124. DMA_REQSRC_SPI3TX
  125. DMA_REQSRC_SPI3RX
  126. DestAddrMode:
  127. DMA_DESTADDRMODE_FIX
  128. DMA_DESTADDRMODE_PEND
  129. DMA_DESTADDRMODE_FEND
  130. SrcAddrMode:
  131. DMA_SRCADDRMODE_FIX
  132. DMA_SRCADDRMODE_PEND
  133. DMA_SRCADDRMODE_FEND
  134. TransSize:
  135. DMA_TRANSSIZE_BYTE
  136. DMA_TRANSSIZE_HWORD
  137. DMA_TRANSSIZE_WORD
  138. Channel:
  139. DMA_CHANNEL_0
  140. DMA_CHANNEL_1
  141. DMA_CHANNEL_2
  142. DMA_CHANNEL_3
  143. * @retval None
  144. */
  145. void DMA_Init(DMA_InitType *InitStruct, uint32_t Channel)
  146. {
  147. uint32_t tmp;
  148. __IO uint32_t *addr;
  149. /* Check parameters */
  150. assert_parameters(IS_DMA_CHANNEL(Channel));
  151. assert_parameters(IS_DMA_CONTMOD(InitStruct->ContMode));
  152. assert_parameters(IS_DMA_TRANSMOD(InitStruct->TransMode));
  153. assert_parameters(IS_DMA_REQSRC(InitStruct->ReqSrc));
  154. assert_parameters(IS_DMA_DESTADDRMOD(InitStruct->DestAddrMode));
  155. assert_parameters(IS_DMA_SRCADDRMOD(InitStruct->SrcAddrMode));
  156. assert_parameters(IS_DMA_TRANSSIZE(InitStruct->TransSize));
  157. if (InitStruct->TransSize == DMA_TRANSSIZE_HWORD)
  158. {
  159. assert_parameters(IS_DMA_ALIGNEDADDR_HWORD(InitStruct->SrcAddr));
  160. assert_parameters(IS_DMA_ALIGNEDADDR_HWORD(InitStruct->DestAddr));
  161. }
  162. if (InitStruct->TransSize == DMA_TRANSSIZE_WORD)
  163. {
  164. assert_parameters(IS_DMA_ALIGNEDADDR_WORD(InitStruct->SrcAddr));
  165. assert_parameters(IS_DMA_ALIGNEDADDR_WORD(InitStruct->DestAddr));
  166. }
  167. addr = &DMA->C0DST + Channel*4;
  168. *addr = InitStruct->DestAddr;
  169. addr = &DMA->C0SRC + Channel*4;
  170. *addr = InitStruct->SrcAddr;
  171. addr = &DMA->C0CTL + Channel*4;
  172. tmp = *addr;
  173. tmp &= ~(DMA_CCTL_FLEN\
  174. |DMA_CCTL_PLEN\
  175. |DMA_CCTL_CONT\
  176. |DMA_CCTL_TMODE\
  177. |DMA_CCTL_DMASEL\
  178. |DMA_CCTL_DMODE\
  179. |DMA_CCTL_SMODE\
  180. |DMA_CCTL_SIZE);
  181. tmp |= ((InitStruct->FrameLen<<DMA_CCTL_FLEN_Pos)\
  182. |(InitStruct->PackLen<<DMA_CCTL_PLEN_Pos)\
  183. |(InitStruct->ContMode)\
  184. |(InitStruct->TransMode)\
  185. |(InitStruct->ReqSrc)\
  186. |(InitStruct->DestAddrMode)\
  187. |(InitStruct->SrcAddrMode)\
  188. |(InitStruct->TransSize));
  189. *addr = tmp;
  190. }
  191. /**
  192. * @brief Initializes the DMA AES channel3 registers to their default reset values.
  193. * @param None
  194. * @retval None
  195. */
  196. void DMA_ASEDeInit(void)
  197. {
  198. DMA->AESCTL = DMA_AESCTL_RSTValue;
  199. DMA->AESKEY[0] = DMA_AESKEY_RSTValue;
  200. DMA->AESKEY[1] = DMA_AESKEY_RSTValue;
  201. DMA->AESKEY[2] = DMA_AESKEY_RSTValue;
  202. DMA->AESKEY[3] = DMA_AESKEY_RSTValue;
  203. DMA->AESKEY[4] = DMA_AESKEY_RSTValue;
  204. DMA->AESKEY[5] = DMA_AESKEY_RSTValue;
  205. DMA->AESKEY[6] = DMA_AESKEY_RSTValue;
  206. DMA->AESKEY[7] = DMA_AESKEY_RSTValue;
  207. }
  208. /**
  209. * @brief Initializes AES.
  210. * @param InitStruct: AES configuration.
  211. Mode:
  212. DMA_AESMODE_128
  213. DMA_AESMODE_192
  214. DMA_AESMODE_256
  215. Direction:
  216. DMA_AESDIRECTION_ENCODE
  217. DMA_AESDIRECTION_DECODE
  218. KeyStr: the pointer to DMA_AESKEYx register
  219. * @retval None
  220. */
  221. void DMA_AESInit(DMA_AESInitType *InitStruct)
  222. {
  223. uint32_t tmp;
  224. /* Check parameters */
  225. assert_parameters(IS_DMA_AESMOD(InitStruct->Mode));
  226. assert_parameters(IS_DMA_AESDIR(InitStruct->Direction));
  227. tmp = DMA->AESCTL;
  228. tmp &= ~(DMA_AESCTL_MODE\
  229. |DMA_AESCTL_ENC);
  230. tmp |= (InitStruct->Mode\
  231. |InitStruct->Direction);
  232. DMA->AESCTL = tmp;
  233. DMA->AESKEY[0] = InitStruct->KeyStr[0];
  234. DMA->AESKEY[1] = InitStruct->KeyStr[1];
  235. DMA->AESKEY[2] = InitStruct->KeyStr[2];
  236. DMA->AESKEY[3] = InitStruct->KeyStr[3];
  237. if ((InitStruct->Mode == DMA_AESMODE_192) ||\
  238. (InitStruct->Mode == DMA_AESMODE_256))
  239. {
  240. DMA->AESKEY[4] = InitStruct->KeyStr[4];
  241. DMA->AESKEY[5] = InitStruct->KeyStr[5];
  242. }
  243. if (InitStruct->Mode == DMA_AESMODE_256)
  244. {
  245. DMA->AESKEY[6] = InitStruct->KeyStr[6];
  246. DMA->AESKEY[7] = InitStruct->KeyStr[7];
  247. }
  248. }
  249. /**
  250. * @brief Enables or disables DMA interrupt.
  251. * @param INTMask: can use the '|' operator
  252. DMA_INT_C3DA
  253. DMA_INT_C2DA
  254. DMA_INT_C1DA
  255. DMA_INT_C0DA
  256. DMA_INT_C3FE
  257. DMA_INT_C2FE
  258. DMA_INT_C1FE
  259. DMA_INT_C0FE
  260. DMA_INT_C3PE
  261. DMA_INT_C2PE
  262. DMA_INT_C1PE
  263. DMA_INT_C0PE
  264. NewState:
  265. ENABLE
  266. DISABLE
  267. * @retval None
  268. */
  269. void DMA_INTConfig(uint32_t INTMask, uint32_t NewState)
  270. {
  271. /* Check parameters */
  272. assert_parameters(IS_DMA_INT(INTMask));
  273. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  274. if (NewState == ENABLE)
  275. DMA->IE |= INTMask;
  276. else
  277. DMA->IE &= ~INTMask;
  278. }
  279. /**
  280. * @brief Gets DMA interrupt status.
  281. * @param INTMask:
  282. DMA_INTSTS_C3DA
  283. DMA_INTSTS_C2DA
  284. DMA_INTSTS_C1DA
  285. DMA_INTSTS_C0DA
  286. DMA_INTSTS_C3FE
  287. DMA_INTSTS_C2FE
  288. DMA_INTSTS_C1FE
  289. DMA_INTSTS_C0FE
  290. DMA_INTSTS_C3PE
  291. DMA_INTSTS_C2PE
  292. DMA_INTSTS_C1PE
  293. DMA_INTSTS_C0PE
  294. DMA_INTSTS_C3BUSY
  295. DMA_INTSTS_C2BUSY
  296. DMA_INTSTS_C1BUSY
  297. DMA_INTSTS_C0BUSY
  298. * @retval interrupt status.
  299. */
  300. uint8_t DMA_GetINTStatus(uint32_t INTMask)
  301. {
  302. /* Check parameters */
  303. assert_parameters(IS_DMA_INTFLAGR(INTMask));
  304. if (DMA->STS&INTMask)
  305. return 1;
  306. else
  307. return 0;
  308. }
  309. /**
  310. * @brief Clears DMA interrupt status.
  311. * @param INTMask: can use the '|' operator
  312. DMA_INTSTS_C3DA
  313. DMA_INTSTS_C2DA
  314. DMA_INTSTS_C1DA
  315. DMA_INTSTS_C0DA
  316. DMA_INTSTS_C3FE
  317. DMA_INTSTS_C2FE
  318. DMA_INTSTS_C1FE
  319. DMA_INTSTS_C0FE
  320. DMA_INTSTS_C3PE
  321. DMA_INTSTS_C2PE
  322. DMA_INTSTS_C1PE
  323. DMA_INTSTS_C0PE
  324. * @retval None
  325. */
  326. void DMA_ClearINTStatus(uint32_t INTMask)
  327. {
  328. /* Check parameters */
  329. assert_parameters(IS_DMA_INTFLAGC(INTMask));
  330. DMA->STS = INTMask;
  331. }
  332. /**
  333. * @brief Enables or disables DMA channel.
  334. * @param Channel:
  335. DMA_CHANNEL_0
  336. DMA_CHANNEL_1
  337. DMA_CHANNEL_2
  338. DMA_CHANNEL_3
  339. NewState:
  340. ENABLE
  341. DISABLE
  342. * @retval None
  343. */
  344. void DMA_Cmd(uint32_t Channel, uint32_t NewState)
  345. {
  346. __IO uint32_t *addr;
  347. /* Check parameters */
  348. assert_parameters(IS_DMA_CHANNEL(Channel));
  349. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  350. addr = &DMA->C0CTL + Channel*4;
  351. if (NewState == ENABLE)
  352. *addr |= DMA_CCTL_EN;
  353. else
  354. *addr &= ~DMA_CCTL_EN;
  355. }
  356. /**
  357. * @brief Enables or disables AES encrypt/decrypt function of DMA channel3.
  358. * @param NewState:
  359. ENABLE
  360. DISABLE
  361. * @retval None
  362. */
  363. void DMA_AESCmd(uint32_t NewState)
  364. {
  365. /* Check parameters */
  366. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  367. if (NewState == ENABLE)
  368. DMA->C3CTL |= DMA_CCTL_AESEN;
  369. else
  370. DMA->C3CTL &= ~DMA_CCTL_AESEN;
  371. }
  372. /**
  373. * @brief Stops DMA transmit.
  374. * @param Channel:
  375. DMA_CHANNEL_0
  376. DMA_CHANNEL_1
  377. DMA_CHANNEL_2
  378. DMA_CHANNEL_3
  379. NewState:
  380. ENABLE
  381. DISABLE
  382. * @retval None
  383. */
  384. void DMA_StopTransmit(uint32_t Channel, uint32_t NewState)
  385. {
  386. __IO uint32_t *addr;
  387. /* Check parameters */
  388. assert_parameters(IS_DMA_CHANNEL(Channel));
  389. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  390. addr = &DMA->C0CTL + Channel*4;
  391. if (NewState == ENABLE)
  392. *addr |= DMA_CCTL_STOP;
  393. else
  394. *addr &= ~DMA_CCTL_STOP;
  395. }
  396. /**
  397. * @brief Gets current frame transferred length.
  398. * @param Channel:
  399. DMA_CHANNEL_0
  400. DMA_CHANNEL_1
  401. DMA_CHANNEL_2
  402. DMA_CHANNEL_3
  403. * @retval Current frame transferred length.
  404. */
  405. uint8_t DMA_GetFrameLenTransferred(uint32_t Channel)
  406. {
  407. __IO uint32_t *addr;
  408. /* Check parameters */
  409. assert_parameters(IS_DMA_CHANNEL(Channel));
  410. addr = &DMA->C0LEN + Channel*4;
  411. return ((*addr&0xFF00)>>8);
  412. }
  413. /**
  414. * @brief Gets current package transferred length.
  415. * @param Channel:
  416. DMA_CHANNEL_0
  417. DMA_CHANNEL_1
  418. DMA_CHANNEL_2
  419. DMA_CHANNEL_3
  420. * @retval Current package transferred length.
  421. */
  422. uint8_t DMA_GetPackLenTransferred(uint32_t Channel)
  423. {
  424. __IO uint32_t *addr;
  425. /* Check parameters */
  426. assert_parameters(IS_DMA_CHANNEL(Channel));
  427. addr = &DMA->C0LEN + Channel*4;
  428. return (*addr&0xFF);
  429. }
  430. /*********************************** END OF FILE ******************************/