304 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * @brief LPC11u6x RTC chip driver
 | |
|  *
 | |
|  * @note
 | |
|  * Copyright(C) NXP Semiconductors, 2013
 | |
|  * 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_11U6X_H_
 | |
| #define __RTC_11U6X_H_
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** @defgroup RTC_11U6X CHIP: LPC11u6x RTC driver
 | |
|  * @ingroup CHIP_11U6X_Drivers
 | |
|  * @{
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @brief LPC11u6x RTC 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 */
 | |
| 
 | |
| /**
 | |
|  * @brief	Initialize the RTC peripheral
 | |
|  * @param	pRTC	: RTC peripheral selected
 | |
|  * @return	None
 | |
|  */
 | |
| void Chip_RTC_Init(LPC_RTC_T *pRTC);
 | |
| 
 | |
| /**
 | |
|  * @brief	De-initialize the RTC peripheral
 | |
|  * @param	pRTC	: RTC peripheral selected
 | |
|  * @return	None
 | |
|  */
 | |
| void Chip_RTC_DeInit(LPC_RTC_T *pRTC);
 | |
| 
 | |
| /**
 | |
|  * @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 |= 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 &= ~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 uint32_t Chip_RTC_ClearStatus(LPC_RTC_T *pRTC, uint32_t stsMask)
 | |
| {
 | |
|   (void) stsMask;
 | |
| 	return pRTC->CTRL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @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_11U6X_H_ */
 | 
