]> git.sur5r.net Git - freertos/blob
0b65889d3d073e89e35fd02d9ee5940ff01e35b6
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_dac.h\r
3  * @brief Digital to Analog Converter (DAC) peripheral API\r
4  * @version 4.0.0\r
5  *******************************************************************************\r
6  * @section License\r
7  * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>\r
8  *******************************************************************************\r
9  *\r
10  * Permission is granted to anyone to use this software for any purpose,\r
11  * including commercial applications, and to alter it and redistribute it\r
12  * freely, subject to the following restrictions:\r
13  *\r
14  * 1. The origin of this software must not be misrepresented; you must not\r
15  *    claim that you wrote the original software.\r
16  * 2. Altered source versions must be plainly marked as such, and must not be\r
17  *    misrepresented as being the original software.\r
18  * 3. This notice may not be removed or altered from any source distribution.\r
19  *\r
20  * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no\r
21  * obligation to support this Software. Silicon Labs is providing the\r
22  * Software "AS IS", with no express or implied warranties of any kind,\r
23  * including, but not limited to, any implied warranties of merchantability\r
24  * or fitness for any particular purpose or warranties against infringement\r
25  * of any proprietary rights of a third party.\r
26  *\r
27  * Silicon Labs will not be liable for any consequential, incidental, or\r
28  * special damages, or any other relief, or for any claim by any third party,\r
29  * arising from your use of this Software.\r
30  *\r
31  ******************************************************************************/\r
32 \r
33 \r
34 #ifndef __EM_DAC_H\r
35 #define __EM_DAC_H\r
36 \r
37 #include "em_device.h"\r
38 #include "em_assert.h"\r
39 \r
40 #if defined(DAC_COUNT) && (DAC_COUNT > 0)\r
41 \r
42 #include <stdbool.h>\r
43 \r
44 #ifdef __cplusplus\r
45 extern "C" {\r
46 #endif\r
47 \r
48 \r
49 /***************************************************************************//**\r
50  * @addtogroup EM_Library\r
51  * @{\r
52  ******************************************************************************/\r
53 \r
54 /***************************************************************************//**\r
55  * @addtogroup DAC\r
56  * @{\r
57  ******************************************************************************/\r
58 \r
59 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */\r
60 \r
61 /** Validation of DAC register block pointer reference for assert statements. */\r
62 #define DAC_REF_VALID(ref)    ((ref) == DAC0)\r
63 \r
64 /** @endcond */\r
65 \r
66 /*******************************************************************************\r
67  ********************************   ENUMS   ************************************\r
68  ******************************************************************************/\r
69 \r
70 /** Conversion mode. */\r
71 typedef enum\r
72 {\r
73   dacConvModeContinuous = _DAC_CTRL_CONVMODE_CONTINUOUS, /**< Continuous mode. */\r
74   dacConvModeSampleHold = _DAC_CTRL_CONVMODE_SAMPLEHOLD, /**< Sample/hold mode. */\r
75   dacConvModeSampleOff  = _DAC_CTRL_CONVMODE_SAMPLEOFF   /**< Sample/shut off mode. */\r
76 } DAC_ConvMode_TypeDef;\r
77 \r
78 /** Output mode. */\r
79 typedef enum\r
80 {\r
81   dacOutputDisable = _DAC_CTRL_OUTMODE_DISABLE, /**< Output to pin and ADC disabled. */\r
82   dacOutputPin     = _DAC_CTRL_OUTMODE_PIN,     /**< Output to pin only. */\r
83   dacOutputADC     = _DAC_CTRL_OUTMODE_ADC,     /**< Output to ADC only */\r
84   dacOutputPinADC  = _DAC_CTRL_OUTMODE_PINADC   /**< Output to pin and ADC. */\r
85 } DAC_Output_TypeDef;\r
86 \r
87 \r
88 /** Peripheral Reflex System signal used to trigger single sample. */\r
89 typedef enum\r
90 {\r
91   dacPRSSELCh0 = _DAC_CH0CTRL_PRSSEL_PRSCH0, /**< PRS channel 0. */\r
92   dacPRSSELCh1 = _DAC_CH0CTRL_PRSSEL_PRSCH1, /**< PRS channel 1. */\r
93   dacPRSSELCh2 = _DAC_CH0CTRL_PRSSEL_PRSCH2, /**< PRS channel 2. */\r
94   dacPRSSELCh3 = _DAC_CH0CTRL_PRSSEL_PRSCH3, /**< PRS channel 3. */\r
95 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH4 )\r
96   dacPRSSELCh4 = _DAC_CH0CTRL_PRSSEL_PRSCH4, /**< PRS channel 4. */\r
97 #endif\r
98 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH5 )\r
99   dacPRSSELCh5 = _DAC_CH0CTRL_PRSSEL_PRSCH5, /**< PRS channel 5. */\r
100 #endif\r
101 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH6 )\r
102   dacPRSSELCh6 = _DAC_CH0CTRL_PRSSEL_PRSCH6, /**< PRS channel 6. */\r
103 #endif\r
104 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH7 )\r
105   dacPRSSELCh7 = _DAC_CH0CTRL_PRSSEL_PRSCH7, /**< PRS channel 7. */\r
106 #endif\r
107 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH8 )\r
108   dacPRSSELCh8 = _DAC_CH0CTRL_PRSSEL_PRSCH8, /**< PRS channel 8. */\r
109 #endif\r
110 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH9 )\r
111   dacPRSSELCh9 = _DAC_CH0CTRL_PRSSEL_PRSCH9, /**< PRS channel 9. */\r
112 #endif\r
113 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH10 )\r
114   dacPRSSELCh10 = _DAC_CH0CTRL_PRSSEL_PRSCH10, /**< PRS channel 10. */\r
115 #endif\r
116 #if defined( _DAC_CH0CTRL_PRSSEL_PRSCH11 )\r
117   dacPRSSELCh11 = _DAC_CH0CTRL_PRSSEL_PRSCH11, /**< PRS channel 11. */\r
118 #endif\r
119 } DAC_PRSSEL_TypeDef;\r
120 \r
121 \r
122 /** Reference voltage for DAC. */\r
123 typedef enum\r
124 {\r
125   dacRef1V25 = _DAC_CTRL_REFSEL_1V25, /**< Internal 1.25V bandgap reference. */\r
126   dacRef2V5  = _DAC_CTRL_REFSEL_2V5,  /**< Internal 2.5V bandgap reference. */\r
127   dacRefVDD  = _DAC_CTRL_REFSEL_VDD   /**< VDD reference. */\r
128 } DAC_Ref_TypeDef;\r
129 \r
130 \r
131 /** Refresh interval. */\r
132 typedef enum\r
133 {\r
134   dacRefresh8  = _DAC_CTRL_REFRSEL_8CYCLES,  /**< Refresh every 8 prescaled cycles. */\r
135   dacRefresh16 = _DAC_CTRL_REFRSEL_16CYCLES, /**< Refresh every 16 prescaled cycles. */\r
136   dacRefresh32 = _DAC_CTRL_REFRSEL_32CYCLES, /**< Refresh every 32 prescaled cycles. */\r
137   dacRefresh64 = _DAC_CTRL_REFRSEL_64CYCLES  /**< Refresh every 64 prescaled cycles. */\r
138 } DAC_Refresh_TypeDef;\r
139 \r
140 \r
141 /*******************************************************************************\r
142  *******************************   STRUCTS   ***********************************\r
143  ******************************************************************************/\r
144 \r
145 /** DAC init structure, common for both channels. */\r
146 typedef struct\r
147 {\r
148   /** Refresh interval. Only used if REFREN bit set for a DAC channel. */\r
149   DAC_Refresh_TypeDef  refresh;\r
150 \r
151   /** Reference voltage to use. */\r
152   DAC_Ref_TypeDef      reference;\r
153 \r
154   /** Output mode */\r
155   DAC_Output_TypeDef   outMode;\r
156 \r
157   /** Conversion mode. */\r
158   DAC_ConvMode_TypeDef convMode;\r
159 \r
160   /**\r
161    * Prescaler used to get DAC clock. Derived as follows:\r
162    * DACclk=HFPERclk/(2^prescale). The DAC clock should be <= 1MHz.\r
163    */\r
164   uint8_t              prescale;\r
165 \r
166   /** Enable/disable use of low pass filter on output. */\r
167   bool                 lpEnable;\r
168 \r
169   /** Enable/disable reset of prescaler on ch0 start. */\r
170   bool                 ch0ResetPre;\r
171 \r
172   /** Enable/disable output enable control by CH1 PRS signal. */\r
173   bool                 outEnablePRS;\r
174 \r
175   /** Enable/disable sine mode. */\r
176   bool                 sineEnable;\r
177 \r
178   /** Select if single ended or differential mode. */\r
179   bool                 diff;\r
180 } DAC_Init_TypeDef;\r
181 \r
182 /** Default config for DAC init structure. */\r
183 #define DAC_INIT_DEFAULT                                                 \\r
184   { dacRefresh8,              /* Refresh every 8 prescaled cycles. */    \\r
185     dacRef1V25,               /* 1.25V internal reference. */            \\r
186     dacOutputPin,             /* Output to pin only. */                  \\r
187     dacConvModeContinuous,    /* Continuous mode. */                     \\r
188     0,                        /* No prescaling. */                       \\r
189     false,                    /* Do not enable low pass filter. */       \\r
190     false,                    /* Do not reset prescaler on ch0 start. */ \\r
191     false,                    /* DAC output enable always on. */         \\r
192     false,                    /* Disable sine mode. */                   \\r
193     false                     /* Single ended mode. */                   \\r
194   }\r
195 \r
196 \r
197 /** DAC channel init structure. */\r
198 typedef struct\r
199 {\r
200   /** Enable channel. */\r
201   bool               enable;\r
202 \r
203   /**\r
204    * Peripheral reflex system trigger enable. If false, channel is triggered\r
205    * by writing to CHnDATA.\r
206    */\r
207   bool               prsEnable;\r
208 \r
209   /**\r
210    * Enable/disable automatic refresh of channel. Refresh interval must be\r
211    * defined in common control init, please see DAC_Init().\r
212    */\r
213   bool               refreshEnable;\r
214 \r
215   /**\r
216    * Peripheral reflex system trigger selection. Only applicable if @p prsEnable\r
217    * is enabled.\r
218    */\r
219   DAC_PRSSEL_TypeDef prsSel;\r
220 } DAC_InitChannel_TypeDef;\r
221 \r
222 /** Default config for DAC channel init structure. */\r
223 #define DAC_INITCHANNEL_DEFAULT                                           \\r
224   { false,              /* Leave channel disabled when init done. */      \\r
225     false,              /* Disable PRS triggering. */                     \\r
226     false,              /* Channel not refreshed automatically. */        \\r
227     dacPRSSELCh0        /* Select PRS ch0 (if PRS triggering enabled). */ \\r
228   }\r
229 \r
230 \r
231 /*******************************************************************************\r
232  *****************************   PROTOTYPES   **********************************\r
233  ******************************************************************************/\r
234 \r
235 void DAC_Enable(DAC_TypeDef *dac, unsigned int ch, bool enable);\r
236 void DAC_Init(DAC_TypeDef *dac, const DAC_Init_TypeDef *init);\r
237 void DAC_InitChannel(DAC_TypeDef *dac,\r
238                      const DAC_InitChannel_TypeDef *init,\r
239                      unsigned int ch);\r
240 void DAC_ChannelOutputSet(DAC_TypeDef *dac,\r
241                           unsigned int channel,\r
242                           uint32_t     value);\r
243 \r
244 /***************************************************************************//**\r
245  * @brief\r
246  *   Set the output signal of DAC channel 0 to a given value.\r
247  *\r
248  * @details\r
249  *   This function sets the output signal of DAC channel 0 by writing @p value\r
250  *   to the CH0DATA register.\r
251  *\r
252  * @param[in] dac\r
253  *   Pointer to DAC peripheral register block.\r
254  *\r
255  * @param[in] value\r
256  *   Value to write to the channel 0 output register CH0DATA.\r
257  ******************************************************************************/\r
258 __STATIC_INLINE void DAC_Channel0OutputSet( DAC_TypeDef *dac,\r
259                                             uint32_t     value )\r
260 {\r
261   EFM_ASSERT(value<=_DAC_CH0DATA_MASK);\r
262   dac->CH0DATA = value;\r
263 }\r
264 \r
265 \r
266 /***************************************************************************//**\r
267  * @brief\r
268  *   Set the output signal of DAC channel 1 to a given value.\r
269  *\r
270  * @details\r
271  *   This function sets the output signal of DAC channel 1 by writing @p value\r
272  *   to the CH1DATA register.\r
273  *\r
274  * @param[in] dac\r
275  *   Pointer to DAC peripheral register block.\r
276  *\r
277  * @param[in] value\r
278  *   Value to write to the channel 1 output register CH1DATA.\r
279  ******************************************************************************/\r
280 __STATIC_INLINE void DAC_Channel1OutputSet( DAC_TypeDef *dac,\r
281                                             uint32_t     value )\r
282 {\r
283   EFM_ASSERT(value<=_DAC_CH1DATA_MASK);\r
284   dac->CH1DATA = value;\r
285 }\r
286 \r
287 \r
288 /***************************************************************************//**\r
289  * @brief\r
290  *   Clear one or more pending DAC interrupts.\r
291  *\r
292  * @param[in] dac\r
293  *   Pointer to DAC peripheral register block.\r
294  *\r
295  * @param[in] flags\r
296  *   Pending DAC interrupt source to clear. Use a bitwise logic OR combination of\r
297  *   valid interrupt flags for the DAC module (DAC_IF_nnn).\r
298  ******************************************************************************/\r
299 __STATIC_INLINE void DAC_IntClear(DAC_TypeDef *dac, uint32_t flags)\r
300 {\r
301   dac->IFC = flags;\r
302 }\r
303 \r
304 \r
305 /***************************************************************************//**\r
306  * @brief\r
307  *   Disable one or more DAC interrupts.\r
308  *\r
309  * @param[in] dac\r
310  *   Pointer to DAC peripheral register block.\r
311  *\r
312  * @param[in] flags\r
313  *   DAC interrupt sources to disable. Use a bitwise logic OR combination of\r
314  *   valid interrupt flags for the DAC module (DAC_IF_nnn).\r
315  ******************************************************************************/\r
316 __STATIC_INLINE void DAC_IntDisable(DAC_TypeDef *dac, uint32_t flags)\r
317 {\r
318   dac->IEN &= ~(flags);\r
319 }\r
320 \r
321 \r
322 /***************************************************************************//**\r
323  * @brief\r
324  *   Enable one or more DAC interrupts.\r
325  *\r
326  * @note\r
327  *   Depending on the use, a pending interrupt may already be set prior to\r
328  *   enabling the interrupt. Consider using DAC_IntClear() prior to enabling\r
329  *   if such a pending interrupt should be ignored.\r
330  *\r
331  * @param[in] dac\r
332  *   Pointer to DAC peripheral register block.\r
333  *\r
334  * @param[in] flags\r
335  *   DAC interrupt sources to enable. Use a bitwise logic OR combination of\r
336  *   valid interrupt flags for the DAC module (DAC_IF_nnn).\r
337  ******************************************************************************/\r
338 __STATIC_INLINE void DAC_IntEnable(DAC_TypeDef *dac, uint32_t flags)\r
339 {\r
340   dac->IEN |= flags;\r
341 }\r
342 \r
343 \r
344 /***************************************************************************//**\r
345  * @brief\r
346  *   Get pending DAC interrupt flags.\r
347  *\r
348  * @note\r
349  *   The event bits are not cleared by the use of this function.\r
350  *\r
351  * @param[in] dac\r
352  *   Pointer to DAC peripheral register block.\r
353  *\r
354  * @return\r
355  *   DAC interrupt sources pending. A bitwise logic OR combination of valid\r
356  *   interrupt flags for the DAC module (DAC_IF_nnn).\r
357  ******************************************************************************/\r
358 __STATIC_INLINE uint32_t DAC_IntGet(DAC_TypeDef *dac)\r
359 {\r
360   return(dac->IF);\r
361 }\r
362 \r
363 \r
364 /***************************************************************************//**\r
365  * @brief\r
366  *   Set one or more pending DAC interrupts from SW.\r
367  *\r
368  * @param[in] dac\r
369  *   Pointer to DAC peripheral register block.\r
370  *\r
371  * @param[in] flags\r
372  *   DAC interrupt sources to set to pending. Use a bitwise logic OR combination\r
373  *   of valid interrupt flags for the DAC module (DAC_IF_nnn).\r
374  ******************************************************************************/\r
375 __STATIC_INLINE void DAC_IntSet(DAC_TypeDef *dac, uint32_t flags)\r
376 {\r
377   dac->IFS = flags;\r
378 }\r
379 \r
380 uint8_t DAC_PrescaleCalc(uint32_t dacFreq, uint32_t hfperFreq);\r
381 void DAC_Reset(DAC_TypeDef *dac);\r
382 \r
383 /** @} (end addtogroup DAC) */\r
384 /** @} (end addtogroup EM_Library) */\r
385 \r
386 #ifdef __cplusplus\r
387 }\r
388 #endif\r
389 \r
390 #endif /* defined(DAC_COUNT) && (DAC_COUNT > 0) */\r
391 \r
392 #endif /* __EM_DAC_H */\r