S3C6410裸机RTC实时时钟

相对于STM32,6410的RTC是相当的简单.



/*************************************************************************************************************
 * 文件名:	RTC.c
 * 功能:		S3C6410 RTC底层驱动函数
 * 作者:		[email protected]
 * 创建时间:	2012年3月28日21:52
 * 最后修改时间:2012年3月28日
 * 详细:		RTC相关底层驱动函数
*************************************************************************************************************/
#include "system.h"
#include "rtc.h"

Time_TypeDef Timer;//存放全局时间

//内部静态变量声明
static bool uAutoTimeUpdate = FALSE;	//标记是否自动由中断更新时间
static bool uSecEnd = FALSE;			//秒结束标志,结束后就可以更新时间了


/*************************************************************************************************************************
*函数        :	void RTC_Install(u8 ENABLE)
*功能        :	RTC设置使能与失能
*参数        :	Enable:使能时钟设置,Disable:使能时钟设置
*返回        :	无
*依赖     : 	底层宏定义
*作者        :	[email protected]
*时间     :	20120328
*最后修改时间:	20120329
*说明     :	平时不设置时应该设置为Disable
*************************************************************************************************************************/
void RTC_Install(u8 ENABLE)
{
	if(ENABLE)
		RTC->CON |=  BIT0;//RTC时钟设置使能
	else
		RTC->CON &=  ~BIT0;//RTC时钟设置失能
}

/*************************************************************************************************************************
*函数        :	u8 BCD_to_DEC(u8 BCD_Code)
*功能        :	BCD码转DEC码
*参数        :	BCD码
*返回        :	DEC码
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	用于将BCD码时间转换为十进制时间,长度为8bit
*************************************************************************************************************************/
u8 BCD_to_DEC(u8 BCD_Code)
{
	return ((BCD_Code >> 4) * 10 + (BCD_Code & 0x0f));
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetSec(void)
*功能        :	获取秒
*参数        :	无
*返回        :	秒
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD秒获取后转化为DEC秒
*************************************************************************************************************************/
__inline u8 GetSec(void)
{
	return (BCD_to_DEC(RTC->BCDSEC));//获取秒
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetMin(void)
*功能        :	获取分
*参数        :	无
*返回        :	分
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD分获取后转化为DEC分
*************************************************************************************************************************/
__inline u8 GetMin(void)
{
	return (BCD_to_DEC(RTC->BCDMIN));//获取分
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetHour(void)
*功能        :	获取时
*参数        :	无
*返回        :	时
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD时获取后转化为DEC时
*************************************************************************************************************************/
__inline u8 GetHour(void)
{
	return (BCD_to_DEC(RTC->BCDHOUR));//获取时
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetWeek(void)
*功能        :	获取星期
*参数        :	无
*返回        :	星期
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD星期获取后转化为DEC星期,1-7:星期一-星期日
*************************************************************************************************************************/
__inline u8 GetWeek(void)
{
	return (BCD_to_DEC(RTC->BCDDAY));//获取星期
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetDate(void)
*功能        :	获取日
*参数        :	无
*返回        :	日
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD日获取后转化为DEC日
*************************************************************************************************************************/
__inline u8 GetDate(void)
{
	return (BCD_to_DEC(RTC->BCDDATE));//获取日
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetMonth(void)
*功能        :	获取月
*参数        :	无
*返回        :	月
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD月获取后转化为DEC月
*************************************************************************************************************************/
__inline u8 GetMonth(void)
{
	return (BCD_to_DEC(RTC->BCDMON));//获取月
}



/*************************************************************************************************************************
*函数        :	__inline u8 GetYear(void)
*功能        :	获取年
*参数        :	无
*返回        :	年
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD年获取后转化为DEC年
*************************************************************************************************************************/
__inline u8 GetYear(void)
{
	return (BCD_to_DEC(RTC->BCDYEAR));//获取年
}



/*************************************************************************************************************************
*函数        :	void UpdateTimer(void)
*功能        :	更新时间
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将时间放在了全局的结构Timer中
*************************************************************************************************************************/
void UpdateTimer(void)
{
	Timer.w_year = 2000 + GetYear();	//更新年,起点为2000年
	Timer.w_month = GetMonth();	//更新月
	Timer.w_date = GetDate();	//更新日
	Timer.week = GetWeek();		//更新星期
	Timer.hour = GetHour();		//更新时
	Timer.min = GetMin();		//更新分
	Timer.sec = GetSec();		//更新秒
}


/*************************************************************************************************************************
*函数        :	u8 DEC_to_BCD(u8 DEC_Code)
*功能        :	DEC码转BCD码
*参数        :	DEC码
*返回        :	BCD码
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	用于将DEC码时间转换为BCD时间,长度为8bit
*************************************************************************************************************************/
u8 DEC_to_BCD(u8 DEC_Code)
{
	u8 temp;
	
	if(DEC_Code > 99)
		return 0;
	temp = DEC_Code / 10;
	temp <<= 4;
	temp += DEC_Code % 10;
	return temp;
}


/*************************************************************************************************************************
*函数        :	void SetSec(u8 DEC_Sec)
*功能        :	设置秒
*参数        :	秒
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetSec(u8 DEC_Sec)
{
	RTC->BCDSEC = DEC_to_BCD(DEC_Sec);//设置取秒
}

/*************************************************************************************************************************
*函数        :	void SetMin(u8 DEC_Min)
*功能        :	设置分
*参数        :	分
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetMin(u8 DEC_Min)
{
	RTC->BCDMIN = DEC_to_BCD(DEC_Min);//设置分
}

/*************************************************************************************************************************
*函数        :	void SetHour(u8 DEC_Hour)
*功能        :	设置时
*参数        :	时
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetHour(u8 DEC_Hour)
{
	RTC->BCDHOUR = DEC_to_BCD(DEC_Hour);//设置时
}

/*************************************************************************************************************************
*函数        :	void SetWeek(u8 DEC_Week)
*功能        :	设置星期
*参数        :	星期
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetWeek(u8 DEC_Week)
{
	RTC->BCDDAY = DEC_to_BCD(DEC_Week);//设置星期
}


/*************************************************************************************************************************
*函数        :	void SetDate(u8 DEC_Date)
*功能        :	设置日
*参数        :	日
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetDate(u8 DEC_Date)
{
	RTC->BCDDATE = DEC_to_BCD(DEC_Date);//设置日
}


/*************************************************************************************************************************
*函数        :	void SetMonth(u8 DEC_Month)
*功能        :	设置月
*参数        :	月
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetMonth(u8 DEC_Month)
{
	RTC->BCDMON = DEC_to_BCD(DEC_Month);//设置月
}



/*************************************************************************************************************************
*函数        :	void SetYear(u8 DEC_Year)
*功能        :	设置年
*参数        :	年
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetYear(u8 DEC_Year)
{
	RTC->BCDYEAR = DEC_to_BCD(DEC_Year);//设置年
}



/*************************************************************************************************************************
*函数        :	void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)
*功能        :	设置日期
*参数        :	年,月,日,星期
*返回        :	无
*依赖        : 	底层函数
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置会自动去除写保护,年范围为2000-2099
*************************************************************************************************************************/
void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)
{
	RTC_Install(ENABLE);	//允许更新时间
	SetYear(Year-2000);			//设置年
	SetMonth(Month);		//设置月
	SetDate(Date);			//设置日
	SetWeek(Week);			//设置星期
	RTC_Install(DISABLE);	//禁止更新时间
}


/*************************************************************************************************************************
*函数        :	void InstallTime(u8 Hour,u8 Min,u8 Sec)
*功能        :	设置时间
*参数        :	时,分,秒
*返回        :	无
*依赖        : 	底层函数
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置会自动去除写保护
*************************************************************************************************************************/
void InstallTime(u8 Hour,u8 Min,u8 Sec)
{
	RTC_Install(ENABLE);	//允许更新时间
	SetHour(Hour);			//设置时
	SetMin(Min);			//设置分
	SetSec(Sec);			//设置秒
	RTC_Install(DISABLE);	//禁止更新时间
}


/*************************************************************************************************************************
*函数        :	__inline ClearIntP(void)
*功能        :	清除INTP中断标志
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	[email protected]
*时间        :	20120331
*最后修改时间:	20120331
*说明        :	无
*************************************************************************************************************************/
__inline ClearIntP(void)
{
	RTC->INTP |= BIT0;	//写1清除TIC中断
}

/*************************************************************************************************************************
*函数        :	bool RTC_SecEnd(void)
*功能        :	判断秒是否到达
*参数        :	无
*返回        :	TRUE:秒到达;FALSE:未到达
*依赖        : 	底层函数
*作者        :	[email protected]
*时间        :	20120331
*最后修改时间:	20120331
*说明        :	无
*************************************************************************************************************************/
bool RTC_SecEnd(void)
{
	if(uAutoTimeUpdate == TRUE)	//开启了自动更新时间
	{
		if(uSecEnd == TRUE)		//秒结束
		{
			uSecEnd = FALSE;	//清除标志
			return TRUE;
		}
		else
			return FALSE;
	}
	if(RTC->INTP & BIT0)	//TIC中断标志置位
	{
		ClearIntP();		//清除中断标志
		return TRUE;
	}
	return FALSE;
}



//TIC中断服务程序,用于自动更新时间
void __irq Isr_RTC_InspectTick(void)
{
	uSecEnd = TRUE;					//秒结束时间成立
	UpdateTimer();					//更新所有时间
	ClearIntP();					//清除中断标志
	VICInterruptEnd();	//中断退出
}




/*************************************************************************************************************************
*函数        :	void RTC_Init(u8 AutoUpdate)
*功能        :	初始化RTC
*参数        :	EnableInt:是否开启中断
*返回        :	无
*依赖        : 	无
*作者        :	[email protected]
*时间        :	20120329
*最后修改时间:	20120331
*说明        :	判断时钟是否写保护,如果没,则写开启保护,并更新时间
*************************************************************************************************************************/
void RTC_Init(FunctionalState EnableInt)
{
	RTC->TICNT = 32768-1;
	RTC->CON = BIT8;		//使能标记定时器,32768分频
	RTC_Install(DISABLE);	//开启时钟写保护
	UpdateTimer();			//更新所有时间
	if(EnableInt == ENABLE)			//使能自动更新时间
	{
		uAutoTimeUpdate = TRUE;//标志有效
		Set_IsrAddr(INT_RTC_TIC,(u32)Isr_RTC_InspectTick);//设置中断向量地址
		Set_IntEnable(INT_RTC_TIC,ENABLE);//使能TIC中断
	}
	else
	{
		uAutoTimeUpdate = FALSE;
		Set_IntEnable(INT_RTC_TIC,DISABLE);//关闭TIC中断
	}
}


















/*************************************************************************************************************
 * 文件名:	RTC.H
 * 功能:		S3C6410 RTC底层驱动函数
 * 作者:		陈鹏
 * 创建时间:	2012年3月28日21:52
 * 最后修改时间:2012年3月28日
 * 详细:		RTC相关底层驱动函数
*************************************************************************************************************/
#ifndef _RTC_H_
#define _RTC_H_


 //时间结构体
typedef struct 
{
	u8 hour; 	//小时
	u8 min;	 	//分钟
	u8 sec;		//秒			
	//公历日月年周
	u16 w_year;	 	//年
	u8  w_month;	//月
	u8  w_date;		//日
	u8  week;		//星期
#if _Lunar_calendar
	//农历日月年节气
	u8 l_year;		//年
	u8 l_month;		//月
	u8 l_data;		//日
	u8 SolarTerms;	//农历节气 
#endif
}Time_TypeDef;

extern Time_TypeDef Timer;//存放全局时间

void UpdateTimer(void);	//更新全部时间
void RTC_Init(FunctionalState EnableInt);	//初始化RTC
void InstallData(u16 Year,u8 Month,u8 Date,u8 Week);	//设置日期
void InstallTime(u8 Hour,u8 Min,u8 Sec);				//设置时间
bool RTC_SecEnd(void);							//判断秒是否到达



#endif


你可能感兴趣的:(RTC,s3c6410,OK6410,裸机)