相对于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