em_vcmp.c
Go to the documentation of this file.00001
00034 #include "em_vcmp.h"
00035 #if defined(VCMP_COUNT) && (VCMP_COUNT > 0)
00036
00037 #include "em_assert.h"
00038
00039
00044
00050
00057 void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit)
00058 {
00059
00060 EFM_ASSERT((vcmpInit->inactive == 0) || (vcmpInit->inactive == 1));
00061 EFM_ASSERT((vcmpInit->biasProg >= 0) && (vcmpInit->biasProg < 16));
00062
00063
00064 if (vcmpInit->halfBias)
00065 {
00066 VCMP->CTRL |= VCMP_CTRL_HALFBIAS;
00067 }
00068 else
00069 {
00070 VCMP->CTRL &= ~(VCMP_CTRL_HALFBIAS);
00071 }
00072
00073
00074 VCMP->CTRL &= ~(_VCMP_CTRL_BIASPROG_MASK);
00075 VCMP->CTRL |= (vcmpInit->biasProg << _VCMP_CTRL_BIASPROG_SHIFT);
00076
00077
00078 if (vcmpInit->irqFalling)
00079 {
00080 VCMP->CTRL |= VCMP_CTRL_IFALL;
00081 }
00082 else
00083 {
00084 VCMP->CTRL &= ~(VCMP_CTRL_IFALL);
00085 }
00086
00087
00088 if (vcmpInit->irqRising)
00089 {
00090 VCMP->CTRL |= VCMP_CTRL_IRISE;
00091 }
00092 else
00093 {
00094 VCMP->CTRL &= ~(VCMP_CTRL_IRISE);
00095 }
00096
00097
00098 VCMP->CTRL &= ~(_VCMP_CTRL_WARMTIME_MASK);
00099 VCMP->CTRL |= (vcmpInit->warmup << _VCMP_CTRL_WARMTIME_SHIFT);
00100
00101
00102 switch (vcmpInit->hyst)
00103 {
00104 case vcmpHyst20mV:
00105 VCMP->CTRL |= VCMP_CTRL_HYSTEN;
00106 break;
00107 case vcmpHystNone:
00108 VCMP->CTRL &= ~(VCMP_CTRL_HYSTEN);
00109 break;
00110 default:
00111 break;
00112 }
00113
00114
00115 VCMP->CTRL |= (vcmpInit->inactive << _VCMP_CTRL_INACTVAL_SHIFT);
00116
00117
00118 VCMP_TriggerSet(vcmpInit->triggerLevel);
00119
00120
00121 if (vcmpInit->enable)
00122 {
00123 VCMP->CTRL |= VCMP_CTRL_EN;
00124 }
00125 else
00126 {
00127 VCMP->CTRL &= ~(VCMP_CTRL_EN);
00128 }
00129
00130
00131
00132
00133 if(vcmpInit->lowPowerRef && vcmpInit->enable)
00134 {
00135
00136 while(!VCMP_Ready());
00137 VCMP_LowPowerRefSet(vcmpInit->lowPowerRef);
00138 }
00139
00140
00141 VCMP_IntClear(VCMP_IF_EDGE);
00142 }
00143
00144
00145
00152 void VCMP_LowPowerRefSet(bool enable)
00153 {
00154 if (enable)
00155 {
00156 VCMP->INPUTSEL |= VCMP_INPUTSEL_LPREF;
00157 }
00158 else
00159 {
00160 VCMP->INPUTSEL &= ~(VCMP_INPUTSEL_LPREF);
00161 }
00162 }
00163
00164
00165
00172 void VCMP_TriggerSet(int level)
00173 {
00174
00175 EFM_ASSERT((level > 0) && (level < 64));
00176
00177
00178 VCMP->INPUTSEL = (VCMP->INPUTSEL & ~(_VCMP_INPUTSEL_TRIGLEVEL_MASK)) |
00179 (level << _VCMP_INPUTSEL_TRIGLEVEL_SHIFT);
00180 }
00181
00182
00185 #endif