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