311 lines
9.6 KiB
C
311 lines
9.6 KiB
C
|
/*
|
||
|
* @brief LPC5410X RTC chip driver
|
||
|
*
|
||
|
* @note
|
||
|
* Copyright(C) NXP Semiconductors, 2014
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* @par
|
||
|
* Software that is described herein is for illustrative purposes only
|
||
|
* which provides customers with programming information regarding the
|
||
|
* LPC products. This software is supplied "AS IS" without any warranties of
|
||
|
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
||
|
* all warranties, express or implied, including all implied warranties of
|
||
|
* merchantability, fitness for a particular purpose and non-infringement of
|
||
|
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
||
|
* or liability for the use of the software, conveys no license or rights under any
|
||
|
* patent, copyright, mask work right, or any other intellectual property rights in
|
||
|
* or to any products. NXP Semiconductors reserves the right to make changes
|
||
|
* in the software without notification. NXP Semiconductors also makes no
|
||
|
* representation or warranty that such application will be suitable for the
|
||
|
* specified use without further testing or modification.
|
||
|
*
|
||
|
* @par
|
||
|
* Permission to use, copy, modify, and distribute this software and its
|
||
|
* documentation is hereby granted, under NXP Semiconductors' and its
|
||
|
* licensor's relevant copyrights in the software, without fee, provided that it
|
||
|
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
||
|
* copyright, permission, and disclaimer notice must appear in all copies of
|
||
|
* this code.
|
||
|
*/
|
||
|
|
||
|
#ifndef __RTC_5410X_H_
|
||
|
#define __RTC_5410X_H_
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/** @defgroup RTC_5410X CHIP: LPC5410X Real Time clock
|
||
|
* @ingroup CHIP_5410X_DRIVERS
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief LPC5410X Real Time clock register block structure
|
||
|
*/
|
||
|
typedef struct { /*!< RTC */
|
||
|
__IO uint32_t CTRL; /*!< RTC control register */
|
||
|
__IO uint32_t MATCH; /*!< PRTC match (alarm) register */
|
||
|
__IO uint32_t COUNT; /*!< RTC counter register */
|
||
|
__IO uint32_t WAKE; /*!< RTC high-resolution/wake-up timer control register */
|
||
|
} LPC_RTC_T;
|
||
|
|
||
|
/* CTRL register defniitions */
|
||
|
#define RTC_CTRL_SWRESET (1 << 0) /*!< Apply reset to RTC */
|
||
|
#define RTC_CTRL_OFD (1 << 1) /*!< Oscillator fail detect status (failed bit) */
|
||
|
#define RTC_CTRL_ALARM1HZ (1 << 2) /*!< RTC 1 Hz timer alarm flag status (match) bit */
|
||
|
#define RTC_CTRL_WAKE1KHZ (1 << 3) /*!< RTC 1 kHz timer wake-up flag status (timeout) bit */
|
||
|
#define RTC_CTRL_ALARMDPD_EN (1 << 4) /*!< RTC 1 Hz timer alarm for Deep power-down enable bit */
|
||
|
#define RTC_CTRL_WAKEDPD_EN (1 << 5) /*!< RTC 1 kHz timer wake-up for Deep power-down enable bit */
|
||
|
#define RTC_CTRL_RTC1KHZ_EN (1 << 6) /*!< RTC 1 kHz clock enable bit */
|
||
|
#define RTC_CTRL_RTC_EN (1 << 7) /*!< RTC enable bit */
|
||
|
#define RTC_CTRL_MASK ((uint32_t) 0xF1) /*!< RTC Control register Mask for reserved and status bits */
|
||
|
|
||
|
/**
|
||
|
* @brief Initialize the RTC peripheral
|
||
|
* @param pRTC : RTC peripheral selected
|
||
|
* @return None
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Init(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_RTC);
|
||
|
Chip_SYSCON_PeriphReset(RESET_RTC);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief De-initialize the RTC peripheral
|
||
|
* @param pRTC : RTC peripheral selected
|
||
|
* @return None
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_DeInit(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_RTC);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Enable RTC options
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param flags : And OR'ed value of RTC_CTRL_* definitions to enable
|
||
|
* @return Nothing
|
||
|
* @note You can enable multiple RTC options at once using this function
|
||
|
* by OR'ing them together. It is recommended to only use the
|
||
|
* RTC_CTRL_ALARMDPD_EN, RTC_CTRL_WAKEDPD_EN, RTC_CTRL_RTC1KHZ_EN, and
|
||
|
* RTC_CTRL_RTC_EN flags with this function.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_EnableOptions(LPC_RTC_T *pRTC, uint32_t flags)
|
||
|
{
|
||
|
pRTC->CTRL = (pRTC->CTRL & RTC_CTRL_MASK) | flags;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Disable RTC options
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param flags : And OR'ed value of RTC_CTRL_* definitions to disable
|
||
|
* @return Nothing
|
||
|
* @note You can enable multiple RTC options at once using this function
|
||
|
* by OR'ing them together. It is recommended to only use the
|
||
|
* RTC_CTRL_ALARMDPD_EN, RTC_CTRL_WAKEDPD_EN, RTC_CTRL_RTC1KHZ_EN, and
|
||
|
* RTC_CTRL_RTC_EN flags with this function.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_DisableOptions(LPC_RTC_T *pRTC, uint32_t flags)
|
||
|
{
|
||
|
pRTC->CTRL = (pRTC->CTRL & RTC_CTRL_MASK) & ~flags;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Reset RTC
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Nothing
|
||
|
* @note The RTC state will be returned to it's default.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Reset(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_RTC_EnableOptions(pRTC, RTC_CTRL_SWRESET);
|
||
|
Chip_RTC_DisableOptions(pRTC, RTC_CTRL_SWRESET);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Enables the RTC
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Nothing
|
||
|
* @note You can also use Chip_RTC_EnableOptions() with the
|
||
|
* RTC_CTRL_RTC_EN flag to enable the RTC.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Enable(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_RTC_EnableOptions(pRTC, RTC_CTRL_RTC_EN);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Disables the RTC
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Nothing
|
||
|
* @note You can also use Chip_RTC_DisableOptions() with the
|
||
|
* RTC_CTRL_RTC_EN flag to enable the RTC.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Disable(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_RTC_DisableOptions(pRTC, RTC_CTRL_RTC_EN);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Enables the RTC 1KHz high resolution timer
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Nothing
|
||
|
* @note You can also use Chip_RTC_EnableOptions() with the
|
||
|
* RTC_CTRL_RTC1KHZ_EN flag to enable the high resolution
|
||
|
* timer.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Enable1KHZ(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_RTC_EnableOptions(pRTC, RTC_CTRL_RTC1KHZ_EN);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Disables the RTC 1KHz high resolution timer
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Nothing
|
||
|
* @note You can also use Chip_RTC_DisableOptions() with the
|
||
|
* RTC_CTRL_RTC1KHZ_EN flag to disable the high resolution
|
||
|
* timer.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_Disable1KHZ(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
Chip_RTC_DisableOptions(pRTC, RTC_CTRL_RTC1KHZ_EN);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Enables selected RTC wakeup events
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param ints : Wakeup events to enable
|
||
|
* @return Nothing
|
||
|
* @note Select either one or both (OR'ed) RTC_CTRL_ALARMDPD_EN
|
||
|
* and RTC_CTRL_WAKEDPD_EN values to enabled. You can also
|
||
|
* use Chip_RTC_EnableOptions() with the flags to enable
|
||
|
* the events.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_EnableWakeup(LPC_RTC_T *pRTC, uint32_t ints)
|
||
|
{
|
||
|
Chip_RTC_EnableOptions(pRTC, ints);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Disables selected RTC wakeup events
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param ints : Wakeup events to disable
|
||
|
* @return Nothing
|
||
|
* @note Select either one or both (OR'ed) RTC_CTRL_ALARMDPD_EN
|
||
|
* and RTC_CTRL_WAKEDPD_EN values to disabled. You can also
|
||
|
* use Chip_RTC_DisableOptions() with the flags to disable
|
||
|
* the events.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_DisableWakeup(LPC_RTC_T *pRTC, uint32_t ints)
|
||
|
{
|
||
|
Chip_RTC_DisableOptions(pRTC, ints);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Clears latched RTC statuses
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param stsMask : OR'ed status bits to clear
|
||
|
* @return Nothing
|
||
|
* @note Use and OR'ed stsMask value of RTC_CTRL_OFD, RTC_CTRL_ALARM1HZ,
|
||
|
* and RTC_CTRL_WAKE1KHZ to clear specific RTC states.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_ClearStatus(LPC_RTC_T *pRTC, uint32_t stsMask)
|
||
|
{
|
||
|
pRTC->CTRL = (pRTC->CTRL & RTC_CTRL_MASK) | stsMask;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Return RTC control/status register
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return The current RTC control/status register
|
||
|
* @note Mask the return value with a RTC_CTRL_* definitions to determine
|
||
|
* which bits are set. For example, mask the return value with
|
||
|
* RTC_CTRL_ALARM1HZ to determine if the alarm interrupt is pending.
|
||
|
*/
|
||
|
STATIC INLINE uint32_t Chip_RTC_GetStatus(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
return pRTC->CTRL;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Set RTC match value for alarm status/interrupt
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param count : Alarm event time
|
||
|
* @return Nothing
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_SetAlarm(LPC_RTC_T *pRTC, uint32_t count)
|
||
|
{
|
||
|
pRTC->MATCH = count;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Return the RTC match value used for alarm status/interrupt
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return Alarm event time
|
||
|
*/
|
||
|
STATIC INLINE uint32_t Chip_RTC_GetAlarm(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
return pRTC->MATCH;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Set RTC match count for 1 second timer count
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param count : Initial count to set
|
||
|
* @return Nothing
|
||
|
* @note Only write to this register when the RTC_CTRL_RTC_EN bit in
|
||
|
* the CTRL Register is 0. The counter increments one second
|
||
|
* after the RTC_CTRL_RTC_EN bit is set.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_SetCount(LPC_RTC_T *pRTC, uint32_t count)
|
||
|
{
|
||
|
pRTC->COUNT = count;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Get current RTC 1 second timer count
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return current RTC 1 second timer count
|
||
|
*/
|
||
|
STATIC INLINE uint32_t Chip_RTC_GetCount(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
return pRTC->COUNT;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Set RTC wake count countdown value (in mS ticks)
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @param count : wakeup time in milliSeconds
|
||
|
* @return Nothing
|
||
|
* @note A write pre-loads a start count value into the wake-up
|
||
|
* timer and initializes a count-down sequence.
|
||
|
*/
|
||
|
STATIC INLINE void Chip_RTC_SetWake(LPC_RTC_T *pRTC, uint16_t count)
|
||
|
{
|
||
|
pRTC->WAKE = count;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Get RTC wake count countdown value
|
||
|
* @param pRTC : The base address of RTC block
|
||
|
* @return current RTC wake count countdown value (in mS)
|
||
|
*/
|
||
|
STATIC INLINE uint16_t Chip_RTC_GetWake(LPC_RTC_T *pRTC)
|
||
|
{
|
||
|
return pRTC->WAKE;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __RTC_5410X_H_ */
|