123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- /***************************************************************************//**
- * @file
- * @brief Backup Real Time Counter (BURTC) peripheral API
- * @author Energy Micro AS
- * @version 3.0.0
- *******************************************************************************
- * @section License
- * <b>(C) Copyright 2012 Energy Micro AS, http://www.energymicro.com</b>
- *******************************************************************************
- *
- * 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: 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 __EM_BURTC_H
- #define __EM_BURTC_H
- #include <stdbool.h>
- #include "em_part.h"
- #if defined(BURTC_PRESENT)
- #include "em_assert.h"
- #include "em_bitband.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /***************************************************************************//**
- * @addtogroup EM_Library
- * @{
- ******************************************************************************/
- /***************************************************************************//**
- * @addtogroup BURTC
- * @{
- ******************************************************************************/
- /*******************************************************************************
- ******************************* DEFINES ***********************************
- ******************************************************************************/
- #define burtcClkDiv_1 1
- #define burtcClkDiv_2 2
- #define burtcClkDiv_4 4
- #define burtcClkDiv_8 8
- #define burtcClkDiv_16 16
- #define burtcClkDiv_32 32
- #define burtcClkDiv_64 64
- #define burtcClkDiv_128 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);
- /** @} (end addtogroup BURTC) */
- /** @} (end addtogroup EM_Library) */
- #ifdef __cplusplus
- }
- #endif
- #endif /* BURTC_PRESENT */
- #endif /* __EM_BURTC_H */
|