/**************************************************************************//** * @brief Check if voltage is higher than indicated * * @param vdd * The voltage level to compare against. * @return * Returns true if voltage is lower, false otherwise *****************************************************************************/ bool VDDCHECK_LowVoltage(float vdd) { VCMP_Init_TypeDef vcmp = VCMP_INIT_DEFAULT; /* Configure VCMP */ vcmp.triggerLevel = VCMP_VoltageToLevel(vdd); vcmp.warmup = vcmpWarmTime128Cycles; vcmp.lowPowerRef = false; vcmp.enable = true; VCMP_Init(&vcmp); /* Delay until warm up ready */ while (!VCMP_Ready()) ; /* If zero result, voltage is lower */ if (VCMP_VDDHigher()) return false; /* Otherwise return false */ return true; }
/***************************************************************************//** * @brief * Configure and enable Voltage Comparator * * @param[in] vcmpInit * VCMP Initialization structure ******************************************************************************/ void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit) { /* Verify input */ EFM_ASSERT((vcmpInit->inactive == 0) || (vcmpInit->inactive == 1)); EFM_ASSERT((vcmpInit->biasProg >= 0) && (vcmpInit->biasProg < 16)); /* Configure Half Bias setting */ if (vcmpInit->halfBias) { VCMP->CTRL |= VCMP_CTRL_HALFBIAS; } else { VCMP->CTRL &= ~(VCMP_CTRL_HALFBIAS); } /* Configure bias prog */ VCMP->CTRL &= ~(_VCMP_CTRL_BIASPROG_MASK); VCMP->CTRL |= (vcmpInit->biasProg << _VCMP_CTRL_BIASPROG_SHIFT); /* Configure sense for falling edge */ if (vcmpInit->irqFalling) { VCMP->CTRL |= VCMP_CTRL_IFALL; } else { VCMP->CTRL &= ~(VCMP_CTRL_IFALL); } /* Configure sense for rising edge */ if (vcmpInit->irqRising) { VCMP->CTRL |= VCMP_CTRL_IRISE; } else { VCMP->CTRL &= ~(VCMP_CTRL_IRISE); } /* Configure warm-up time */ VCMP->CTRL &= ~(_VCMP_CTRL_WARMTIME_MASK); VCMP->CTRL |= (vcmpInit->warmup << _VCMP_CTRL_WARMTIME_SHIFT); /* Configure hysteresis */ switch (vcmpInit->hyst) { case vcmpHyst20mV: VCMP->CTRL |= VCMP_CTRL_HYSTEN; break; case vcmpHystNone: VCMP->CTRL &= ~(VCMP_CTRL_HYSTEN); break; default: break; } /* Configure inactive output value */ VCMP->CTRL |= (vcmpInit->inactive << _VCMP_CTRL_INACTVAL_SHIFT); /* Configure trigger level */ VCMP_TriggerSet(vcmpInit->triggerLevel); /* Enable or disable VCMP */ if (vcmpInit->enable) { VCMP->CTRL |= VCMP_CTRL_EN; } else { VCMP->CTRL &= ~(VCMP_CTRL_EN); } /* If Low Power Reference is enabled, wait until VCMP is ready */ /* before enabling it, see reference manual for deatils */ /* Configuring Low Power Ref without enable has no effect */ if(vcmpInit->lowPowerRef && vcmpInit->enable) { /* Poll for VCMP ready */ while(!VCMP_Ready()); VCMP_LowPowerRefSet(vcmpInit->lowPowerRef); } /* Clear edge interrupt */ VCMP_IntClear(VCMP_IF_EDGE); }