]> git.sur5r.net Git - freertos/blob
14c6d820707ebb7e3b8043b6987f25a4850ce367
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_acmp.h\r
3  * @brief Analog Comparator (ACMP) peripheral API\r
4  * @version 4.2.1\r
5  *******************************************************************************\r
6  * @section License\r
7  * <b>(C) Copyright 2015 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 #ifndef __SILICON_LABS_EM_ACMP_H__\r
34 #define __SILICON_LABS_EM_ACMP_H__\r
35 \r
36 #include "em_device.h"\r
37 #if defined(ACMP_COUNT) && (ACMP_COUNT > 0)\r
38 \r
39 #include <stdint.h>\r
40 #include <stdbool.h>\r
41 \r
42 #ifdef __cplusplus\r
43 extern "C" {\r
44 #endif\r
45 \r
46 /***************************************************************************//**\r
47  * @addtogroup EM_Library\r
48  * @{\r
49  ******************************************************************************/\r
50 \r
51 /***************************************************************************//**\r
52  * @addtogroup ACMP\r
53  * @{\r
54  ******************************************************************************/\r
55 \r
56 /*******************************************************************************\r
57  ********************************   ENUMS   ************************************\r
58  ******************************************************************************/\r
59 \r
60 /** Resistor values used for the internal capacative sense resistor. See the\r
61  *  datasheet for your device for details on each resistor value. */\r
62 typedef enum\r
63 {\r
64   acmpResistor0 = _ACMP_INPUTSEL_CSRESSEL_RES0,   /**< Resistor value 0 */\r
65   acmpResistor1 = _ACMP_INPUTSEL_CSRESSEL_RES1,   /**< Resistor value 1 */\r
66   acmpResistor2 = _ACMP_INPUTSEL_CSRESSEL_RES2,   /**< Resistor value 2 */\r
67   acmpResistor3 = _ACMP_INPUTSEL_CSRESSEL_RES3,   /**< Resistor value 3 */\r
68 #if defined(_ACMP_INPUTSEL_CSRESSEL_RES4)\r
69   acmpResistor4 = _ACMP_INPUTSEL_CSRESSEL_RES4,   /**< Resistor value 4 */\r
70   acmpResistor5 = _ACMP_INPUTSEL_CSRESSEL_RES5,   /**< Resistor value 5 */\r
71   acmpResistor6 = _ACMP_INPUTSEL_CSRESSEL_RES6,   /**< Resistor value 6 */\r
72   acmpResistor7 = _ACMP_INPUTSEL_CSRESSEL_RES7,   /**< Resistor value 7 */\r
73 #endif\r
74 } ACMP_CapsenseResistor_TypeDef;\r
75 \r
76 /** Hysteresis level. See datasheet for your device for details on each\r
77  *  level. */\r
78 typedef enum\r
79 {\r
80 #if defined(_ACMP_CTRL_HYSTSEL_MASK)\r
81   acmpHysteresisLevel0 = _ACMP_CTRL_HYSTSEL_HYST0,       /**< Hysteresis level 0 */\r
82   acmpHysteresisLevel1 = _ACMP_CTRL_HYSTSEL_HYST1,       /**< Hysteresis level 1 */\r
83   acmpHysteresisLevel2 = _ACMP_CTRL_HYSTSEL_HYST2,       /**< Hysteresis level 2 */\r
84   acmpHysteresisLevel3 = _ACMP_CTRL_HYSTSEL_HYST3,       /**< Hysteresis level 3 */\r
85   acmpHysteresisLevel4 = _ACMP_CTRL_HYSTSEL_HYST4,       /**< Hysteresis level 4 */\r
86   acmpHysteresisLevel5 = _ACMP_CTRL_HYSTSEL_HYST5,       /**< Hysteresis level 5 */\r
87   acmpHysteresisLevel6 = _ACMP_CTRL_HYSTSEL_HYST6,       /**< Hysteresis level 6 */\r
88   acmpHysteresisLevel7 = _ACMP_CTRL_HYSTSEL_HYST7        /**< Hysteresis level 7 */\r
89 #endif\r
90 #if defined(_ACMP_HYSTERESIS0_HYST_MASK)\r
91   acmpHysteresisLevel0 = _ACMP_HYSTERESIS0_HYST_HYST0,   /**< Hysteresis level 0 */\r
92   acmpHysteresisLevel1 = _ACMP_HYSTERESIS0_HYST_HYST1,   /**< Hysteresis level 1 */\r
93   acmpHysteresisLevel2 = _ACMP_HYSTERESIS0_HYST_HYST2,   /**< Hysteresis level 2 */\r
94   acmpHysteresisLevel3 = _ACMP_HYSTERESIS0_HYST_HYST3,   /**< Hysteresis level 3 */\r
95   acmpHysteresisLevel4 = _ACMP_HYSTERESIS0_HYST_HYST4,   /**< Hysteresis level 4 */\r
96   acmpHysteresisLevel5 = _ACMP_HYSTERESIS0_HYST_HYST5,   /**< Hysteresis level 5 */\r
97   acmpHysteresisLevel6 = _ACMP_HYSTERESIS0_HYST_HYST6,   /**< Hysteresis level 6 */\r
98   acmpHysteresisLevel7 = _ACMP_HYSTERESIS0_HYST_HYST7,   /**< Hysteresis level 7 */\r
99   acmpHysteresisLevel8 = _ACMP_HYSTERESIS0_HYST_HYST8,   /**< Hysteresis level 8 */\r
100   acmpHysteresisLevel9 = _ACMP_HYSTERESIS0_HYST_HYST9,   /**< Hysteresis level 9 */\r
101   acmpHysteresisLevel10 = _ACMP_HYSTERESIS0_HYST_HYST10, /**< Hysteresis level 10 */\r
102   acmpHysteresisLevel11 = _ACMP_HYSTERESIS0_HYST_HYST11, /**< Hysteresis level 11 */\r
103   acmpHysteresisLevel12 = _ACMP_HYSTERESIS0_HYST_HYST12, /**< Hysteresis level 12 */\r
104   acmpHysteresisLevel13 = _ACMP_HYSTERESIS0_HYST_HYST13, /**< Hysteresis level 13 */\r
105   acmpHysteresisLevel14 = _ACMP_HYSTERESIS0_HYST_HYST14, /**< Hysteresis level 14 */\r
106   acmpHysteresisLevel15 = _ACMP_HYSTERESIS0_HYST_HYST15, /**< Hysteresis level 15 */\r
107 #endif\r
108 } ACMP_HysteresisLevel_TypeDef;\r
109 \r
110 #if defined(_ACMP_CTRL_WARMTIME_MASK)\r
111 /** ACMP warmup time. The delay is measured in HFPERCLK cycles and should\r
112  *  be at least 10 us. */\r
113 typedef enum\r
114 {\r
115   /** 4 HFPERCLK cycles warmup */\r
116   acmpWarmTime4   = _ACMP_CTRL_WARMTIME_4CYCLES,\r
117   /** 8 HFPERCLK cycles warmup */\r
118   acmpWarmTime8   = _ACMP_CTRL_WARMTIME_8CYCLES,\r
119   /** 16 HFPERCLK cycles warmup */\r
120   acmpWarmTime16  = _ACMP_CTRL_WARMTIME_16CYCLES,\r
121   /** 32 HFPERCLK cycles warmup */\r
122   acmpWarmTime32  = _ACMP_CTRL_WARMTIME_32CYCLES,\r
123   /** 64 HFPERCLK cycles warmup */\r
124   acmpWarmTime64  = _ACMP_CTRL_WARMTIME_64CYCLES,\r
125   /** 128 HFPERCLK cycles warmup */\r
126   acmpWarmTime128 = _ACMP_CTRL_WARMTIME_128CYCLES,\r
127   /** 256 HFPERCLK cycles warmup */\r
128   acmpWarmTime256 = _ACMP_CTRL_WARMTIME_256CYCLES,\r
129   /** 512 HFPERCLK cycles warmup */\r
130   acmpWarmTime512 = _ACMP_CTRL_WARMTIME_512CYCLES\r
131 } ACMP_WarmTime_TypeDef;\r
132 #endif\r
133 \r
134 #if defined(_ACMP_CTRL_INPUTRANGE_MASK)\r
135 /**\r
136  * Adjust performance of the ACMP for a given input voltage range\r
137  */\r
138 typedef enum\r
139 {\r
140   acmpInputRangeFull = _ACMP_CTRL_INPUTRANGE_FULL,      /**< Input can be from 0 to Vdd */\r
141   acmpInputRangeHigh = _ACMP_CTRL_INPUTRANGE_GTVDDDIV2, /**< Input will always be greater than Vdd/2 */\r
142   acmpInputRangeLow  = _ACMP_CTRL_INPUTRANGE_LTVDDDIV2  /**< Input will always be less than Vdd/2 */\r
143 } ACMP_InputRange_TypeDef;\r
144 #endif\r
145 \r
146 #if defined(_ACMP_CTRL_PWRSEL_MASK)\r
147 /**\r
148  * ACMP Power source.\r
149  */\r
150 typedef enum\r
151 {\r
152   acmpPowerSourceAvdd    = _ACMP_CTRL_PWRSEL_AVDD,    /**< Power the ACMP using the AVDD supply */\r
153   acmpPowerSourceVddVreg = _ACMP_CTRL_PWRSEL_VREGVDD, /**< Power the ACMP using the VREGVDD supply */\r
154   acmpPowerSourceIOVdd0  = _ACMP_CTRL_PWRSEL_IOVDD0,  /**< Power the ACMP using the IOVDD/IOVDD0 supply */\r
155   acmpPowerSourceIOVdd1  = _ACMP_CTRL_PWRSEL_IOVDD1,  /**< Power the ACMP using the IOVDD1 supply (if part has two I/O voltages) */\r
156 } ACMP_PowerSource_TypeDef;\r
157 #endif\r
158 \r
159 #if defined(_ACMP_CTRL_ACCURACY_MASK)\r
160 /**\r
161  * ACMP accuracy mode.\r
162  */\r
163 typedef enum\r
164 {\r
165   acmpAccuracyLow = _ACMP_CTRL_ACCURACY_LOW,   /**< Low-accuracy mode but consume less current */\r
166   acmpAccuracyHigh = _ACMP_CTRL_ACCURACY_HIGH  /**< High-accuracy mode but consume more current */\r
167 } ACMP_Accuracy_TypeDef;\r
168 #endif\r
169 \r
170 #if defined(_ACMP_INPUTSEL_VASEL_MASK)\r
171 /** ACMP Input to the VA divider. This enum is used to select the input for\r
172  *  the VA Divider */\r
173 typedef enum\r
174 {\r
175   acmpVAInputVDD       = _ACMP_INPUTSEL_VASEL_VDD,\r
176   acmpVAInputAPORT2YCH0  = _ACMP_INPUTSEL_VASEL_APORT2YCH0,\r
177   acmpVAInputAPORT2YCH2  = _ACMP_INPUTSEL_VASEL_APORT2YCH2,\r
178   acmpVAInputAPORT2YCH4  = _ACMP_INPUTSEL_VASEL_APORT2YCH4,\r
179   acmpVAInputAPORT2YCH6  = _ACMP_INPUTSEL_VASEL_APORT2YCH6,\r
180   acmpVAInputAPORT2YCH8  = _ACMP_INPUTSEL_VASEL_APORT2YCH8,\r
181   acmpVAInputAPORT2YCH10 = _ACMP_INPUTSEL_VASEL_APORT2YCH10,\r
182   acmpVAInputAPORT2YCH12 = _ACMP_INPUTSEL_VASEL_APORT2YCH12,\r
183   acmpVAInputAPORT2YCH14 = _ACMP_INPUTSEL_VASEL_APORT2YCH14,\r
184   acmpVAInputAPORT2YCH16 = _ACMP_INPUTSEL_VASEL_APORT2YCH16,\r
185   acmpVAInputAPORT2YCH18 = _ACMP_INPUTSEL_VASEL_APORT2YCH18,\r
186   acmpVAInputAPORT2YCH20 = _ACMP_INPUTSEL_VASEL_APORT2YCH20,\r
187   acmpVAInputAPORT2YCH22 = _ACMP_INPUTSEL_VASEL_APORT2YCH22,\r
188   acmpVAInputAPORT2YCH24 = _ACMP_INPUTSEL_VASEL_APORT2YCH24,\r
189   acmpVAInputAPORT2YCH26 = _ACMP_INPUTSEL_VASEL_APORT2YCH26,\r
190   acmpVAInputAPORT2YCH28 = _ACMP_INPUTSEL_VASEL_APORT2YCH28,\r
191   acmpVAInputAPORT2YCH30 = _ACMP_INPUTSEL_VASEL_APORT2YCH30,\r
192   acmpVAInputAPORT1XCH0  = _ACMP_INPUTSEL_VASEL_APORT1XCH0,\r
193   acmpVAInputAPORT1YCH1  = _ACMP_INPUTSEL_VASEL_APORT1YCH1,\r
194   acmpVAInputAPORT1XCH2  = _ACMP_INPUTSEL_VASEL_APORT1XCH2,\r
195   acmpVAInputAPORT1YCH3  = _ACMP_INPUTSEL_VASEL_APORT1YCH3,\r
196   acmpVAInputAPORT1XCH4  = _ACMP_INPUTSEL_VASEL_APORT1XCH4,\r
197   acmpVAInputAPORT1YCH5  = _ACMP_INPUTSEL_VASEL_APORT1YCH5,\r
198   acmpVAInputAPORT1XCH6  = _ACMP_INPUTSEL_VASEL_APORT1XCH6,\r
199   acmpVAInputAPORT1YCH7  = _ACMP_INPUTSEL_VASEL_APORT1YCH7,\r
200   acmpVAInputAPORT1XCH8  = _ACMP_INPUTSEL_VASEL_APORT1XCH8,\r
201   acmpVAInputAPORT1YCH9  = _ACMP_INPUTSEL_VASEL_APORT1YCH9,\r
202   acmpVAInputAPORT1XCH10 = _ACMP_INPUTSEL_VASEL_APORT1XCH10,\r
203   acmpVAInputAPORT1YCH11 = _ACMP_INPUTSEL_VASEL_APORT1YCH11,\r
204   acmpVAInputAPORT1XCH12 = _ACMP_INPUTSEL_VASEL_APORT1XCH12,\r
205   acmpVAInputAPORT1YCH13 = _ACMP_INPUTSEL_VASEL_APORT1YCH13,\r
206   acmpVAInputAPORT1XCH14 = _ACMP_INPUTSEL_VASEL_APORT1XCH14,\r
207   acmpVAInputAPORT1YCH15 = _ACMP_INPUTSEL_VASEL_APORT1YCH15,\r
208   acmpVAInputAPORT1XCH16 = _ACMP_INPUTSEL_VASEL_APORT1XCH16,\r
209   acmpVAInputAPORT1YCH17 = _ACMP_INPUTSEL_VASEL_APORT1YCH17,\r
210   acmpVAInputAPORT1XCH18 = _ACMP_INPUTSEL_VASEL_APORT1XCH18,\r
211   acmpVAInputAPORT1YCH19 = _ACMP_INPUTSEL_VASEL_APORT1YCH19,\r
212   acmpVAInputAPORT1XCH20 = _ACMP_INPUTSEL_VASEL_APORT1XCH20,\r
213   acmpVAInputAPORT1YCH21 = _ACMP_INPUTSEL_VASEL_APORT1YCH21,\r
214   acmpVAInputAPORT1XCH22 = _ACMP_INPUTSEL_VASEL_APORT1XCH22,\r
215   acmpVAInputAPORT1YCH23 = _ACMP_INPUTSEL_VASEL_APORT1YCH23,\r
216   acmpVAInputAPORT1XCH24 = _ACMP_INPUTSEL_VASEL_APORT1XCH24,\r
217   acmpVAInputAPORT1YCH25 = _ACMP_INPUTSEL_VASEL_APORT1YCH25,\r
218   acmpVAInputAPORT1XCH26 = _ACMP_INPUTSEL_VASEL_APORT1XCH26,\r
219   acmpVAInputAPORT1YCH27 = _ACMP_INPUTSEL_VASEL_APORT1YCH27,\r
220   acmpVAInputAPORT1XCH28 = _ACMP_INPUTSEL_VASEL_APORT1XCH28,\r
221   acmpVAInputAPORT1YCH29 = _ACMP_INPUTSEL_VASEL_APORT1YCH29,\r
222   acmpVAInputAPORT1XCH30 = _ACMP_INPUTSEL_VASEL_APORT1XCH30,\r
223   acmpVAInputAPORT1YCH31 = _ACMP_INPUTSEL_VASEL_APORT1YCH31\r
224 } ACMP_VAInput_TypeDef;\r
225 #endif\r
226 \r
227 #if defined(_ACMP_INPUTSEL_VBSEL_MASK)\r
228 /**\r
229  * ACMP Input to the VB divider. This enum is used to select the input for\r
230  * the VB divider.\r
231  */\r
232 typedef enum\r
233 {\r
234   acmpVBInput1V25 = _ACMP_INPUTSEL_VBSEL_1V25,\r
235   acmpVBInput2V5  = _ACMP_INPUTSEL_VBSEL_2V5\r
236 } ACMP_VBInput_TypeDef;\r
237 #endif\r
238 \r
239 #if defined(_ACMP_INPUTSEL_VLPSEL_MASK)\r
240 /**\r
241  * ACMP Low-Power Input Selection.\r
242  */\r
243 typedef enum\r
244 {\r
245   acmpVLPInputVADIV = _ACMP_INPUTSEL_VLPSEL_VADIV,\r
246   acmpVLPInputVBDIV = _ACMP_INPUTSEL_VLPSEL_VBDIV\r
247 } ACMP_VLPInput_Typedef;\r
248 #endif\r
249 \r
250 #if defined(_SILICON_LABS_32B_PLATFORM_2)\r
251 /** ACMP Input Selection */\r
252 typedef enum\r
253 {\r
254   acmpInputAPORT0XCH0  = _ACMP_INPUTSEL_POSSEL_APORT0XCH0,\r
255   acmpInputAPORT0XCH1  = _ACMP_INPUTSEL_POSSEL_APORT0XCH1,\r
256   acmpInputAPORT0XCH2  = _ACMP_INPUTSEL_POSSEL_APORT0XCH2,\r
257   acmpInputAPORT0XCH3  = _ACMP_INPUTSEL_POSSEL_APORT0XCH3,\r
258   acmpInputAPORT0XCH4  = _ACMP_INPUTSEL_POSSEL_APORT0XCH4,\r
259   acmpInputAPORT0XCH5  = _ACMP_INPUTSEL_POSSEL_APORT0XCH5,\r
260   acmpInputAPORT0XCH6  = _ACMP_INPUTSEL_POSSEL_APORT0XCH6,\r
261   acmpInputAPORT0XCH7  = _ACMP_INPUTSEL_POSSEL_APORT0XCH7,\r
262   acmpInputAPORT0XCH8  = _ACMP_INPUTSEL_POSSEL_APORT0XCH8,\r
263   acmpInputAPORT0XCH9  = _ACMP_INPUTSEL_POSSEL_APORT0XCH9,\r
264   acmpInputAPORT0XCH10 = _ACMP_INPUTSEL_POSSEL_APORT0XCH10,\r
265   acmpInputAPORT0XCH11 = _ACMP_INPUTSEL_POSSEL_APORT0XCH11,\r
266   acmpInputAPORT0XCH12 = _ACMP_INPUTSEL_POSSEL_APORT0XCH12,\r
267   acmpInputAPORT0XCH13 = _ACMP_INPUTSEL_POSSEL_APORT0XCH13,\r
268   acmpInputAPORT0XCH14 = _ACMP_INPUTSEL_POSSEL_APORT0XCH14,\r
269   acmpInputAPORT0XCH15 = _ACMP_INPUTSEL_POSSEL_APORT0XCH15,\r
270   acmpInputAPORT0YCH0  = _ACMP_INPUTSEL_POSSEL_APORT0YCH0,\r
271   acmpInputAPORT0YCH1  = _ACMP_INPUTSEL_POSSEL_APORT0YCH1,\r
272   acmpInputAPORT0YCH2  = _ACMP_INPUTSEL_POSSEL_APORT0YCH2,\r
273   acmpInputAPORT0YCH3  = _ACMP_INPUTSEL_POSSEL_APORT0YCH3,\r
274   acmpInputAPORT0YCH4  = _ACMP_INPUTSEL_POSSEL_APORT0YCH4,\r
275   acmpInputAPORT0YCH5  = _ACMP_INPUTSEL_POSSEL_APORT0YCH5,\r
276   acmpInputAPORT0YCH6  = _ACMP_INPUTSEL_POSSEL_APORT0YCH6,\r
277   acmpInputAPORT0YCH7  = _ACMP_INPUTSEL_POSSEL_APORT0YCH7,\r
278   acmpInputAPORT0YCH8  = _ACMP_INPUTSEL_POSSEL_APORT0YCH8,\r
279   acmpInputAPORT0YCH9  = _ACMP_INPUTSEL_POSSEL_APORT0YCH9,\r
280   acmpInputAPORT0YCH10 = _ACMP_INPUTSEL_POSSEL_APORT0YCH10,\r
281   acmpInputAPORT0YCH11 = _ACMP_INPUTSEL_POSSEL_APORT0YCH11,\r
282   acmpInputAPORT0YCH12 = _ACMP_INPUTSEL_POSSEL_APORT0YCH12,\r
283   acmpInputAPORT0YCH13 = _ACMP_INPUTSEL_POSSEL_APORT0YCH13,\r
284   acmpInputAPORT0YCH14 = _ACMP_INPUTSEL_POSSEL_APORT0YCH14,\r
285   acmpInputAPORT0YCH15 = _ACMP_INPUTSEL_POSSEL_APORT0YCH15,\r
286   acmpInputAPORT1XCH0  = _ACMP_INPUTSEL_POSSEL_APORT1XCH0,\r
287   acmpInputAPORT1YCH1  = _ACMP_INPUTSEL_POSSEL_APORT1YCH1,\r
288   acmpInputAPORT1XCH2  = _ACMP_INPUTSEL_POSSEL_APORT1XCH2,\r
289   acmpInputAPORT1YCH3  = _ACMP_INPUTSEL_POSSEL_APORT1YCH3,\r
290   acmpInputAPORT1XCH4  = _ACMP_INPUTSEL_POSSEL_APORT1XCH4,\r
291   acmpInputAPORT1YCH5  = _ACMP_INPUTSEL_POSSEL_APORT1YCH5,\r
292   acmpInputAPORT1XCH6  = _ACMP_INPUTSEL_POSSEL_APORT1XCH6,\r
293   acmpInputAPORT1YCH7  = _ACMP_INPUTSEL_POSSEL_APORT1YCH7,\r
294   acmpInputAPORT1XCH8  = _ACMP_INPUTSEL_POSSEL_APORT1XCH8,\r
295   acmpInputAPORT1YCH9  = _ACMP_INPUTSEL_POSSEL_APORT1YCH9,\r
296   acmpInputAPORT1XCH10 = _ACMP_INPUTSEL_POSSEL_APORT1XCH10,\r
297   acmpInputAPORT1YCH11 = _ACMP_INPUTSEL_POSSEL_APORT1YCH11,\r
298   acmpInputAPORT1XCH12 = _ACMP_INPUTSEL_POSSEL_APORT1XCH12,\r
299   acmpInputAPORT1YCH13 = _ACMP_INPUTSEL_POSSEL_APORT1YCH13,\r
300   acmpInputAPORT1XCH14 = _ACMP_INPUTSEL_POSSEL_APORT1XCH14,\r
301   acmpInputAPORT1YCH15 = _ACMP_INPUTSEL_POSSEL_APORT1YCH15,\r
302   acmpInputAPORT1XCH16 = _ACMP_INPUTSEL_POSSEL_APORT1XCH16,\r
303   acmpInputAPORT1YCH17 = _ACMP_INPUTSEL_POSSEL_APORT1YCH17,\r
304   acmpInputAPORT1XCH18 = _ACMP_INPUTSEL_POSSEL_APORT1XCH18,\r
305   acmpInputAPORT1YCH19 = _ACMP_INPUTSEL_POSSEL_APORT1YCH19,\r
306   acmpInputAPORT1XCH20 = _ACMP_INPUTSEL_POSSEL_APORT1XCH20,\r
307   acmpInputAPORT1YCH21 = _ACMP_INPUTSEL_POSSEL_APORT1YCH21,\r
308   acmpInputAPORT1XCH22 = _ACMP_INPUTSEL_POSSEL_APORT1XCH22,\r
309   acmpInputAPORT1YCH23 = _ACMP_INPUTSEL_POSSEL_APORT1YCH23,\r
310   acmpInputAPORT1XCH24 = _ACMP_INPUTSEL_POSSEL_APORT1XCH24,\r
311   acmpInputAPORT1YCH25 = _ACMP_INPUTSEL_POSSEL_APORT1YCH25,\r
312   acmpInputAPORT1XCH26 = _ACMP_INPUTSEL_POSSEL_APORT1XCH26,\r
313   acmpInputAPORT1YCH27 = _ACMP_INPUTSEL_POSSEL_APORT1YCH27,\r
314   acmpInputAPORT1XCH28 = _ACMP_INPUTSEL_POSSEL_APORT1XCH28,\r
315   acmpInputAPORT1YCH29 = _ACMP_INPUTSEL_POSSEL_APORT1YCH29,\r
316   acmpInputAPORT1XCH30 = _ACMP_INPUTSEL_POSSEL_APORT1XCH30,\r
317   acmpInputAPORT1YCH31 = _ACMP_INPUTSEL_POSSEL_APORT1YCH31,\r
318   acmpInputAPORT2YCH0  = _ACMP_INPUTSEL_POSSEL_APORT2YCH0,\r
319   acmpInputAPORT2XCH1  = _ACMP_INPUTSEL_POSSEL_APORT2XCH1,\r
320   acmpInputAPORT2YCH2  = _ACMP_INPUTSEL_POSSEL_APORT2YCH2,\r
321   acmpInputAPORT2XCH3  = _ACMP_INPUTSEL_POSSEL_APORT2XCH3,\r
322   acmpInputAPORT2YCH4  = _ACMP_INPUTSEL_POSSEL_APORT2YCH4,\r
323   acmpInputAPORT2XCH5  = _ACMP_INPUTSEL_POSSEL_APORT2XCH5,\r
324   acmpInputAPORT2YCH6  = _ACMP_INPUTSEL_POSSEL_APORT2YCH6,\r
325   acmpInputAPORT2XCH7  = _ACMP_INPUTSEL_POSSEL_APORT2XCH7,\r
326   acmpInputAPORT2YCH8  = _ACMP_INPUTSEL_POSSEL_APORT2YCH8,\r
327   acmpInputAPORT2XCH9  = _ACMP_INPUTSEL_POSSEL_APORT2XCH9,\r
328   acmpInputAPORT2YCH10 = _ACMP_INPUTSEL_POSSEL_APORT2YCH10,\r
329   acmpInputAPORT2XCH11 = _ACMP_INPUTSEL_POSSEL_APORT2XCH11,\r
330   acmpInputAPORT2YCH12 = _ACMP_INPUTSEL_POSSEL_APORT2YCH12,\r
331   acmpInputAPORT2XCH13 = _ACMP_INPUTSEL_POSSEL_APORT2XCH13,\r
332   acmpInputAPORT2YCH14 = _ACMP_INPUTSEL_POSSEL_APORT2YCH14,\r
333   acmpInputAPORT2XCH15 = _ACMP_INPUTSEL_POSSEL_APORT2XCH15,\r
334   acmpInputAPORT2YCH16 = _ACMP_INPUTSEL_POSSEL_APORT2YCH16,\r
335   acmpInputAPORT2XCH17 = _ACMP_INPUTSEL_POSSEL_APORT2XCH17,\r
336   acmpInputAPORT2YCH18 = _ACMP_INPUTSEL_POSSEL_APORT2YCH18,\r
337   acmpInputAPORT2XCH19 = _ACMP_INPUTSEL_POSSEL_APORT2XCH19,\r
338   acmpInputAPORT2YCH20 = _ACMP_INPUTSEL_POSSEL_APORT2YCH20,\r
339   acmpInputAPORT2XCH21 = _ACMP_INPUTSEL_POSSEL_APORT2XCH21,\r
340   acmpInputAPORT2YCH22 = _ACMP_INPUTSEL_POSSEL_APORT2YCH22,\r
341   acmpInputAPORT2XCH23 = _ACMP_INPUTSEL_POSSEL_APORT2XCH23,\r
342   acmpInputAPORT2YCH24 = _ACMP_INPUTSEL_POSSEL_APORT2YCH24,\r
343   acmpInputAPORT2XCH25 = _ACMP_INPUTSEL_POSSEL_APORT2XCH25,\r
344   acmpInputAPORT2YCH26 = _ACMP_INPUTSEL_POSSEL_APORT2YCH26,\r
345   acmpInputAPORT2XCH27 = _ACMP_INPUTSEL_POSSEL_APORT2XCH27,\r
346   acmpInputAPORT2YCH28 = _ACMP_INPUTSEL_POSSEL_APORT2YCH28,\r
347   acmpInputAPORT2XCH29 = _ACMP_INPUTSEL_POSSEL_APORT2XCH29,\r
348   acmpInputAPORT2YCH30 = _ACMP_INPUTSEL_POSSEL_APORT2YCH30,\r
349   acmpInputAPORT2XCH31 = _ACMP_INPUTSEL_POSSEL_APORT2XCH31,\r
350   acmpInputAPORT3XCH0  = _ACMP_INPUTSEL_POSSEL_APORT3XCH0,\r
351   acmpInputAPORT3YCH1  = _ACMP_INPUTSEL_POSSEL_APORT3YCH1,\r
352   acmpInputAPORT3XCH2  = _ACMP_INPUTSEL_POSSEL_APORT3XCH2,\r
353   acmpInputAPORT3YCH3  = _ACMP_INPUTSEL_POSSEL_APORT3YCH3,\r
354   acmpInputAPORT3XCH4  = _ACMP_INPUTSEL_POSSEL_APORT3XCH4,\r
355   acmpInputAPORT3YCH5  = _ACMP_INPUTSEL_POSSEL_APORT3YCH5,\r
356   acmpInputAPORT3XCH6  = _ACMP_INPUTSEL_POSSEL_APORT3XCH6,\r
357   acmpInputAPORT3YCH7  = _ACMP_INPUTSEL_POSSEL_APORT3YCH7,\r
358   acmpInputAPORT3XCH8  = _ACMP_INPUTSEL_POSSEL_APORT3XCH8,\r
359   acmpInputAPORT3YCH9  = _ACMP_INPUTSEL_POSSEL_APORT3YCH9,\r
360   acmpInputAPORT3XCH10 = _ACMP_INPUTSEL_POSSEL_APORT3XCH10,\r
361   acmpInputAPORT3YCH11 = _ACMP_INPUTSEL_POSSEL_APORT3YCH11,\r
362   acmpInputAPORT3XCH12 = _ACMP_INPUTSEL_POSSEL_APORT3XCH12,\r
363   acmpInputAPORT3YCH13 = _ACMP_INPUTSEL_POSSEL_APORT3YCH13,\r
364   acmpInputAPORT3XCH14 = _ACMP_INPUTSEL_POSSEL_APORT3XCH14,\r
365   acmpInputAPORT3YCH15 = _ACMP_INPUTSEL_POSSEL_APORT3YCH15,\r
366   acmpInputAPORT3XCH16 = _ACMP_INPUTSEL_POSSEL_APORT3XCH16,\r
367   acmpInputAPORT3YCH17 = _ACMP_INPUTSEL_POSSEL_APORT3YCH17,\r
368   acmpInputAPORT3XCH18 = _ACMP_INPUTSEL_POSSEL_APORT3XCH18,\r
369   acmpInputAPORT3YCH19 = _ACMP_INPUTSEL_POSSEL_APORT3YCH19,\r
370   acmpInputAPORT3XCH20 = _ACMP_INPUTSEL_POSSEL_APORT3XCH20,\r
371   acmpInputAPORT3YCH21 = _ACMP_INPUTSEL_POSSEL_APORT3YCH21,\r
372   acmpInputAPORT3XCH22 = _ACMP_INPUTSEL_POSSEL_APORT3XCH22,\r
373   acmpInputAPORT3YCH23 = _ACMP_INPUTSEL_POSSEL_APORT3YCH23,\r
374   acmpInputAPORT3XCH24 = _ACMP_INPUTSEL_POSSEL_APORT3XCH24,\r
375   acmpInputAPORT3YCH25 = _ACMP_INPUTSEL_POSSEL_APORT3YCH25,\r
376   acmpInputAPORT3XCH26 = _ACMP_INPUTSEL_POSSEL_APORT3XCH26,\r
377   acmpInputAPORT3YCH27 = _ACMP_INPUTSEL_POSSEL_APORT3YCH27,\r
378   acmpInputAPORT3XCH28 = _ACMP_INPUTSEL_POSSEL_APORT3XCH28,\r
379   acmpInputAPORT3YCH29 = _ACMP_INPUTSEL_POSSEL_APORT3YCH29,\r
380   acmpInputAPORT3XCH30 = _ACMP_INPUTSEL_POSSEL_APORT3XCH30,\r
381   acmpInputAPORT3YCH31 = _ACMP_INPUTSEL_POSSEL_APORT3YCH31,\r
382   acmpInputAPORT4YCH0  = _ACMP_INPUTSEL_POSSEL_APORT4YCH0,\r
383   acmpInputAPORT4XCH1  = _ACMP_INPUTSEL_POSSEL_APORT4XCH1,\r
384   acmpInputAPORT4YCH2  = _ACMP_INPUTSEL_POSSEL_APORT4YCH2,\r
385   acmpInputAPORT4XCH3  = _ACMP_INPUTSEL_POSSEL_APORT4XCH3,\r
386   acmpInputAPORT4YCH4  = _ACMP_INPUTSEL_POSSEL_APORT4YCH4,\r
387   acmpInputAPORT4XCH5  = _ACMP_INPUTSEL_POSSEL_APORT4XCH5,\r
388   acmpInputAPORT4YCH6  = _ACMP_INPUTSEL_POSSEL_APORT4YCH6,\r
389   acmpInputAPORT4XCH7  = _ACMP_INPUTSEL_POSSEL_APORT4XCH7,\r
390   acmpInputAPORT4YCH8  = _ACMP_INPUTSEL_POSSEL_APORT4YCH8,\r
391   acmpInputAPORT4XCH9  = _ACMP_INPUTSEL_POSSEL_APORT4XCH9,\r
392   acmpInputAPORT4YCH10 = _ACMP_INPUTSEL_POSSEL_APORT4YCH10,\r
393   acmpInputAPORT4XCH11 = _ACMP_INPUTSEL_POSSEL_APORT4XCH11,\r
394   acmpInputAPORT4YCH12 = _ACMP_INPUTSEL_POSSEL_APORT4YCH12,\r
395   acmpInputAPORT4XCH13 = _ACMP_INPUTSEL_POSSEL_APORT4XCH13,\r
396   acmpInputAPORT4YCH16 = _ACMP_INPUTSEL_POSSEL_APORT4YCH16,\r
397   acmpInputAPORT4XCH17 = _ACMP_INPUTSEL_POSSEL_APORT4XCH17,\r
398   acmpInputAPORT4YCH18 = _ACMP_INPUTSEL_POSSEL_APORT4YCH18,\r
399   acmpInputAPORT4XCH19 = _ACMP_INPUTSEL_POSSEL_APORT4XCH19,\r
400   acmpInputAPORT4YCH20 = _ACMP_INPUTSEL_POSSEL_APORT4YCH20,\r
401   acmpInputAPORT4XCH21 = _ACMP_INPUTSEL_POSSEL_APORT4XCH21,\r
402   acmpInputAPORT4YCH22 = _ACMP_INPUTSEL_POSSEL_APORT4YCH22,\r
403   acmpInputAPORT4XCH23 = _ACMP_INPUTSEL_POSSEL_APORT4XCH23,\r
404   acmpInputAPORT4YCH24 = _ACMP_INPUTSEL_POSSEL_APORT4YCH24,\r
405   acmpInputAPORT4XCH25 = _ACMP_INPUTSEL_POSSEL_APORT4XCH25,\r
406   acmpInputAPORT4YCH26 = _ACMP_INPUTSEL_POSSEL_APORT4YCH26,\r
407   acmpInputAPORT4XCH27 = _ACMP_INPUTSEL_POSSEL_APORT4XCH27,\r
408   acmpInputAPORT4YCH28 = _ACMP_INPUTSEL_POSSEL_APORT4YCH28,\r
409   acmpInputAPORT4XCH29 = _ACMP_INPUTSEL_POSSEL_APORT4XCH29,\r
410   acmpInputAPORT4YCH30 = _ACMP_INPUTSEL_POSSEL_APORT4YCH30,\r
411   acmpInputAPORT4YCH14 = _ACMP_INPUTSEL_POSSEL_APORT4YCH14,\r
412   acmpInputAPORT4XCH15 = _ACMP_INPUTSEL_POSSEL_APORT4XCH15,\r
413   acmpInputAPORT4XCH31 = _ACMP_INPUTSEL_POSSEL_APORT4XCH31,\r
414   acmpInputDACOUT0   = _ACMP_INPUTSEL_POSSEL_DACOUT0,\r
415   acmpInputDACOUT1   = _ACMP_INPUTSEL_POSSEL_DACOUT1,\r
416   acmpInputVLP       = _ACMP_INPUTSEL_POSSEL_VLP,\r
417   acmpInputVBDIV     = _ACMP_INPUTSEL_POSSEL_VBDIV,\r
418   acmpInputVADIV     = _ACMP_INPUTSEL_POSSEL_VADIV,\r
419   acmpInputVDD       = _ACMP_INPUTSEL_POSSEL_VDD,\r
420   acmpInputVSS       = _ACMP_INPUTSEL_POSSEL_VSS,\r
421 } ACMP_Channel_TypeDef;\r
422 #else\r
423 /** ACMP inputs. Note that scaled VDD and bandgap references can only be used\r
424  *  as negative inputs. */\r
425 typedef enum\r
426 {\r
427   /** Channel 0 */\r
428   acmpChannel0    = _ACMP_INPUTSEL_NEGSEL_CH0,\r
429   /** Channel 1 */\r
430   acmpChannel1    = _ACMP_INPUTSEL_NEGSEL_CH1,\r
431   /** Channel 2 */\r
432   acmpChannel2    = _ACMP_INPUTSEL_NEGSEL_CH2,\r
433   /** Channel 3 */\r
434   acmpChannel3    = _ACMP_INPUTSEL_NEGSEL_CH3,\r
435   /** Channel 4 */\r
436   acmpChannel4    = _ACMP_INPUTSEL_NEGSEL_CH4,\r
437   /** Channel 5 */\r
438   acmpChannel5    = _ACMP_INPUTSEL_NEGSEL_CH5,\r
439   /** Channel 6 */\r
440   acmpChannel6    = _ACMP_INPUTSEL_NEGSEL_CH6,\r
441   /** Channel 7 */\r
442   acmpChannel7    = _ACMP_INPUTSEL_NEGSEL_CH7,\r
443   /** 1.25V internal reference */\r
444   acmpChannel1V25 = _ACMP_INPUTSEL_NEGSEL_1V25,\r
445   /** 2.5V internal reference */\r
446   acmpChannel2V5  = _ACMP_INPUTSEL_NEGSEL_2V5,\r
447   /** Scaled VDD reference */\r
448   acmpChannelVDD  = _ACMP_INPUTSEL_NEGSEL_VDD,\r
449 \r
450 #if defined(_ACMP_INPUTSEL_NEGSEL_DAC0CH0)\r
451   /** DAC0 channel 0 */\r
452   acmpChannelDAC0Ch0 = _ACMP_INPUTSEL_NEGSEL_DAC0CH0,\r
453 #endif\r
454 \r
455 #if defined(_ACMP_INPUTSEL_NEGSEL_DAC0CH1)\r
456   /** DAC0 channel 1 */\r
457   acmpChannelDAC0Ch1 = _ACMP_INPUTSEL_NEGSEL_DAC0CH1,\r
458 #endif\r
459 \r
460 #if defined(_ACMP_INPUTSEL_NEGSEL_CAPSENSE)\r
461   /** Capacitive sense mode */\r
462   acmpChannelCapSense = _ACMP_INPUTSEL_NEGSEL_CAPSENSE,\r
463 #endif\r
464 } ACMP_Channel_TypeDef;\r
465 #endif\r
466 \r
467 /*******************************************************************************\r
468  ******************************   STRUCTS   ************************************\r
469  ******************************************************************************/\r
470 \r
471 /** Capsense initialization structure. */\r
472 typedef struct\r
473 {\r
474   /** Full bias current. See the ACMP chapter about bias and response time in\r
475    *  the reference manual for details. */\r
476   bool                          fullBias;\r
477 \r
478 #if defined(_ACMP_CTRL_HALFBIAS_MASK)\r
479   /** Half bias current. See the ACMP chapter about bias and response time in\r
480    *  the reference manual for details. */\r
481   bool                          halfBias;\r
482 #endif\r
483 \r
484   /** Bias current. See the ACMP chapter about bias and response time in the\r
485    *  reference manual for details. */\r
486   uint32_t                      biasProg;\r
487 \r
488 #if defined(_ACMP_CTRL_WARMTIME_MASK)\r
489   /** Warmup time. This is measured in HFPERCLK cycles and should be\r
490    *  about 10us in wall clock time. */\r
491   ACMP_WarmTime_TypeDef         warmTime;\r
492 #endif\r
493 \r
494 #if defined(_ACMP_CTRL_HYSTSEL_MASK)\r
495   /** Hysteresis level */\r
496   ACMP_HysteresisLevel_TypeDef  hysteresisLevel;\r
497 #else\r
498   /** Hysteresis level when ACMP output is 0 */\r
499   ACMP_HysteresisLevel_TypeDef  hysteresisLevel_0;\r
500 \r
501   /** Hysteresis level when ACMP output is 1 */\r
502   ACMP_HysteresisLevel_TypeDef  hysteresisLevel_1;\r
503 #endif\r
504 \r
505   /** Resistor used in the capacative sensing circuit. For values see\r
506    *  your device datasheet. */\r
507   ACMP_CapsenseResistor_TypeDef resistor;\r
508 \r
509 #if defined(_ACMP_INPUTSEL_LPREF_MASK)\r
510   /** Low power reference enabled. This setting, if enabled, reduces the\r
511    *  power used by the VDD and bandgap references. */\r
512   bool                          lowPowerReferenceEnabled;\r
513 #endif\r
514 \r
515 #if defined(_ACMP_INPUTSEL_VDDLEVEL_MASK)\r
516   /** Vdd reference value. VDD_SCALED = (Vdd * VDDLEVEL) / 63.\r
517    *  Valid values are in the range 0-63. */\r
518   uint32_t                      vddLevel;\r
519 #else\r
520   /**\r
521    * This value configures the upper voltage threshold of the capsense\r
522    * oscillation rail.\r
523    *\r
524    * The voltage threshold is calculated as\r
525    *   Vdd * (vddLevelHigh + 1) / 64\r
526    */\r
527   uint32_t                      vddLevelHigh;\r
528 \r
529   /**\r
530    * This value configures the lower voltage threshold of the capsense\r
531    * oscillation rail.\r
532    *\r
533    * The voltage threshold is calculated as\r
534    *   Vdd * (vddLevelLow + 1) / 64\r
535    */\r
536   uint32_t                      vddLevelLow;\r
537 #endif\r
538 \r
539   /** If true, ACMP is being enabled after configuration. */\r
540   bool                          enable;\r
541 } ACMP_CapsenseInit_TypeDef;\r
542 \r
543 /** Default config for capacitive sense mode initialization. */\r
544 #if defined(_ACMP_HYSTERESIS0_HYST_MASK)\r
545 #define ACMP_CAPSENSE_INIT_DEFAULT                                          \\r
546 {                                                                           \\r
547   false,                /* Don't use fullBias to lower power consumption */ \\r
548   0x20,                 /* Using biasProg value of 0x20 (32) */             \\r
549   acmpHysteresisLevel8, /* Use hysteresis level 8 when ACMP output is 0 */  \\r
550   acmpHysteresisLevel8, /* Use hysteresis level 8 when ACMP output is 1 */  \\r
551   acmpResistor5,        /* Use internal resistor value 5 */                 \\r
552   0x30,                 /* VDD level high */                                \\r
553   0x10,                 /* VDD level low */                                 \\r
554   true                  /* Enable after init. */                            \\r
555 }\r
556 #elif defined(_ACMP_CTRL_WARMTIME_MASK)\r
557 #define ACMP_CAPSENSE_INIT_DEFAULT                      \\r
558 {                                                       \\r
559   false,              /* fullBias */                    \\r
560   false,              /* halfBias */                    \\r
561   0x7,                /* biasProg */                    \\r
562   acmpWarmTime512,    /* 512 cycle warmup to be safe */ \\r
563   acmpHysteresisLevel5,                                 \\r
564   acmpResistor3,                                        \\r
565   false,              /* low power reference */         \\r
566   0x3D,               /* VDD level */                   \\r
567   true                /* Enable after init. */          \\r
568 }\r
569 #else\r
570 #define ACMP_CAPSENSE_INIT_DEFAULT                      \\r
571 {                                                       \\r
572   false,              /* fullBias */                    \\r
573   false,              /* halfBias */                    \\r
574   0x7,                /* biasProg */                    \\r
575   acmpHysteresisLevel5,                                 \\r
576   acmpResistor3,                                        \\r
577   false,              /* low power reference */         \\r
578   0x3D,               /* VDD level */                   \\r
579   true                /* Enable after init. */          \\r
580 }\r
581 #endif\r
582 \r
583 /** ACMP initialization structure. */\r
584 typedef struct\r
585 {\r
586   /** Full bias current. See the ACMP chapter about bias and response time in\r
587    *  the reference manual for details. */\r
588   bool                         fullBias;\r
589 \r
590 #if defined(_ACMP_CTRL_HALFBIAS_MASK)\r
591   /** Half bias current. See the ACMP chapter about bias and response time in\r
592    *  the reference manual for details. */\r
593   bool                         halfBias;\r
594 #endif\r
595 \r
596   /** Bias current. See the ACMP chapter about bias and response time in the\r
597    *  reference manual for details. Valid values are in the range 0-7. */\r
598   uint32_t                     biasProg;\r
599 \r
600   /** Enable setting the interrupt flag on falling edge */\r
601   bool                         interruptOnFallingEdge;\r
602 \r
603   /** Enable setting the interrupt flag on rising edge */\r
604   bool                         interruptOnRisingEdge;\r
605 \r
606 #if defined(_ACMP_CTRL_INPUTRANGE_MASK)\r
607   /** Input range. Adjust this setting to optimize the performance for a\r
608    *  given input voltage range.  */\r
609   ACMP_InputRange_TypeDef      inputRange;\r
610 #endif\r
611 \r
612 #if defined(_ACMP_CTRL_ACCURACY_MASK)\r
613   /** ACMP accuracy mode. Select the accuracy mode that matches the\r
614    *  required current usage and accuracy requirement. Low accuracy\r
615    *  consumes less current while high accuracy consumes more current. */\r
616   ACMP_Accuracy_TypeDef        accuracy;\r
617 #endif\r
618 \r
619 #if defined(_ACMP_CTRL_PWRSEL_MASK)\r
620   /** Select the power source for the ACMP. */\r
621   ACMP_PowerSource_TypeDef     powerSource;\r
622 #endif\r
623 \r
624 #if defined(_ACMP_CTRL_WARMTIME_MASK)\r
625   /** Warmup time. This is measured in HFPERCLK cycles and should be\r
626    *  about 10us in wall clock time. */\r
627   ACMP_WarmTime_TypeDef        warmTime;\r
628 #endif\r
629 \r
630 #if defined(_ACMP_CTRL_HYSTSEL_MASK)\r
631   /** Hysteresis level */\r
632   ACMP_HysteresisLevel_TypeDef hysteresisLevel;\r
633 #else\r
634   /** Hysteresis when ACMP output is 0 */\r
635   ACMP_HysteresisLevel_TypeDef  hysteresisLevel_0;\r
636 \r
637   /** Hysteresis when ACMP output is 1 */\r
638   ACMP_HysteresisLevel_TypeDef  hysteresisLevel_1;\r
639 #endif\r
640 \r
641 #if defined(_ACMP_INPUTSEL_VLPSEL_MASK)\r
642   /** VLP Input source. Select between using VADIV or VBDIV as the VLP\r
643    *  source. */\r
644   ACMP_VLPInput_Typedef        vlpInput;\r
645 #endif\r
646 \r
647   /** Inactive value emitted by the ACMP during warmup */\r
648   bool                         inactiveValue;\r
649 \r
650 #if defined(_ACMP_INPUTSEL_LPREF_MASK)\r
651   /** Low power reference enabled. This setting, if enabled, reduces the\r
652    *  power used by the VDD and bandgap references. */\r
653   bool                         lowPowerReferenceEnabled;\r
654 #endif\r
655 \r
656 #if defined(_ACMP_INPUTSEL_VDDLEVEL_MASK)\r
657   /** Vdd reference value. VDD_SCALED = VDD * VDDLEVEL * 50mV/3.8V.\r
658    *  Valid values are in the range 0-63. */\r
659   uint32_t                     vddLevel;\r
660 #endif\r
661 \r
662   /** If true, ACMP is being enabled after configuration. */\r
663   bool                         enable;\r
664 } ACMP_Init_TypeDef;\r
665 \r
666 /** Default config for ACMP regular initialization. */\r
667 #if defined(_ACMP_HYSTERESIS0_HYST_MASK)\r
668 #define ACMP_INIT_DEFAULT                                                   \\r
669 {                                                                           \\r
670   false,                      /* fullBias */                                \\r
671   0x7,                        /* biasProg */                                \\r
672   false,                      /* No interrupt on falling edge. */           \\r
673   false,                      /* No interrupt on rising edge. */            \\r
674   acmpInputRangeFull,         /* Input range from 0 to Vdd. */              \\r
675   acmpAccuracyLow,            /* Low accuracy, less current usage. */       \\r
676   acmpPowerSourceAvdd,        /* Use the AVDD supply. */                    \\r
677   acmpHysteresisLevel5,       /* Use hysteresis level 5 when output is 0 */ \\r
678   acmpHysteresisLevel5,       /* Use hysteresis level 5 when output is 1 */ \\r
679   acmpVLPInputVADIV,          /* Use VADIV as the VLP input source. */      \\r
680   false,                      /* Output 0 when ACMP is inactive. */         \\r
681   true                        /* Enable after init. */                      \\r
682 }\r
683 #elif defined(_ACMP_CTRL_WARMTIME_MASK)\r
684 #define ACMP_INIT_DEFAULT                                                   \\r
685 {                                                                           \\r
686   false,              /* fullBias */                                        \\r
687   false,              /* halfBias */                                        \\r
688   0x7,                /* biasProg */                                        \\r
689   false,              /* No interrupt on falling edge. */                   \\r
690   false,              /* No interrupt on rising edge. */                    \\r
691   acmpWarmTime512,    /* 512 cycle warmup to be safe */                     \\r
692   acmpHysteresisLevel5,                                                     \\r
693   false,              /* Disabled emitting inactive value during warmup. */ \\r
694   false,              /* low power reference */                             \\r
695   0x3D,               /* VDD level */                                       \\r
696   true                /* Enable after init. */                              \\r
697 }\r
698 #else\r
699 #define ACMP_INIT_DEFAULT                                                   \\r
700 {                                                                           \\r
701   false,              /* fullBias */                                        \\r
702   false,              /* halfBias */                                        \\r
703   0x7,                /* biasProg */                                        \\r
704   false,              /* No interrupt on falling edge. */                   \\r
705   false,              /* No interrupt on rising edge. */                    \\r
706   acmpHysteresisLevel5,                                                     \\r
707   false,              /* Disabled emitting inactive value during warmup. */ \\r
708   false,              /* low power reference */                             \\r
709   0x3D,               /* VDD level */                                       \\r
710   true                /* Enable after init. */                              \\r
711 }\r
712 #endif\r
713 \r
714 #if defined(_ACMP_INPUTSEL_VASEL_MASK)\r
715 /** VA Configuration structure. This struct is used to configure the\r
716  *  VA voltage input source and it's dividers. */\r
717 typedef struct\r
718 {\r
719   ACMP_VAInput_TypeDef input; /**< VA voltage input source */\r
720 \r
721   /**\r
722    * Divider for VA voltage input source when ACMP output is 0. This value is\r
723    * used to divide the VA voltage input source by a specific value. The valid\r
724    * range is between 0 and 63.\r
725    *\r
726    *  VA divided = VA input * (div0 + 1) / 64\r
727    */\r
728   uint32_t             div0;\r
729 \r
730   /**\r
731    * Divider for VA voltage input source when ACMP output is 1. This value is\r
732    * used to divide the VA voltage input source by a specific value. The valid\r
733    * range is between 0 and 63.\r
734    *\r
735    *  VA divided = VA input * (div1 + 1) / 64\r
736    */\r
737   uint32_t             div1;\r
738 } ACMP_VAConfig_TypeDef;\r
739 \r
740 #define ACMP_VACONFIG_DEFAULT                                               \\r
741 {                                                                           \\r
742   acmpVAInputVDD, /* Use Vdd as VA voltage input source */                  \\r
743   63,             /* No division of the VA source when ACMP output is 0 */  \\r
744   63,             /* No division of the VA source when ACMP output is 1 */  \\r
745 }\r
746 #endif\r
747 \r
748 #if defined(_ACMP_INPUTSEL_VBSEL_MASK)\r
749 /** VB Configuration structure. This struct is used to configure the\r
750  *  VB voltage input source and it's dividers. */\r
751 typedef struct\r
752 {\r
753   ACMP_VBInput_TypeDef input; /**< VB Voltage input source */\r
754 \r
755   /**\r
756    * Divider for VB voltage input source when ACMP output is 0. This value is\r
757    * used to divide the VB voltage input source by a specific value. The valid\r
758    * range is between 0 and 63.\r
759    *\r
760    *  VB divided = VB input * (div0 + 1) / 64\r
761    */\r
762   uint32_t             div0;\r
763 \r
764   /**\r
765    * Divider for VB voltage input source when ACMP output is 1. This value is\r
766    * used to divide the VB voltage input source by a specific value. The valid\r
767    * range is between 0 and 63.\r
768    *\r
769    *  VB divided = VB input * (div1 + 1) / 64\r
770    */\r
771   uint32_t             div1;\r
772 } ACMP_VBConfig_TypeDef;\r
773 \r
774 #define ACMP_VBCONFIG_DEFAULT                                               \\r
775 {                                                                           \\r
776   acmpVBInput1V25, /* Use 1.25 V as VB voltage input source */              \\r
777   63,              /* No division of the VB source when ACMP output is 0 */ \\r
778   63,              /* No division of the VB source when ACMP output is 1 */ \\r
779 }\r
780 #endif\r
781 \r
782 /*******************************************************************************\r
783  *****************************   PROTOTYPES   **********************************\r
784  ******************************************************************************/\r
785 \r
786 void ACMP_CapsenseInit(ACMP_TypeDef *acmp, const ACMP_CapsenseInit_TypeDef *init);\r
787 void ACMP_CapsenseChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef channel);\r
788 void ACMP_ChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef negSel, ACMP_Channel_TypeDef posSel);\r
789 void ACMP_Disable(ACMP_TypeDef *acmp);\r
790 void ACMP_Enable(ACMP_TypeDef *acmp);\r
791 void ACMP_GPIOSetup(ACMP_TypeDef *acmp, uint32_t location, bool enable, bool invert);\r
792 void ACMP_Init(ACMP_TypeDef *acmp, const ACMP_Init_TypeDef *init);\r
793 void ACMP_Reset(ACMP_TypeDef *acmp);\r
794 #if defined(_ACMP_INPUTSEL_VASEL_MASK)\r
795 void ACMP_VASetup(ACMP_TypeDef *acmp, const ACMP_VAConfig_TypeDef *vaconfig);\r
796 #endif\r
797 #if defined(_ACMP_INPUTSEL_VBSEL_MASK)\r
798 void ACMP_VBSetup(ACMP_TypeDef *acmp, const ACMP_VBConfig_TypeDef *vbconfig);\r
799 #endif\r
800 \r
801 /***************************************************************************//**\r
802  * @brief\r
803  *   Clear one or more pending ACMP interrupts.\r
804  *\r
805  * @param[in] acmp\r
806  *   Pointer to ACMP peripheral register block.\r
807  *\r
808  * @param[in] flags\r
809  *   Pending ACMP interrupt source to clear. Use a bitwise logic OR combination\r
810  *   of valid interrupt flags for the ACMP module (ACMP_IF_nnn).\r
811  ******************************************************************************/\r
812 __STATIC_INLINE void ACMP_IntClear(ACMP_TypeDef *acmp, uint32_t flags)\r
813 {\r
814   acmp->IFC = flags;\r
815 }\r
816 \r
817 \r
818 /***************************************************************************//**\r
819  * @brief\r
820  *   Disable one or more ACMP interrupts.\r
821  *\r
822  * @param[in] acmp\r
823  *   Pointer to ACMP peripheral register block.\r
824  *\r
825  * @param[in] flags\r
826  *   ACMP interrupt sources to disable. Use a bitwise logic OR combination of\r
827  *   valid interrupt flags for the ACMP module (ACMP_IF_nnn).\r
828  ******************************************************************************/\r
829 __STATIC_INLINE void ACMP_IntDisable(ACMP_TypeDef *acmp, uint32_t flags)\r
830 {\r
831   acmp->IEN &= ~(flags);\r
832 }\r
833 \r
834 \r
835 /***************************************************************************//**\r
836  * @brief\r
837  *   Enable one or more ACMP interrupts.\r
838  *\r
839  * @note\r
840  *   Depending on the use, a pending interrupt may already be set prior to\r
841  *   enabling the interrupt. Consider using ACMP_IntClear() prior to enabling\r
842  *   if such a pending interrupt should be ignored.\r
843  *\r
844  * @param[in] acmp\r
845  *   Pointer to ACMP peripheral register block.\r
846  *\r
847  * @param[in] flags\r
848  *   ACMP interrupt sources to enable. Use a bitwise logic OR combination of\r
849  *   valid interrupt flags for the ACMP module (ACMP_IF_nnn).\r
850  ******************************************************************************/\r
851 __STATIC_INLINE void ACMP_IntEnable(ACMP_TypeDef *acmp, uint32_t flags)\r
852 {\r
853   acmp->IEN |= flags;\r
854 }\r
855 \r
856 \r
857 /***************************************************************************//**\r
858  * @brief\r
859  *   Get pending ACMP interrupt flags.\r
860  *\r
861  * @note\r
862  *   The event bits are not cleared by the use of this function.\r
863  *\r
864  * @param[in] acmp\r
865  *   Pointer to ACMP peripheral register block.\r
866  *\r
867  * @return\r
868  *   ACMP interrupt sources pending. A bitwise logic OR combination of valid\r
869  *   interrupt flags for the ACMP module (ACMP_IF_nnn).\r
870  ******************************************************************************/\r
871 __STATIC_INLINE uint32_t ACMP_IntGet(ACMP_TypeDef *acmp)\r
872 {\r
873   return acmp->IF;\r
874 }\r
875 \r
876 \r
877 /***************************************************************************//**\r
878  * @brief\r
879  *   Get enabled and pending ACMP interrupt flags.\r
880  *   Useful for handling more interrupt sources in the same interrupt handler.\r
881  *\r
882  * @param[in] acmp\r
883  *   Pointer to ACMP peripheral register block.\r
884  *\r
885  * @note\r
886  *   Interrupt flags are not cleared by the use of this function.\r
887  *\r
888  * @return\r
889  *   Pending and enabled ACMP interrupt sources.\r
890  *   The return value is the bitwise AND combination of\r
891  *   - the OR combination of enabled interrupt sources in ACMPx_IEN_nnn\r
892  *     register (ACMPx_IEN_nnn) and\r
893  *   - the OR combination of valid interrupt flags of the ACMP module\r
894  *     (ACMPx_IF_nnn).\r
895  ******************************************************************************/\r
896 __STATIC_INLINE uint32_t ACMP_IntGetEnabled(ACMP_TypeDef *acmp)\r
897 {\r
898   uint32_t tmp;\r
899 \r
900   /* Store ACMPx->IEN in temporary variable in order to define explicit order\r
901    * of volatile accesses. */\r
902   tmp = acmp->IEN;\r
903 \r
904   /* Bitwise AND of pending and enabled interrupts */\r
905   return acmp->IF & tmp;\r
906 }\r
907 \r
908 \r
909 /***************************************************************************//**\r
910  * @brief\r
911  *   Set one or more pending ACMP interrupts from SW.\r
912  *\r
913  * @param[in] acmp\r
914  *   Pointer to ACMP peripheral register block.\r
915  *\r
916  * @param[in] flags\r
917  *   ACMP interrupt sources to set to pending. Use a bitwise logic OR\r
918  *   combination of valid interrupt flags for the ACMP module (ACMP_IF_nnn).\r
919  ******************************************************************************/\r
920 __STATIC_INLINE void ACMP_IntSet(ACMP_TypeDef *acmp, uint32_t flags)\r
921 {\r
922   acmp->IFS = flags;\r
923 }\r
924 \r
925 /** @} (end addtogroup ACMP) */\r
926 /** @} (end addtogroup EM_Library) */\r
927 \r
928 #ifdef __cplusplus\r
929 }\r
930 #endif\r
931 \r
932 #endif /* defined(ACMP_COUNT) && (ACMP_COUNT > 0) */\r
933 #endif /* __SILICON_LABS_EM_ACMP_H__ */\r