/***************************************************************************//** * @file em_burtc.h * @brief Backup Real Time Counter (BURTC) peripheral API * @version 4.0.0 ******************************************************************************* * @section License * (C) Copyright 2014 Silicon Labs, http://www.silabs.com ******************************************************************************* * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no * obligation to support this Software. Silicon Labs 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. * * Silicon Labs 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 __SILICON_LABS_EM_BURTC_H_ #define __SILICON_LABS_EM_BURTC_H_ #include #include "em_device.h" #if defined(BURTC_PRESENT) #include "em_assert.h" #include "em_bitband.h" #ifdef __cplusplus extern "C" { #endif /***************************************************************************//** * @addtogroup EM_Library * @{ ******************************************************************************/ /***************************************************************************//** * @addtogroup BURTC * @{ ******************************************************************************/ /******************************************************************************* ******************************* DEFINES *********************************** ******************************************************************************/ /** BURTC clock divisors. These values are valid for the BURTC prescaler. */ #define burtcClkDiv_1 1 /**< Divide clock by 1. */ #define burtcClkDiv_2 2 /**< Divide clock by 2. */ #define burtcClkDiv_4 4 /**< Divide clock by 4. */ #define burtcClkDiv_8 8 /**< Divide clock by 8. */ #define burtcClkDiv_16 16 /**< Divide clock by 16. */ #define burtcClkDiv_32 32 /**< Divide clock by 32. */ #define burtcClkDiv_64 64 /**< Divide clock by 64. */ #define burtcClkDiv_128 128 /**< Divide clock by 128. */ /******************************************************************************* ******************************** ENUMS ************************************ ******************************************************************************/ /** BURTC clock selection */ typedef enum { /** Ultra low frequency (1 kHz) clock */ burtcClkSelULFRCO = BURTC_CTRL_CLKSEL_ULFRCO, /** Low frequency RC oscillator */ burtcClkSelLFRCO = BURTC_CTRL_CLKSEL_LFRCO, /** Low frequency crystal osciallator */ burtcClkSelLFXO = BURTC_CTRL_CLKSEL_LFXO } BURTC_ClkSel_TypeDef; /** BURTC mode of operation */ typedef enum { /** Disable BURTC */ burtcModeDisable = BURTC_CTRL_MODE_DISABLE, /** Enable and start BURTC counter in EM0 to EM2 */ burtcModeEM2 = BURTC_CTRL_MODE_EM2EN, /** Enable and start BURTC counter in EM0 to EM3 */ burtcModeEM3 = BURTC_CTRL_MODE_EM3EN, /** Enable and start BURTC counter in EM0 to EM4 */ burtcModeEM4 = BURTC_CTRL_MODE_EM4EN, } BURTC_Mode_TypeDef; /** BURTC low power mode */ typedef enum { /** Low Power Mode is disabled */ burtcLPDisable = BURTC_LPMODE_LPMODE_DISABLE, /** Low Power Mode is always enabled */ burtcLPEnable = BURTC_LPMODE_LPMODE_ENABLE, /** Low Power Mode when system enters backup mode */ burtcLPBU = BURTC_LPMODE_LPMODE_BUEN } BURTC_LP_TypeDef; /******************************************************************************* ******************************* STRUCTS *********************************** ******************************************************************************/ /** BURTC initialization structure. */ typedef struct { bool enable; /**< Enable BURTC after initialization (starts counter) */ BURTC_Mode_TypeDef mode; /**< Configure energy mode operation */ bool debugRun; /**< If true, counter will keep running under debug halt */ BURTC_ClkSel_TypeDef clkSel; /**< Select clock source */ uint32_t clkDiv; /**< Clock divider; for ULFRCO 1Khz or 2kHz operation */ uint32_t lowPowerComp; /**< Number of least significantt clock bits to ignore in low power mode */ bool timeStamp; /**< Enable time stamp on entering backup power domain */ bool compare0Top; /**< Set if Compare Value 0 is also top value (counter restart) */ BURTC_LP_TypeDef lowPowerMode; /**< Low power operation mode, requires LFXO or LFRCO */ } BURTC_Init_TypeDef; /** Default configuration for BURTC init structure */ #define BURTC_INIT_DEFAULT \ { true, \ burtcModeEM2, \ false, \ burtcClkSelULFRCO, \ burtcClkDiv_1, \ 0, \ true, \ false, \ burtcLPDisable, \ } /******************************************************************************* ***************************** PROTOTYPES ********************************** ******************************************************************************/ /***************************************************************************//** * @brief * Clear one or more pending BURTC interrupts. * * @param[in] flags * BURTC interrupt sources to clear. Use a set of interrupt flags OR-ed * together to clear multiple interrupt sources for the BURTC module * (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE void BURTC_IntClear(uint32_t flags) { BURTC->IFC = flags; } /***************************************************************************//** * @brief * Disable one or more BURTC interrupts. * * @param[in] flags * BURTC interrupt sources to disable. Use a set of interrupt flags OR-ed * together to disable multiple interrupt sources for the BURTC module * (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE void BURTC_IntDisable(uint32_t flags) { BURTC->IEN &= ~(flags); } /***************************************************************************//** * @brief * Enable one or more BURTC interrupts. * * @note * Depending on the use, a pending interrupt may already be set prior to * enabling the interrupt. Consider using BURTC_IntClear() prior to enabling * if such a pending interrupt should be ignored. * * @param[in] flags * BURTC interrupt sources to enable. Use a set of interrupt flags OR-ed * together to set multiple interrupt sources for the BURTC module * (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE void BURTC_IntEnable(uint32_t flags) { BURTC->IEN |= flags; } /***************************************************************************//** * @brief * Get pending BURTC interrupt flags. * * @note * The event bits are not cleared by the use of this function. * * @return * Pending BURTC interrupt sources. Returns a set of interrupt flags OR-ed * together for multiple interrupt sources in the BURTC module (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_IntGet(void) { return(BURTC->IF); } /***************************************************************************//** * @brief * Get enabled and pending BURTC interrupt flags. * * @note * The event bits are not cleared by the use of this function. * * @return * Pending BURTC interrupt sources that is also enabled. Returns a set of * interrupt flags OR-ed together for multiple interrupt sources in the * BURTC module (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_IntGetEnabled(void) { uint32_t tmp; /* Get enabled interrupts */ tmp = BURTC->IEN; /* Return set intterupts */ return BURTC->IF & tmp; } /***************************************************************************//** * @brief * Set one or more pending BURTC interrupts from SW. * * @param[in] flags * BURTC interrupt sources to set to pending. Use a set of interrupt flags * OR-ed together to set multiple interrupt sources for the BURTC module * (BURTC_IFS_nnn). ******************************************************************************/ __STATIC_INLINE void BURTC_IntSet(uint32_t flags) { BURTC->IFS = flags; } /***************************************************************************//** * @brief * Status of BURTC RAM, timestamp and LP Mode * * @return A mask logially OR-ed status bits ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_Status(void) { return BURTC->STATUS; } /***************************************************************************//** * @brief * Clear and reset BURTC status register ******************************************************************************/ __STATIC_INLINE void BURTC_StatusClear(void) { BURTC->CMD = BURTC_CMD_CLRSTATUS; } /***************************************************************************//** * @brief * Enable or Disable BURTC peripheral reset and start counter * @param[in] enable * If true; asserts reset to BURTC, halts counter, if false; deassert reset ******************************************************************************/ __STATIC_INLINE void BURTC_Enable(bool enable) { /* Note! If mode is disabled, BURTC counter will not start */ EFM_ASSERT(((enable == true) && ((BURTC->CTRL & _BURTC_CTRL_MODE_MASK) != BURTC_CTRL_MODE_DISABLE)) || (enable == false)); if (enable) { BITBAND_Peripheral(&BURTC->CTRL, _BURTC_CTRL_RSTEN_SHIFT, 0); } else { BITBAND_Peripheral(&BURTC->CTRL, _BURTC_CTRL_RSTEN_SHIFT, 1); } } /***************************************************************************//** * @brief Get BURTC counter * * @return * BURTC counter value ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_CounterGet(void) { return BURTC->CNT; } /***************************************************************************//** * @brief Get BURTC timestamp for entering BU * * @return * BURTC Time Stamp value ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_TimestampGet(void) { return BURTC->TIMESTAMP; } /***************************************************************************//** * @brief Freeze register updates until enabled * @param[in] enable If true, registers are not updated until enabled again. ******************************************************************************/ __STATIC_INLINE void BURTC_FreezeEnable(bool enable) { BITBAND_Peripheral(&BURTC->FREEZE, _BURTC_FREEZE_REGFREEZE_SHIFT, enable); } /***************************************************************************//** * @brief Shut down power to rentention register bank. * @param[in] enable * If true, shuts off power to retention registers. * @note * When power rentention is disabled, it cannot be enabled again (until * reset). ******************************************************************************/ __STATIC_INLINE void BURTC_Powerdown(bool enable) { BITBAND_Peripheral(&BURTC->POWERDOWN, _BURTC_POWERDOWN_RAM_SHIFT, enable); } /***************************************************************************//** * @brief * Set a value in one of the retention registers * * @param[in] num * Register to set * @param[in] data * Value to put into register ******************************************************************************/ __STATIC_INLINE void BURTC_RetRegSet(uint32_t num, uint32_t data) { EFM_ASSERT(num <= 127); BURTC->RET[num].REG = data; } /***************************************************************************//** * @brief * Read a value from one of the retention registers * * @param[in] num * Retention Register to read ******************************************************************************/ __STATIC_INLINE uint32_t BURTC_RetRegGet(uint32_t num) { EFM_ASSERT(num <= 127); return BURTC->RET[num].REG; } /***************************************************************************//** * @brief * Lock BURTC registers, will protect from writing new config settings ******************************************************************************/ __STATIC_INLINE void BURTC_Lock(void) { BURTC->LOCK = BURTC_LOCK_LOCKKEY_LOCK; } /***************************************************************************//** * @brief * Unlock BURTC registers, enable write access to change configuration ******************************************************************************/ __STATIC_INLINE void BURTC_Unlock(void) { BURTC->LOCK = BURTC_LOCK_LOCKKEY_UNLOCK; } void BURTC_Reset(void); void BURTC_Init(const BURTC_Init_TypeDef *burtcInit); void BURTC_CounterReset(void); void BURTC_CompareSet(unsigned int comp, uint32_t value); uint32_t BURTC_CompareGet(unsigned int comp); uint32_t BURTC_ClockFreqGet(void); /** @} (end addtogroup BURTC) */ /** @} (end addtogroup EM_Library) */ #ifdef __cplusplus } #endif #endif /* BURTC_PRESENT */ #endif /* __SILICON_LABS_EM_BURTC_H_ */