EFM32 Wonder Gecko Software Documentation  efm32wg-doc-4.2.1
em_vcmp.c
Go to the documentation of this file.
1 /***************************************************************************/
33 #include "em_vcmp.h"
34 #if defined(VCMP_COUNT) && (VCMP_COUNT > 0)
35 
36 #include "em_assert.h"
37 
38 /***************************************************************************/
43 /***************************************************************************/
49 /***************************************************************************/
56 void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit)
57 {
58  /* Verify input */
59  EFM_ASSERT((vcmpInit->inactive == 0) || (vcmpInit->inactive == 1));
60  EFM_ASSERT((vcmpInit->biasProg >= 0) && (vcmpInit->biasProg < 16));
61 
62  /* Configure Half Bias setting */
63  if (vcmpInit->halfBias)
64  {
65  VCMP->CTRL |= VCMP_CTRL_HALFBIAS;
66  }
67  else
68  {
69  VCMP->CTRL &= ~(VCMP_CTRL_HALFBIAS);
70  }
71 
72  /* Configure bias prog */
73  VCMP->CTRL &= ~(_VCMP_CTRL_BIASPROG_MASK);
74  VCMP->CTRL |= (vcmpInit->biasProg << _VCMP_CTRL_BIASPROG_SHIFT);
75 
76  /* Configure sense for falling edge */
77  if (vcmpInit->irqFalling)
78  {
79  VCMP->CTRL |= VCMP_CTRL_IFALL;
80  }
81  else
82  {
83  VCMP->CTRL &= ~(VCMP_CTRL_IFALL);
84  }
85 
86  /* Configure sense for rising edge */
87  if (vcmpInit->irqRising)
88  {
89  VCMP->CTRL |= VCMP_CTRL_IRISE;
90  }
91  else
92  {
93  VCMP->CTRL &= ~(VCMP_CTRL_IRISE);
94  }
95 
96  /* Configure warm-up time */
97  VCMP->CTRL &= ~(_VCMP_CTRL_WARMTIME_MASK);
98  VCMP->CTRL |= (vcmpInit->warmup << _VCMP_CTRL_WARMTIME_SHIFT);
99 
100  /* Configure hysteresis */
101  switch (vcmpInit->hyst)
102  {
103  case vcmpHyst20mV:
104  VCMP->CTRL |= VCMP_CTRL_HYSTEN;
105  break;
106  case vcmpHystNone:
107  VCMP->CTRL &= ~(VCMP_CTRL_HYSTEN);
108  break;
109  default:
110  break;
111  }
112 
113  /* Configure inactive output value */
114  VCMP->CTRL |= (vcmpInit->inactive << _VCMP_CTRL_INACTVAL_SHIFT);
115 
116  /* Configure trigger level */
117  VCMP_TriggerSet(vcmpInit->triggerLevel);
118 
119  /* Enable or disable VCMP */
120  if (vcmpInit->enable)
121  {
122  VCMP->CTRL |= VCMP_CTRL_EN;
123  }
124  else
125  {
126  VCMP->CTRL &= ~(VCMP_CTRL_EN);
127  }
128 
129  /* If Low Power Reference is enabled, wait until VCMP is ready */
130  /* before enabling it, see reference manual for deatils */
131  /* Configuring Low Power Ref without enable has no effect */
132  if(vcmpInit->lowPowerRef && vcmpInit->enable)
133  {
134  /* Poll for VCMP ready */
135  while(!VCMP_Ready());
136  VCMP_LowPowerRefSet(vcmpInit->lowPowerRef);
137  }
138 
139  /* Clear edge interrupt */
141 }
142 
143 
144 /***************************************************************************/
151 void VCMP_LowPowerRefSet(bool enable)
152 {
153  if (enable)
154  {
155  VCMP->INPUTSEL |= VCMP_INPUTSEL_LPREF;
156  }
157  else
158  {
159  VCMP->INPUTSEL &= ~VCMP_INPUTSEL_LPREF;
160  }
161 }
162 
163 
164 /***************************************************************************/
171 void VCMP_TriggerSet(int level)
172 {
173  /* Trigger range is 6 bits, value from 0-63 */
174  EFM_ASSERT((level > 0) && (level < 64));
175 
176  /* Set trigger level */
177  VCMP->INPUTSEL = (VCMP->INPUTSEL & ~(_VCMP_INPUTSEL_TRIGLEVEL_MASK))
178  | (level << _VCMP_INPUTSEL_TRIGLEVEL_SHIFT);
179 }
180 
181 
184 #endif /* defined(VCMP_COUNT) && (VCMP_COUNT > 0) */
#define VCMP_CTRL_IFALL
Definition: efm32wg_vcmp.h:100
void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit)
Configure and enable Voltage Comparator.
Definition: em_vcmp.c:56
#define _VCMP_INPUTSEL_TRIGLEVEL_MASK
Definition: efm32wg_vcmp.h:119
Emlib peripheral API "assert" implementation.
Voltage Comparator (VCMP) peripheral API.
#define _VCMP_CTRL_WARMTIME_MASK
Definition: efm32wg_vcmp.h:76
VCMP_Hysteresis_TypeDef hyst
Definition: em_vcmp.h:110
__STATIC_INLINE void VCMP_IntClear(uint32_t flags)
Clear one or more pending VCMP interrupts.
Definition: em_vcmp.h:243
#define VCMP_INPUTSEL_LPREF
Definition: efm32wg_vcmp.h:122
#define _VCMP_CTRL_BIASPROG_SHIFT
Definition: efm32wg_vcmp.h:105
#define VCMP_CTRL_IRISE
Definition: efm32wg_vcmp.h:95
#define VCMP_CTRL_HALFBIAS
Definition: efm32wg_vcmp.h:109
void VCMP_TriggerSet(int level)
Configure trigger level of voltage comparator.
Definition: em_vcmp.c:171
__STATIC_INLINE bool VCMP_Ready(void)
VCMP output is ready.
Definition: em_vcmp.h:221
#define VCMP
#define VCMP_CTRL_HYSTEN
Definition: efm32wg_vcmp.h:70
void VCMP_LowPowerRefSet(bool enable)
Enable or disable Low Power Reference setting.
Definition: em_vcmp.c:151
#define _VCMP_CTRL_INACTVAL_SHIFT
Definition: efm32wg_vcmp.h:66
#define _VCMP_CTRL_BIASPROG_MASK
Definition: efm32wg_vcmp.h:106
VCMP_WarmTime_TypeDef warmup
Definition: em_vcmp.h:108
#define VCMP_IF_EDGE
Definition: efm32wg_vcmp.h:159
#define VCMP_CTRL_EN
Definition: efm32wg_vcmp.h:60
#define _VCMP_CTRL_WARMTIME_SHIFT
Definition: efm32wg_vcmp.h:75
#define _VCMP_INPUTSEL_TRIGLEVEL_SHIFT
Definition: efm32wg_vcmp.h:118