rt-thread-official/bsp/efm32/Libraries/efm32lib/inc/efm32_vcmp.h

353 lines
12 KiB
C

/***************************************************************************//**
* @file
* @brief Voltage Comparator (VCMP) peripheral API for EFM32
* @author Energy Micro AS
* @version 2.3.0
*******************************************************************************
* @section License
* <b>(C) Copyright 2010 Energy Micro AS, http://www.energymicro.com</b>
*******************************************************************************
*
* This source code is the property of Energy Micro AS. The source and compiled
* code may only be used on Energy Micro "EFM32" microcontrollers.
*
* This copyright notice may not be removed from the source code nor changed.
*
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Energy Micro AS has no
* obligation to support this Software. Energy Micro AS is providing the
* Software "AS IS", with no express or implied warranties of any kind,
* including, but not limited to, any implied warranties of merchantability
* or fitness for any particular purpose or warranties against infringement
* of any proprietary rights of a third party.
*
* Energy Micro AS will not be liable for any consequential, incidental, or
* special damages, or any other relief, or for any claim by any third party,
* arising from your use of this Software.
*
******************************************************************************/
#ifndef __EFM32_VCMP_H
#define __EFM32_VCMP_H
#include "efm32.h"
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************//**
* @addtogroup EFM32_Library
* @{
******************************************************************************/
/***************************************************************************//**
* @addtogroup VCMP
* @{
******************************************************************************/
/*******************************************************************************
******************************** ENUMS ************************************
******************************************************************************/
/** Warm-up Time in High Frequency Peripheral Clock cycles */
typedef enum
{
/** 4 cycles */
vcmpWarmTime4Cycles = _VCMP_CTRL_WARMTIME_4CYCLES,
/** 8 cycles */
vcmpWarmTime8Cycles = _VCMP_CTRL_WARMTIME_8CYCLES,
/** 16 cycles */
vcmpWarmTime16Cycles = _VCMP_CTRL_WARMTIME_16CYCLES,
/** 32 cycles */
vcmpWarmTime32Cycles = _VCMP_CTRL_WARMTIME_32CYCLES,
/** 64 cycles */
vcmpWarmTime64Cycles = _VCMP_CTRL_WARMTIME_64CYCLES,
/** 128 cycles */
vcmpWarmTime128Cycles = _VCMP_CTRL_WARMTIME_128CYCLES,
/** 256 cycles */
vcmpWarmTime256Cycles = _VCMP_CTRL_WARMTIME_256CYCLES,
/** 512 cycles */
vcmpWarmTime512Cycles = _VCMP_CTRL_WARMTIME_512CYCLES
} VCMP_WarmTime_TypeDef;
/** Hyseresis configuration */
typedef enum
{
/** Normal operation, no hysteresis */
vcmpHystNone,
/** Digital output will not toggle until positive edge is at least
* 20mV above or below negative input voltage */
vcmpHyst20mV
} VCMP_Hysteresis_TypeDef;
/*******************************************************************************
******************************* STRUCTS ***********************************
******************************************************************************/
/** VCMP Initialization structure */
typedef struct
{
/** If set to true, will reduce by half the bias current */
bool halfBias;
/** BIAS current configuration, depends on halfBias setting,
* above, see reference manual */
int biasProg;
/** Enable interrupt for falling edge */
bool irqFalling;
/** Enable interrupt for rising edge */
bool irqRising;
/** Warm-up time in clock cycles */
VCMP_WarmTime_TypeDef warmup;
/** Hysteresis configuration */
VCMP_Hysteresis_TypeDef hyst;
/** Output value when comparator is inactive, should be 0 or 1 */
int inactive;
/** Enable low power mode for VDD and bandgap reference */
bool lowPowerRef;
/** Trigger level, according to formula
* VDD Trigger Level = 1.667V + 0.034V x triggerLevel */
int triggerLevel;
/** Enable VCMP after configuration */
bool enable;
} VCMP_Init_TypeDef;
/** Default VCMP initialization structure */
#define VCMP_INIT_DEFAULT \
{ true, /** Half Bias enabled */ \
0x7, /** Bias curernt 0.7 uA when half bias enabled */ \
false, /** Falling edge sense not enabled */ \
false, /** Rising edge sense not enabled */ \
vcmpWarmTime4Cycles, /** 4 clock cycles warm-up time */ \
vcmpHystNone, /** No hysteresis */ \
0, /** 0 in digital ouput when inactive */ \
true, /** Do not use low power reference */ \
39, /** Trigger level just below 3V */ \
true, /** Enable after init */ \
}
/*******************************************************************************
***************************** PROTOTYPES **********************************
******************************************************************************/
void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit);
void VCMP_LowPowerRefSet(bool enable);
void VCMP_TriggerSet(int level);
static __INLINE void VCMP_Enable(void);
static __INLINE void VCMP_Disable(void);
static __INLINE uint32_t VCMP_VoltageToLevel(float v);
static __INLINE bool VCMP_VDDLower(void);
static __INLINE bool VCMP_VDDHigher(void);
static __INLINE bool VCMP_Ready(void);
static __INLINE void VCMP_IntClear(uint32_t flags);
static __INLINE void VCMP_IntSet(uint32_t flags);
static __INLINE void VCMP_IntDisable(uint32_t flags);
static __INLINE void VCMP_IntEnable(uint32_t flags);
static __INLINE uint32_t VCMP_IntGet(void);
static __INLINE uint32_t VCMP_IntGetEnabled(void);
/***************************************************************************//**
* @brief
* Enable Voltage Comparator
******************************************************************************/
static __INLINE void VCMP_Enable(void)
{
VCMP->CTRL |= VCMP_CTRL_EN;
}
/***************************************************************************//**
* @brief
* Disable Voltage Comparator
******************************************************************************/
static __INLINE void VCMP_Disable(void)
{
VCMP->CTRL &= ~(VCMP_CTRL_EN);
}
/***************************************************************************//**
* @brief
* Calculate voltage to trigger level
*
* @note
* You need soft float support for this function to be working
*
* @param[in] v
* Voltage Level for trigger
******************************************************************************/
static __INLINE uint32_t VCMP_VoltageToLevel(float v)
{
return (uint32_t)((v - (float)1.667) / (float)0.034);
}
/***************************************************************************//**
* @brief
* Returns true, if Voltage Comparator indicated VDD < trigger level, else
* false
******************************************************************************/
static __INLINE bool VCMP_VDDLower(void)
{
if (VCMP->STATUS & VCMP_STATUS_VCMPOUT)
{
return false;
}
else
{
return true;
}
}
/***************************************************************************//**
* @brief
* Returns true, if Voltage Comparator indicated VDD > trigger level, else
* false
******************************************************************************/
static __INLINE bool VCMP_VDDHigher(void)
{
if (VCMP->STATUS & VCMP_STATUS_VCMPOUT)
{
return true;
}
else
{
return false;
}
}
/***************************************************************************//**
* @brief
* VCMP output is ready
******************************************************************************/
static __INLINE bool VCMP_Ready(void)
{
if (VCMP->STATUS & VCMP_STATUS_VCMPACT)
{
return true;
}
else
{
return false;
}
}
/***************************************************************************//**
* @brief
* Clear one or more pending VCMP interrupts.
*
* @param[in] flags
* VCMP interrupt sources to clear. Use a set of interrupt flags OR-ed
* together to clear multiple interrupt sources for the VCMP module
* (VCMP_IFS_nnn).
******************************************************************************/
static __INLINE void VCMP_IntClear(uint32_t flags)
{
VCMP->IFC = flags;
}
/***************************************************************************//**
* @brief
* Set one or more pending VCMP interrupts from SW.
*
* @param[in] flags
* VCMP interrupt sources to set to pending. Use a set of interrupt flags
* OR-ed together to set multiple interrupt sources for the VCMP module
* (VCMP_IFS_nnn).
******************************************************************************/
static __INLINE void VCMP_IntSet(uint32_t flags)
{
VCMP->IFS = flags;
}
/***************************************************************************//**
* @brief
* Disable one or more VCMP interrupts
*
* @param[in] flags
* VCMP interrupt sources to enable. Use a set of interrupt flags OR-ed
* together to set multiple interrupt sources for the VCMP module
* (VCMP_IFS_nnn).
******************************************************************************/
static __INLINE void VCMP_IntDisable(uint32_t flags)
{
VCMP->IEN &= ~(flags);
}
/***************************************************************************//**
* @brief
* Enable one or more VCMP interrupts
*
* @param[in] flags
* VCMP interrupt sources to enable. Use a set of interrupt flags OR-ed
* together to set multiple interrupt sources for the VCMP module
* (VCMP_IFS_nnn).
******************************************************************************/
static __INLINE void VCMP_IntEnable(uint32_t flags)
{
VCMP->IEN |= flags;
}
/***************************************************************************//**
* @brief
* Get pending VCMP interrupt flags
*
* @note
* The event bits are not cleared by the use of this function
*
* @return
* Pending VCMP interrupt sources. Returns a set of interrupt flags OR-ed
* together for multiple interrupt sources in the VCMP module (VCMP_IFS_nnn).
******************************************************************************/
static __INLINE uint32_t VCMP_IntGet(void)
{
return(VCMP->IF);
}
/***************************************************************************//**
* @brief
* Get enabled and pending VCMP interrupt flags.
*
* @details
* Useful for handling more interrupt sources in the same interrupt handler.
*
* @note
* The event bits are not cleared by the use of this function.
*
* @return
* Pending and enabled VCMP interrupt sources.
* The return value is the bitwise AND combination of
* - the OR combination of enabled interrupt sources in VCMP_IEN_nnn
* register (VCMP_IEN_nnn) and
* - the OR combination of valid interrupt flags of the VCMP module
* (VCMP_IF_nnn).
******************************************************************************/
static __INLINE uint32_t VCMP_IntGetEnabled(void)
{
uint32_t tmp = 0U;
/* Store VCMP->IEN in temporary variable in order to define explicit order
* of volatile accesses. */
tmp = VCMP->IEN;
/* Bitwise AND of pending and enabled interrupts */
return VCMP->IF & tmp;
}
/** @} (end addtogroup VCMP) */
/** @} (end addtogroup EFM32_Library) */
#ifdef __cplusplus
}
#endif
#endif /* __EFM32_VCMP_H */