当前位置:首页 > 芯闻号 > 充电吧
[导读]相对于STM32,6410的RTC是相当的简单./***************************************************************************

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




/*************************************************************************************************************
 * 文件名:	RTC.c
 * 功能:		S3C6410 RTC底层驱动函数
 * 作者:		cp1300@139.com
 * 创建时间:	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:使能时钟设置
*返回        :	无
*依赖     : 	底层宏定义
*作者        :	cp1300@139.com
*时间     :	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码
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	用于将BCD码时间转换为十进制时间,长度为8bit
*************************************************************************************************************************/
u8 BCD_to_DEC(u8 BCD_Code)
{
	return ((BCD_Code >> 4) * 10 + (BCD_Code & 0x0f));
}


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

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

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

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


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


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



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



/*************************************************************************************************************************
*函数        :	void UpdateTimer(void)
*功能        :	更新时间
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	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码
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	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 <BCDSEC = DEC_to_BCD(DEC_Sec);//设置取秒
}

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

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

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


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


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



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



/*************************************************************************************************************************
*函数        :	void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)
*功能        :	设置日期
*参数        :	年,月,日,星期
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	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)
*功能        :	设置时间
*参数        :	时,分,秒
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	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中断标志
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120331
*最后修改时间:	20120331
*说明        :	无
*************************************************************************************************************************/
__inline ClearIntP(void)
{
	RTC->INTP |= BIT0;	//写1清除TIC中断
}

/*************************************************************************************************************************
*函数        :	bool RTC_SecEnd(void)
*功能        :	判断秒是否到达
*参数        :	无
*返回        :	TRUE:秒到达;FALSE:未到达
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	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:是否开启中断
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	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



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭