| 
									
										
										
										
											2018-12-01 01:34:13 +07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * @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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-12-07 13:22:12 +07:00
										 |  |  |   (void) stsMask; | 
					
						
							| 
									
										
										
										
											2018-12-01 01:34:13 +07:00
										 |  |  | 	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_ */
 |