⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 此代码是对电源管理部分的详细的代码
💻 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 + -