相对于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 <<= 4;
temp += DEC_Code % 10;
return temp;
}
/*************************************************************************************************************************
*函数 : void SetSec(u8 DEC_Sec)
*功能 : 设置秒
*参数 : 秒
*返回 : 无
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20120329
*最后修改时间: 20120329
*说明 : 设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetSec(u8 DEC_Sec)
{
RTC->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