92 lines
2 KiB
C
92 lines
2 KiB
C
|
/*------------------------------------------------------------------------/
|
||
|
/ LPC176x RTC control module
|
||
|
/-------------------------------------------------------------------------/
|
||
|
/
|
||
|
/ Copyright (C) 2011, ChaN, all right reserved.
|
||
|
/
|
||
|
/ * This software is a free software and there is NO WARRANTY.
|
||
|
/ * No restriction on use. You can use, modify and redistribute it for
|
||
|
/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
|
||
|
/ * Redistributions of source code must retain the above copyright notice.
|
||
|
/
|
||
|
/-------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "rtc176x.h"
|
||
|
|
||
|
|
||
|
int rtc_initialize (void)
|
||
|
{
|
||
|
/* Enable PCLK to the RTC */
|
||
|
__set_PCONP(PCRTC, 1);
|
||
|
|
||
|
/* Start RTC with external XTAL */
|
||
|
RTC_CCR = 0x11;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int rtc_gettime (RTC *rtc) /* 1:RTC valid, 0:RTC volatiled */
|
||
|
{
|
||
|
DWORD d, t;
|
||
|
|
||
|
|
||
|
do {
|
||
|
t = RTC_CTIME0;
|
||
|
d = RTC_CTIME1;
|
||
|
} while (t != RTC_CTIME0 || d != RTC_CTIME1);
|
||
|
|
||
|
if (RTC_AUX & _BV(4)) { /* If power fail has been detected, return default time. */
|
||
|
rtc->sec = 0; rtc->min = 0; rtc->hour = 0;
|
||
|
rtc->wday = 0; rtc->mday = 1; rtc->month = 1; rtc->year = 2014;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
rtc->sec = t & 63;
|
||
|
rtc->min = (t >> 8) & 63;
|
||
|
rtc->hour = (t >> 16) & 31;
|
||
|
rtc->wday = (t >> 24) & 7;
|
||
|
rtc->mday = d & 31;
|
||
|
rtc->month = (d >> 8) & 15;
|
||
|
rtc->year = (d >> 16) & 4095;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int rtc_settime (const RTC *rtc)
|
||
|
{
|
||
|
RTC_CCR = 0x12; /* Stop RTC */
|
||
|
|
||
|
/* Update RTC registers */
|
||
|
RTC_SEC = rtc->sec;
|
||
|
RTC_MIN = rtc->min;
|
||
|
RTC_HOUR = rtc->hour;
|
||
|
RTC_DOW = rtc->wday;
|
||
|
RTC_DOM = rtc->mday;
|
||
|
RTC_MONTH = rtc->month;
|
||
|
RTC_YEAR = rtc->year;
|
||
|
|
||
|
RTC_AUX = _BV(4); /* Clear power fail flag */
|
||
|
RTC_CCR = 0x11; /* Restart RTC, Disable calibration feature */
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
DWORD get_fattime (void) {
|
||
|
RTC rtc;
|
||
|
|
||
|
/* Get local time */
|
||
|
rtc_gettime(&rtc);
|
||
|
|
||
|
/* Pack date and time into a DWORD variable */
|
||
|
return ((DWORD)(rtc.year - 1980) << 25)
|
||
|
| ((DWORD)rtc.month << 21)
|
||
|
| ((DWORD)rtc.mday << 16)
|
||
|
| ((DWORD)rtc.hour << 11)
|
||
|
| ((DWORD)rtc.min << 5)
|
||
|
| ((DWORD)rtc.sec >> 1);
|
||
|
}
|