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
25 /******************************************************************************************************************************************
26 * 函数名称: DMA2D_Init()
27 * 功能说明: DMA2D初始化
28 * 输 入: DMA2D_InitStructure * initStruct
29 * 输 出: 无
30 * 注意事项: 无
31 ******************************************************************************************************************************************/
DMA2D_Init(DMA2D_InitStructure * initStruct)32 void DMA2D_Init(DMA2D_InitStructure * initStruct)
33 {
34 SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos);
35
36 DMA2D->CR &= ~DMA2D_CR_WAIT_Msk;
37 DMA2D->CR |= (initStruct->Interval << DMA2D_CR_WAIT_Pos);
38
39 DMA2D->IF = 0xFF;
40 DMA2D->IE = (initStruct->IntEOTEn << DMA2D_IE_DONE_Pos);
41
42 if(initStruct->IntEOTEn)
43 NVIC_EnableIRQ(DMA2D_IRQn);
44 }
45
46
47 /******************************************************************************************************************************************
48 * 函数名称: DMA2D_PixelFill()
49 * 功能说明: DMA2D向指定存储器区域填充指定颜色
50 * 输 入: DMA2D_LayerSetting * outLayer 要填充的位置、大小、颜色格式等
51 * uint32_t color 要填充的颜色
52 * 输 出: 无
53 * 注意事项: 无
54 ******************************************************************************************************************************************/
DMA2D_PixelFill(DMA2D_LayerSetting * outLayer,uint32_t color)55 void DMA2D_PixelFill(DMA2D_LayerSetting * outLayer, uint32_t color)
56 {
57 DMA2D->L[DMA2D_LAYER_OUT].COLOR = color;
58
59 DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
60 DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
61 DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
62
63 DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
64 ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
65
66 DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
67 DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) |
68 (1 << DMA2D_CR_START_Pos);
69 }
70
71
72 /******************************************************************************************************************************************
73 * 函数名称: DMA2D_PixelMove()
74 * 功能说明: DMA2D像素数据搬运
75 * 输 入: DMA2D_LayerSetting * fgLayer
76 * DMA2D_LayerSetting * outLayer
77 * 输 出: 无
78 * 注意事项: 无
79 ******************************************************************************************************************************************/
DMA2D_PixelMove(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * outLayer)80 void DMA2D_PixelMove(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
81 {
82 DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
83 DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
84 DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
85
86 DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
87 DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
88
89 DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
90 ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
91
92 DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
93 DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) |
94 (1 << DMA2D_CR_START_Pos);
95 }
96
97
98 /******************************************************************************************************************************************
99 * 函数名称: DMA2D_PixelConvert()
100 * 功能说明: DMA2D像素转换
101 * 输 入: DMA2D_LayerSetting * fgLayer
102 * DMA2D_LayerSetting * outLayer
103 * 输 出: 无
104 * 注意事项: 无
105 ******************************************************************************************************************************************/
DMA2D_PixelConvert(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * outLayer)106 void DMA2D_PixelConvert(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
107 {
108 DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
109 DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
110 DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
111
112 DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
113 DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
114 DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
115
116 DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
117 ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
118
119 DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
120 DMA2D->CR |= (1 << DMA2D_CR_MODE_Pos) |
121 (1 << DMA2D_CR_START_Pos);
122 }
123
124
125 /******************************************************************************************************************************************
126 * 函数名称: DMA2D_PixelBlend()
127 * 功能说明: DMA2D像素混合
128 * 输 入: DMA2D_LayerSetting * fgLayer
129 * DMA2D_LayerSetting * bgLayer
130 * DMA2D_LayerSetting * outLayer
131 * 输 出: 无
132 * 注意事项: 无
133 ******************************************************************************************************************************************/
DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * bgLayer,DMA2D_LayerSetting * outLayer)134 void DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * bgLayer, DMA2D_LayerSetting * outLayer)
135 {
136 DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
137 DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
138 DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
139 (fgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
140 (fgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
141
142 DMA2D->L[DMA2D_LAYER_BG].MAR = bgLayer->Address;
143 DMA2D->L[DMA2D_LAYER_BG].OR = bgLayer->LineOffset;
144 DMA2D->L[DMA2D_LAYER_BG].PFCCR = (bgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
145 (bgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
146 (bgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
147
148 DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
149 DMA2D->L[DMA2D_LAYER_OUT].OR = outLayer->LineOffset;
150 DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
151
152 DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
153 ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
154
155 DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
156 DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) |
157 (1 << DMA2D_CR_START_Pos);
158 }
159
160
161 /******************************************************************************************************************************************
162 * 函数名称: DMA2D_IsBusy()
163 * 功能说明: DMA2D忙查询
164 * 输 入: 无
165 * 输 出: uint32_t 1 正在传输 0 传输完成
166 * 注意事项: 无
167 ******************************************************************************************************************************************/
DMA2D_IsBusy(void)168 uint32_t DMA2D_IsBusy(void)
169 {
170 return (DMA2D->CR & DMA2D_CR_START_Msk) ? 1 : 0;
171 }
172
173
174 /******************************************************************************************************************************************
175 * 函数名称: DMA2D_INTEn()
176 * 功能说明: DMA2D中断使能,完成指定长度的数据传输时触发中断
177 * 输 入: 无
178 * 输 出: 无
179 * 注意事项: 无
180 ******************************************************************************************************************************************/
DMA2D_INTEn(void)181 void DMA2D_INTEn(void)
182 {
183 DMA2D->IE = DMA2D_IE_DONE_Msk;
184 }
185
186 /******************************************************************************************************************************************
187 * 函数名称: DMA2D_INTDis()
188 * 功能说明: DMA2D中断禁止,完成指定长度的数据传输时不触发中断
189 * 输 入: 无
190 * 输 出: 无
191 * 注意事项: 无
192 ******************************************************************************************************************************************/
DMA2D_INTDis(void)193 void DMA2D_INTDis(void)
194 {
195 DMA2D->IE = 0;
196 }
197
198 /******************************************************************************************************************************************
199 * 函数名称: DMA2D_INTClr()
200 * 功能说明: DMA2D中断标志清除
201 * 输 入: 无
202 * 输 出: 无
203 * 注意事项: 无
204 ******************************************************************************************************************************************/
DMA2D_INTClr(void)205 void DMA2D_INTClr(void)
206 {
207 DMA2D->IF = DMA2D_IF_DONE_Msk;
208 }
209
210 /******************************************************************************************************************************************
211 * 函数名称: DMA2D_INTStat()
212 * 功能说明: DMA2D中断状态查询
213 * 输 入: 无
214 * 输 出: uint32_t 0 未完成指定长度的数据传输 1 完成指定长度的数据传输
215 * 注意事项: 无
216 ******************************************************************************************************************************************/
DMA2D_INTStat(void)217 uint32_t DMA2D_INTStat(void)
218 {
219 return (DMA2D->IF & DMA2D_IF_DONE_Msk) ? 1 : 0;
220 }
221