1 /*
2 * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "hal_dac.h"
9
DAC_Init(DAC_Type * DACx,uint32_t channel,DAC_Init_Type * init)10 void DAC_Init(DAC_Type * DACx, uint32_t channel, DAC_Init_Type * init)
11 {
12 uint32_t cr = 0u;
13
14 cr = DACx->CR & ~(( DAC_CR_BOFF1_MASK
15 | DAC_CR_TEN1_MASK
16 | DAC_CR_TSEL1_MASK
17 ) << (channel<<4u)); /* Calculate the shift and clear the indicated bit. */
18
19 /* Enable Output Buffer. */
20 if (init->EnableOutBuf == false)
21 {
22 cr |= (DAC_CR_BOFF1_MASK << (channel<<4u));
23 }
24
25 /* Trigger Source. */
26 if (init->TrgSource < DAC_TrgSource_None)
27 {
28 cr |= ((DAC_CR_TEN1_MASK | DAC_CR_TSEL1(init->TrgSource)) << (channel<<4u));
29 }
30
31 DAC->CR = cr;
32 }
33
DAC_Enable(DAC_Type * DACx,uint32_t channel,bool enable)34 void DAC_Enable(DAC_Type * DACx, uint32_t channel, bool enable)
35 {
36 if (enable)
37 {
38 DACx->CR |= (DAC_CR_EN1_MASK << (channel << 4u));
39 }
40 else
41 {
42 DACx->CR &= ~(DAC_CR_EN1_MASK << (channel << 4u));
43 }
44 }
45
DAC_GetData(DAC_Type * DACx,uint32_t channel)46 uint32_t DAC_GetData(DAC_Type * DACx, uint32_t channel)
47 {
48 uint32_t ret = 0u;
49
50 if(channel == DAC_CHN_1)
51 {
52 ret = (DACx->DOR1 & DAC_DOR1_DACC1DOR_MASK);
53 }
54 else if (channel == DAC_CHN_2)
55 {
56 ret = (DACx->DOR2 & DAC_DOR2_DACC2DOR_MASK);
57 }
58
59 return ret;
60 }
61
DAC_PutData(DAC_Type * DACx,uint32_t channel,uint32_t value,DAC_Align_Type align)62 uint32_t DAC_PutData(DAC_Type * DACx, uint32_t channel, uint32_t value, DAC_Align_Type align)
63 {
64 uint32_t ret = 0u;
65
66 switch (align)
67 {
68 case DAC_Align_8b_Dual:
69 {
70 DAC_PutDualChannelData8bRightAlign(DACx, value);
71 ret = DAC_GetData(DACx, DAC_CHN_1) | ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
72 break;
73 }
74 case DAC_Align_8b_Right:
75 {
76 DAC_PutData8bRightAlign(DACx, channel, value);
77 ret = DAC_GetData(DACx, channel);
78 break;
79 }
80 case DAC_Align_12b_Left:
81 {
82 DAC_PutData12bLeftAlign(DACx, channel, value);
83 ret = DAC_GetData(DACx, channel);
84 break;
85 }
86 case DAC_Align_12b_Right:
87 {
88 DAC_PutData12bRightAlign(DACx, channel, value);
89 ret = DAC_GetData(DACx, channel);
90 break;
91 }
92 case DAC_Align_12b_Dual_Left:
93 {
94 DAC_PutDualChannelData12bLeftAlign(DACx, value);
95 ret = DAC_GetData(DACx, DAC_CHN_1)
96 | ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
97 break;
98 }
99 case DAC_Align_12b_Dual_Right:
100 {
101 DAC_PutDualChannelData12bRightAlign(DACx, value);
102 ret = DAC_GetData(DACx, DAC_CHN_1)
103 | ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
104 break;
105 }
106 default:
107 break;
108 }
109 return ret;
110 }
111
DAC_EnableAddNoise(DAC_Type * DACx,uint32_t channel,DAC_AddNoise_Init_Type * init)112 void DAC_EnableAddNoise(DAC_Type * DACx, uint32_t channel, DAC_AddNoise_Init_Type * init)
113 {
114 if (init == NULL)
115 {
116 DAC->CR &= ~(DAC_CR_WAVE1_MASK << (channel << 4u));
117 }
118 else
119 {
120 DAC->CR |= (( DAC_CR_WAVE1(1u) /* Noise wave need to set WAVEx = 01. */
121 | DAC_CR_MAMP1(init->AddNoise)
122 ) << (channel << 4u));
123 }
124 }
125
DAC_EnableAddTriangle(DAC_Type * DACx,uint32_t channel,DAC_AddTriangle_Init_Type * init)126 void DAC_EnableAddTriangle(DAC_Type * DACx, uint32_t channel, DAC_AddTriangle_Init_Type * init)
127 {
128 if (init == NULL)
129 {
130 DAC->CR &= ~(DAC_CR_WAVE1_MASK << (channel << 4u));
131 }
132 else
133 {
134 DAC->CR |= (( DAC_CR_WAVE1(2u) /* Noise wave need to set WAVEx = 1x. */
135 | DAC_CR_MAMP1(init->AddTriangle)
136 ) << (channel << 4u));
137 }
138 }
139
DAC_EnableDMA(DAC_Type * DACx,uint32_t channel,bool enable)140 void DAC_EnableDMA(DAC_Type * DACx, uint32_t channel, bool enable)
141 {
142 if (enable)
143 {
144 DACx->CR |= (DAC_CR_DMAEN1_MASK << (channel<<4u));
145 }
146 else
147 {
148 DACx->CR &= ~(DAC_CR_DMAEN1_MASK << (channel<<4u));
149 }
150 }
151
DAC_DoSwTrigger(DAC_Type * DACx,uint32_t channel)152 void DAC_DoSwTrigger(DAC_Type * DACx, uint32_t channel)
153 {
154 DACx->SWTRIGR |= (DAC_SWTRIGR_SWTRIG1_MASK << channel);
155 }
156
DAC_DoDualChannelSwTrigger(DAC_Type * DACx)157 void DAC_DoDualChannelSwTrigger(DAC_Type * DACx)
158 {
159 DACx->SWTRIGR |= DAC_SWTRIGR_SWTRIG1_MASK
160 | DAC_SWTRIGR_SWTRIG2_MASK
161 ;
162 }
163
DAC_GetDataRegAddr(DAC_Type * DACx,uint32_t channel,DAC_Align_Type align)164 uint32_t DAC_GetDataRegAddr(DAC_Type * DACx, uint32_t channel, DAC_Align_Type align)
165 {
166 uint32_t ret = 0u;
167
168 switch (align)
169 {
170 case DAC_Align_8b_Dual:
171 {
172 ret = DAC_GetDualChannelData8bRegAddr(DACx);
173 break;
174 }
175 case DAC_Align_8b_Right:
176 {
177 ret = DAC_GetData8bRegAddr(DACx, channel);
178 break;
179 }
180 case DAC_Align_12b_Left:
181 {
182 ret = DAC_GetData12bLeftRegAddr(DACx, channel);
183 break;
184 }
185 case DAC_Align_12b_Right:
186 {
187 ret = DAC_GetData12bRightRegAddr(DACx, channel);
188 break;
189 }
190 case DAC_Align_12b_Dual_Left:
191 {
192 ret = DAC_GetDualChannelData12bLeftRegAddr(DACx);
193 break;
194 }
195 case DAC_Align_12b_Dual_Right:
196 {
197 ret = DAC_GetDualChannelData12bRightRegAddr(DACx);
198 break;
199 }
200 default:
201 break;
202 }
203 return ret;
204 }
205
206 /* input value bit[7:0]. 12b output: xxxxxxxx0000. */
DAC_PutData8bRightAlign(DAC_Type * DACx,uint32_t channel,uint32_t value)207 void DAC_PutData8bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
208 {
209 if (channel == DAC_CHN_1)
210 {
211 DACx->DHR8R1 = value;
212 }
213 else if (channel == DAC_CHN_2)
214 {
215 DACx->DHR8R2 = value;
216 }
217 }
218
219 /* input value bit[15:4]. 12b output: xxxxxxxxxxxx. */
DAC_PutData12bLeftAlign(DAC_Type * DACx,uint32_t channel,uint32_t value)220 void DAC_PutData12bLeftAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
221 {
222 if (channel == DAC_CHN_1)
223 {
224 DACx->DHR12L1 = value;
225 }
226 else if (channel == DAC_CHN_2)
227 {
228 DACx->DHR12L2 = value;
229 }
230 }
231
232 /* input value bit[11:0], 12b output: xxxxxxxxxxxx. */
DAC_PutData12bRightAlign(DAC_Type * DACx,uint32_t channel,uint32_t value)233 void DAC_PutData12bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
234 {
235 if (channel == DAC_CHN_1)
236 {
237 DACx->DHR12R1 = value;
238 }
239 else if (channel == DAC_CHN_2)
240 {
241 DACx->DHR12R2 = value;
242 }
243 }
244
245 /* bit[15:8] for channel 2, bit[7:0] for channel 1. */
DAC_PutDualChannelData8bRightAlign(DAC_Type * DACx,uint32_t value)246 void DAC_PutDualChannelData8bRightAlign(DAC_Type * DACx, uint32_t value)
247 {
248 DACx->DHR8RD = value;
249 }
250
251 /* bit[31:16] for channel 2, bit[15:0] for channel 1. */
DAC_PutDualChannelData12bLeftAlign(DAC_Type * DACx,uint32_t value)252 void DAC_PutDualChannelData12bLeftAlign(DAC_Type * DACx, uint32_t value)
253 {
254 DACx->DHR12LD = value;
255 }
256
257 /* bit[31:16] for channel 2, bit[15:0] for channel 1. */
DAC_PutDualChannelData12bRightAlign(DAC_Type * DACx,uint32_t value)258 void DAC_PutDualChannelData12bRightAlign(DAC_Type * DACx, uint32_t value)
259 {
260 DACx->DHR12RD = value;
261 }
262
DAC_GetData8bRegAddr(DAC_Type * DACx,uint32_t channel)263 uint32_t DAC_GetData8bRegAddr(DAC_Type * DACx, uint32_t channel)
264 {
265 uint32_t ret = 0u;
266
267 if (channel == DAC_CHN_1)
268 {
269 ret = (uint32_t)(&(DACx->DHR8R1));
270 }
271 else if (channel == DAC_CHN_2)
272 {
273 ret = (uint32_t)(&(DACx->DHR8R2));
274 }
275
276 return ret;
277 }
278
DAC_GetData12bLeftRegAddr(DAC_Type * DACx,uint32_t channel)279 uint32_t DAC_GetData12bLeftRegAddr(DAC_Type * DACx, uint32_t channel)
280 {
281 uint32_t ret = 0u;
282
283 if (channel == DAC_CHN_1)
284 {
285 ret = (uint32_t)(&(DACx->DHR12L1));
286 }
287 else if (channel == DAC_CHN_2)
288 {
289 ret = (uint32_t)(&(DACx->DHR12L2));
290 }
291
292 return ret;
293 }
294
DAC_GetData12bRightRegAddr(DAC_Type * DACx,uint32_t channel)295 uint32_t DAC_GetData12bRightRegAddr(DAC_Type * DACx, uint32_t channel)
296 {
297 uint32_t ret = 0;
298
299 if (channel == DAC_CHN_1)
300 {
301 ret = (uint32_t)(&(DACx->DHR12R1));
302 }
303 else if (channel == DAC_CHN_2)
304 {
305 ret = (uint32_t)(&(DACx->DHR12R2));
306 }
307
308 return ret;
309 }
310
DAC_GetDualChannelData8bRegAddr(DAC_Type * DACx)311 uint32_t DAC_GetDualChannelData8bRegAddr(DAC_Type * DACx)
312 {
313 return (uint32_t)(&(DACx->DHR8RD));
314 }
315
DAC_GetDualChannelData12bLeftRegAddr(DAC_Type * DACx)316 uint32_t DAC_GetDualChannelData12bLeftRegAddr(DAC_Type * DACx)
317 {
318 return (uint32_t)(&(DACx->DHR12LD));
319 }
320
DAC_GetDualChannelData12bRightRegAddr(DAC_Type * DACx)321 uint32_t DAC_GetDualChannelData12bRightRegAddr(DAC_Type * DACx)
322 {
323 return (uint32_t)(&(DACx->DHR12RD));
324 }
325
326 /* EOF. */
327
328