📄 lpc_rtc.c
字号:
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2003
*
* File name : LPC_Rtc.c
* Description : Define API for RTI
*
* History :
* 1. Date : August 10, 2004
* Author : Shawn Zhang
* Description : Create
*
* 2. Date : Oct 12, 2004
* Author : Stanimir Bonev
* Description: Modify the interface of some functions
*
* $Revision: 13961 $
**************************************************************************/
#include "LPC_Rtc.h"
/*************************************************************************
* Function Name: IsLeapYear
* Parameters: unsigned short Year
*
* Return: bool
*
* Description: Judge whether the specifying year is leap year.
*
*************************************************************************/
static bool IsLeapYear (unsigned short year)
{
if (!(year%4) && (year%100) || !(year%400))
return true;
return false;
}
/*************************************************************************
* Function Name: GetDOY
* Parameters: unsigned short Year
* unsigned char month
* unsigned char day
*
* Return: int
*
* Description: Get the day of year according to the date
*
*************************************************************************/
static int GetDOY (unsigned short year, unsigned char month, unsigned char day)
{
int DOY=0, i;
for(i=1; i<month; i++)
DOY+=RTC_MonthVal[i];
if (month>2)
if (IsLeapYear(year))
DOY++;
return (DOY+day);
}
/*************************************************************************
* Function Name: GetDOW
* Parameters: unsigned short Year
* unsigned char month
* unsigned char day
*
* Return: int -- (0~6)
*
* Description: Get the day of week according to the date.
*
* NOTE: Year is not smaller than RTC_YEARMIN (1901).
*
*************************************************************************/
static int GetDOW (unsigned short year, unsigned char month, char day)
{
int i, DOW=0;
for (i = RTC_BASEYEAR, DOW = 0; i < year; i++)
{
DOW +=365;
if (IsLeapYear(i))
DOW++;
}
DOW += GetDOY (year, month, day) - 1;
DOW = (DOW + RTC_BASEDOW) % 7;
return DOW;
}
/*************************************************************************
* Function Name: IsValidDay
* Parameters: unsigned short Year
* unsigned char month
* unsigned char day
*
* Return:
* false -- not valid day
* true -- valid day
*
* Description: Check if the specify day is valid
*
* NOTE: Year is not smaller than RTC_YEARMIN (1901).
*
*************************************************************************/
static bool IsValidDay (unsigned short year, unsigned char month, unsigned char day)
{
/* Valid Judge */
if (year < RTC_YEARMIN || year > RTC_YEARMAX ||day <1)
return false;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (day>31)
return false;
else
break;
case 4:
case 6:
case 9:
case 11:
if (day>30)
return false;
else
break;
case 2:
if (IsLeapYear(year))
if (day>29)
return false;
else
break;
else
if (day>28)
return false;
else
break;
default:
return false;
}
return true;
}
/*************************************************************************
* Function Name: RTC_Enable
* Parameters: void
* Return: void
*
* Description: Enable RTC, let RTC run.
*
*************************************************************************/
void RTC_Enable(void)
{
CCR_bit.CLKEN = true;
return ;
}
/*************************************************************************
* Function Name: RTC_Disable
* Parameters: void
* Return: void
*
* Description: Disable RTC, let RTC stop.
*
*************************************************************************/
void RTC_Disable(void)
{
CCR_bit.CLKEN = false;
return ;
}
/*************************************************************************
* Function Name: RTC_Init
* Parameters: void
*
* Return: int
* 0: success
* 1: fail
*
* Description: Initialize RTC, configure prescaler, CIIR and AMR register
*
*************************************************************************/
int RTC_Init(LPC_BOOL BackComp)
{
unsigned long PreInt;
RTC_Disable();
if (BackComp)
{
// initialize prescaler of RTC
PreInt = (int)( SYS_GetFpclk() / RTC_CountPerSec ) - 1;
if (PreInt <= 0)
return 1;
PREINT = PreInt;
PREFRAC = SYS_GetFpclk() - (PreInt + 1) * RTC_CountPerSec;
}
else
{
/* 32kHz watch quartz */
CCR_bit.CLKSRC = 1;
}
/* test disable and reset*/
CCR_bit.CTCRST = CCR_bit.CTTEST = 0;
// initialize interrupt mask register of RTC
AMR=0;
CIIR_bit.IMSEC = 1;
// clear all interrupt of RTC
ILR=0x3;
// initialize Date and Time
if (RTC_SetDateTime(&RTC_InitDateTime))
return 1;
// RTC_Enable();
return 0;
}
/*************************************************************************
* Function Name: RTC_SetDate
* Parameters: LPC_Rtc_Date_t *pDate
* Return: int
* 0: success
* 1: fail
* Description: Set your specifying date
*
*************************************************************************/
int RTC_SetDate (LPC_Rtc_Date_t *pDate)
{
// Valid Judge
if (IsValidDay(pDate->year, pDate->month, pDate->day) == false)
return 1;
// Calculate DOW, DOY
pDate->DOY = GetDOY(pDate->year, pDate->month, pDate->day);
pDate->DOW = GetDOW(pDate->year, pDate->month, pDate->day);
DOM=pDate->day;
MONTH=pDate->month;
YEAR=pDate->year;
DOW=pDate->DOW;
DOY=pDate->DOY;
return 0;
}
/*************************************************************************
* Function Name: RTC_SetTime
* Parameters: LPC_Rtc_Time_t *pTime
* Return: int
* 0: success
* 1: fail
* Description: Set your specifying time
*
*************************************************************************/
int RTC_SetTime (LPC_Rtc_Time_t *pTime)
{
// Valid Judge
if ( pTime->hour > 23 || pTime->minute > 59 || pTime->second > 59)
return 1;
HOUR = pTime->hour;
MIN = pTime->minute;
SEC = pTime->second;
return 0;
}
/*************************************************************************
* Function Name: RTC_SetDateTime
* Parameters: LPC_Rtc_DateTime_t *pDateTime
* Return: int
* 0: success
* 1: fail
* Description: Set your specifying date and time
*
*************************************************************************/
int RTC_SetDateTime (LPC_Rtc_DateTime_t *pDateTime)
{
// Valid Judge
if (IsValidDay(pDateTime->year, pDateTime->month, pDateTime->day) == false)
return 1;
if ( pDateTime->hour > 23 || pDateTime->minute > 59 ||pDateTime->second > 59)
return 1;
// Calculate DOW, DOY
pDateTime->DOY = GetDOY(pDateTime->year, pDateTime->month, pDateTime->day);
pDateTime->DOW = GetDOW(pDateTime->year, pDateTime->month, pDateTime->day);
DOM=pDateTime->day;
MONTH=pDateTime->month;
YEAR=pDateTime->year;
DOW=pDateTime->DOW;
DOY=pDateTime->DOY;
HOUR = pDateTime->hour;
MIN = pDateTime->minute;
SEC = pDateTime->second;
return 0;
}
/*************************************************************************
* Function Name: RTC_GetDate
* Parameters: LPC_Rtc_Date_t *pDate
* Return: int
* 0: success
* 1: fail
* Description: Get the current date
*
*************************************************************************/
int RTC_GetDate (LPC_Rtc_Date_t *pDate)
{
pDate->day = DOM;
pDate->month = MONTH;
pDate->year = YEAR;
pDate->DOW = DOW;
pDate->DOY = DOY;
return 0;
}
/*************************************************************************
* Function Name: RTC_GetTime
* Parameters: LPC_Rtc_Time_t *pTime
* Return: int
* 0: success
* 1: fail
* Description: Set the current time
*
*************************************************************************/
int RTC_GetTime (LPC_Rtc_Time_t *pTime)
{
pTime->hour = HOUR;
pTime->minute = MIN;
pTime->second = SEC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -