📄 rtc.c
字号:
/******************************************************************************
* File name : RTC.c
* Start date : 2004. 4. 27
* By :
* Contact : philip.zhang@samsung.com
* Description: APIs
*
*****************************************************************************/
/******************************************************************************
* INCLUDES *
******************************************************************************/
#include <stdio.h>
#include "Basic_typedefs.h"
#include "CUSTOM/Custom_option.h"
#include "OS/OS_abstract.h"
#include "API/SH_types.h"
#include "API/SH_api.h"
#include "API/SH_reg.h"
#include "RTC.h"
/******************************************************************************
* Global variables
*****************************************************************************/
RTC_AlarmCallback RTC_Alarm;
volatile UCHAR time_array[7] = {0, 0, 0, 1, 1, 0, 0};
#if RTC_TEST
VOID RTC_AlarmTest(VOID)
{
_SysPrintf("\n Test Alarm ~~~~~~~~~~~~~~~~~~~~~~~~ \n");
}
#endif
VOID RTC_InterruptHandler(UNSIGNED id )
{
/* Source Pending Clear */
Intclr_Scr(INT_RTC);
/* interrupt pending Clear */
Intclr_Pnd( INT_RTC );
if(RTC_Alarm)
{
(*RTC_Alarm)();
}
#if RTC_TEST
RTC_AlarmTest();
#endif
}
VOID RTC_Init(VOID)
{
SysLisrEntryPtr_t old_lisr;
rRTCPEND = 0x00;
rRTCIM = 0x01;
if(!rRTCALM)
{
rRTCALM = 0x00;
rALMSEC = 0x00;
rALMMIN = 0x00;
rALMHOUR = 0x00;
rALMDATE = 0x00;
rALMDAY = 0x00;
rALMMON = 0x00;
rALMYEAR = 0x00;
}
if(rRTCCON & 0x01)
{
rRTCCON = 0x07;
rBCDSEC = 0x00;
rBCDMIN = 0x00;
rBCDHOUR = 0x00;
rBCDDATE = 0x01;
rBCDDAY = 0x00;
rBCDMON = 0x01;
rBCDYEAR = 0x00;
rRTCCON = 0x01;
}
/* Register Lisr */
SysRegisterLisr( INT_RTC, (SysLisrEntryPtr_t)RTC_InterruptHandler, old_lisr, 0);
Enable_Int(INT_RTC);
}
VOID RTC_Reset(VOID)
{
rRTCALM = 0x00;
rALMSEC = 0x00;
rALMMIN = 0x00;
rALMHOUR = 0x00;
rALMDATE = 0x00;
rALMDAY = 0x00;
rALMMON = 0x00;
rALMYEAR = 0x00;
rRTCCON = 0x07;
rBCDSEC = 0x00;
rBCDMIN = 0x00;
rBCDHOUR = 0x00;
rBCDDATE = 0x01;
rBCDDAY = 0x00;
rBCDMON = 0x01;
rBCDYEAR = 0x00;
rRTCCON = 0x02;
}
VOID RTC_SetTime(UCHAR *pTimeVal)
{
UCHAR counter = 0, write_data = 0;
rRTCCON = 0x07;
for(counter = 0; counter <= DW_INDEX; counter++)
{
write_data = *(pTimeVal + counter);
switch(counter)
{
case SC_INDEX:
rBCDSEC = ((write_data & 0xf0) |(write_data & 0xf));
break;
case MN_INDEX:
rBCDMIN = ((write_data & 0xf0) |(write_data & 0xf));
break;
case HR_INDEX:
rBCDHOUR = ((write_data & 0xf0) |(write_data & 0xf));
break;
case DT_INDEX:
rBCDDATE = ((write_data & 0xf0) |(write_data & 0xf));
break;
case MO_INDEX:
rBCDMON = ((write_data & 0xf0) |(write_data & 0xf));
break;
case YR_INDEX:
rBCDYEAR = (((write_data & 0xf0) << 4) |(write_data & 0xf));
break;
case DW_INDEX:
rBCDDAY = write_data;
break;
default :
break;
}
}
rRTCCON = 0x02;
}
VOID RTC_UpdateTime(VOID)
{
*time_array = (UCHAR)rBCDSEC;
*(time_array+1) = (UCHAR)rBCDMIN;
*(time_array+2) = (UCHAR)rBCDHOUR;
*(time_array+3) = (UCHAR)rBCDDATE;
*(time_array+4) = (UCHAR)rBCDMON;
*(time_array+5) = (UCHAR)(((rBCDYEAR & 0xf00) >> 4) | (rBCDYEAR & 0xff));
*(time_array+6) = (UCHAR)rBCDDAY;
}
VOID RTC_Alarm_Enable()
{
#if 0
rRTCALM = 0xE0;
#else
rRTCALM = 0x80;
#endif
}
VOID RTC_Alarm_Disable(VOID)
{
rRTCALM = 0x00;
}
VOID RTC_Alarm_SetTime(UCHAR *pTimeVal)
{
UCHAR counter = 0, write_data = 0;
for(counter = 0; counter <= DW_INDEX; counter++)
{
write_data = *(pTimeVal + counter);
switch(counter)
{
case SC_INDEX:
if(write_data)
{
rRTCALM = (rRTCALM | 0x1);
}
rALMSEC = ((write_data & 0xf0) |(write_data & 0xf));
break;
case MN_INDEX:
if(write_data)
{
rRTCALM = (rRTCALM | 0x2);
}
rALMMIN = ((write_data & 0xf0) |(write_data & 0xf));
break;
case HR_INDEX:
if(write_data)
{
rRTCALM = (rRTCALM | 0x4);
}
rALMHOUR = ((write_data & 0xf0) |(write_data & 0xf));
break;
case DT_INDEX:
if(write_data)
{
rRTCALM = (rRTCALM | 0x8);
}
rALMDATE = ((write_data & 0xf0) |(write_data & 0xf));
break;
case MO_INDEX:
rALMMON = ((write_data & 0xf0) |(write_data & 0xf));
break;
case YR_INDEX:
rALMYEAR = (((write_data & 0xf0) << 4) |(write_data & 0xf));
break;
case DW_INDEX:
if(write_data)
{
rRTCALM = (rRTCALM | 0x10);
}
rALMDAY = write_data;
break;
default :
break;
}
}
}
VOID RTC_AttachAlarmCallback(RTC_AlarmCallback callback)
{
RTC_Alarm = callback;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -