当前位置:首页 > > 充电吧
[导读]相对于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



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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭