SWM341_dma2d.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM341_dma2d.c
  3. * 功能说明: SWM341单片机的DMA2D功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.0.0 2016年1月30日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM341.h"
  22. #include "SWM341_dma2d.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: DMA2D_Init()
  25. * 功能说明: DMA2D初始化
  26. * 输 入: DMA2D_InitStructure * initStruct
  27. * 输 出: 无
  28. * 注意事项: 无
  29. ******************************************************************************************************************************************/
  30. void DMA2D_Init(DMA2D_InitStructure * initStruct)
  31. {
  32. SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos);
  33. DMA2D->CR &= ~DMA2D_CR_WAIT_Msk;
  34. DMA2D->CR |= (initStruct->Interval << DMA2D_CR_WAIT_Pos);
  35. DMA2D->IF = 0xFF;
  36. DMA2D->IE = (initStruct->IntEOTEn << DMA2D_IE_DONE_Pos);
  37. if(initStruct->IntEOTEn)
  38. NVIC_EnableIRQ(DMA2D_IRQn);
  39. }
  40. /******************************************************************************************************************************************
  41. * 函数名称: DMA2D_PixelFill()
  42. * 功能说明: DMA2D向指定存储器区域填充指定颜色
  43. * 输 入: DMA2D_LayerSetting * outLayer 要填充的位置、大小、颜色格式等
  44. * uint32_t color 要填充的颜色
  45. * 输 出: 无
  46. * 注意事项: 无
  47. ******************************************************************************************************************************************/
  48. void DMA2D_PixelFill(DMA2D_LayerSetting * outLayer, uint32_t color)
  49. {
  50. DMA2D->L[DMA2D_LAYER_OUT].COLOR = color;
  51. DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
  52. DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
  53. DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
  54. DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
  55. ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
  56. DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
  57. DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) |
  58. (1 << DMA2D_CR_START_Pos);
  59. }
  60. /******************************************************************************************************************************************
  61. * 函数名称: DMA2D_PixelMove()
  62. * 功能说明: DMA2D像素数据搬运
  63. * 输 入: DMA2D_LayerSetting * fgLayer
  64. * DMA2D_LayerSetting * outLayer
  65. * 输 出: 无
  66. * 注意事项: 无
  67. ******************************************************************************************************************************************/
  68. void DMA2D_PixelMove(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
  69. {
  70. DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
  71. DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
  72. DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
  73. DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
  74. DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
  75. DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
  76. ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
  77. DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
  78. DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) |
  79. (1 << DMA2D_CR_START_Pos);
  80. }
  81. /******************************************************************************************************************************************
  82. * 函数名称: DMA2D_PixelConvert()
  83. * 功能说明: DMA2D像素转换
  84. * 输 入: DMA2D_LayerSetting * fgLayer
  85. * DMA2D_LayerSetting * outLayer
  86. * 输 出: 无
  87. * 注意事项: 无
  88. ******************************************************************************************************************************************/
  89. void DMA2D_PixelConvert(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
  90. {
  91. DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
  92. DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
  93. DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
  94. DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
  95. DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
  96. DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
  97. DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
  98. ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
  99. DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
  100. DMA2D->CR |= (1 << DMA2D_CR_MODE_Pos) |
  101. (1 << DMA2D_CR_START_Pos);
  102. }
  103. /******************************************************************************************************************************************
  104. * 函数名称: DMA2D_PixelBlend()
  105. * 功能说明: DMA2D像素混合
  106. * 输 入: DMA2D_LayerSetting * fgLayer
  107. * DMA2D_LayerSetting * bgLayer
  108. * DMA2D_LayerSetting * outLayer
  109. * 输 出: 无
  110. * 注意事项: 无
  111. ******************************************************************************************************************************************/
  112. void DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * bgLayer, DMA2D_LayerSetting * outLayer)
  113. {
  114. DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
  115. DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
  116. DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
  117. (fgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
  118. (fgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
  119. DMA2D->L[DMA2D_LAYER_BG].MAR = bgLayer->Address;
  120. DMA2D->L[DMA2D_LAYER_BG].OR = bgLayer->LineOffset;
  121. DMA2D->L[DMA2D_LAYER_BG].PFCCR = (bgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
  122. (bgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
  123. (bgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
  124. DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
  125. DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
  126. DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
  127. DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
  128. ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
  129. DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
  130. DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) |
  131. (1 << DMA2D_CR_START_Pos);
  132. }
  133. /******************************************************************************************************************************************
  134. * 函数名称: DMA2D_IsBusy()
  135. * 功能说明: DMA2D忙查询
  136. * 输 入: 无
  137. * 输 出: uint32_t 1 正在传输 0 传输完成
  138. * 注意事项: 无
  139. ******************************************************************************************************************************************/
  140. uint32_t DMA2D_IsBusy(void)
  141. {
  142. return (DMA2D->CR & DMA2D_CR_START_Msk) ? 1 : 0;
  143. }
  144. /******************************************************************************************************************************************
  145. * 函数名称: DMA2D_INTEn()
  146. * 功能说明: DMA2D中断使能,完成指定长度的数据传输时触发中断
  147. * 输 入: 无
  148. * 输 出: 无
  149. * 注意事项: 无
  150. ******************************************************************************************************************************************/
  151. void DMA2D_INTEn(void)
  152. {
  153. DMA2D->IE = DMA2D_IE_DONE_Msk;
  154. }
  155. /******************************************************************************************************************************************
  156. * 函数名称: DMA2D_INTDis()
  157. * 功能说明: DMA2D中断禁止,完成指定长度的数据传输时不触发中断
  158. * 输 入: 无
  159. * 输 出: 无
  160. * 注意事项: 无
  161. ******************************************************************************************************************************************/
  162. void DMA2D_INTDis(void)
  163. {
  164. DMA2D->IE = 0;
  165. }
  166. /******************************************************************************************************************************************
  167. * 函数名称: DMA2D_INTClr()
  168. * 功能说明: DMA2D中断标志清除
  169. * 输 入: 无
  170. * 输 出: 无
  171. * 注意事项: 无
  172. ******************************************************************************************************************************************/
  173. void DMA2D_INTClr(void)
  174. {
  175. DMA2D->IF = DMA2D_IF_DONE_Msk;
  176. }
  177. /******************************************************************************************************************************************
  178. * 函数名称: DMA2D_INTStat()
  179. * 功能说明: DMA2D中断状态查询
  180. * 输 入: 无
  181. * 输 出: uint32_t 0 未完成指定长度的数据传输 1 完成指定长度的数据传输
  182. * 注意事项: 无
  183. ******************************************************************************************************************************************/
  184. uint32_t DMA2D_INTStat(void)
  185. {
  186. return (DMA2D->IF & DMA2D_IF_DONE_Msk) ? 1 : 0;
  187. }