相對于STM32,6410的RTC是相當?shù)暮唵?
/*************************************************************************************************************
?*?文件名: RTC.c
?*?功能: S3C6410?RTC底層驅動函數(shù)
?*?作者: cp1300@139.com
?*?創(chuàng)建時間: 2012年3月28日21:52
?*?最后修改時間:2012年3月28日
?*?詳細: RTC相關底層驅動函數(shù)
*************************************************************************************************************/
#include?"system.h"
#include?"rtc.h"
Time_TypeDef?Timer;//存放全局時間
//內部靜態(tài)變量聲明
static?bool?uAutoTimeUpdate?=?FALSE; //標記是否自動由中斷更新時間
static?bool?uSecEnd?=?FALSE; //秒結束標志,結束后就可以更新時間了
/*************************************************************************************************************************
*函數(shù)????????: void?RTC_Install(u8?ENABLE)
*功能????????: RTC設置使能與失能
*參數(shù)????????: Enable:使能時鐘設置,Disable:使能時鐘設置
*返回????????: 無
*依賴?????:? 底層宏定義
*作者????????: cp1300@139.com
*時間?????: 20120328
*最后修改時間: 20120329
*說明?????: 平時不設置時應該設置為Disable
*************************************************************************************************************************/
void?RTC_Install(u8?ENABLE)
{
if(ENABLE)
RTC->CON?|=??BIT0;//RTC時鐘設置使能
else
RTC->CON?&=??~BIT0;//RTC時鐘設置失能
}
/*************************************************************************************************************************
*函數(shù)????????: u8?BCD_to_DEC(u8?BCD_Code)
*功能????????: BCD碼轉DEC碼
*參數(shù)????????: BCD碼
*返回????????: DEC碼
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 用于將BCD碼時間轉換為十進制時間,長度為8bit
*************************************************************************************************************************/
u8?BCD_to_DEC(u8?BCD_Code)
{
return?((BCD_Code?>>?4)?*?10?+?(BCD_Code?&?0x0f));
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetSec(void)
*功能????????: 獲取秒
*參數(shù)????????: 無
*返回????????: 秒
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD秒獲取后轉化為DEC秒
*************************************************************************************************************************/
__inline?u8?GetSec(void)
{
return?(BCD_to_DEC(RTC->BCDSEC));//獲取秒
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetMin(void)
*功能????????: 獲取分
*參數(shù)????????: 無
*返回????????: 分
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD分獲取后轉化為DEC分
*************************************************************************************************************************/
__inline?u8?GetMin(void)
{
return?(BCD_to_DEC(RTC->BCDMIN));//獲取分
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetHour(void)
*功能????????: 獲取時
*參數(shù)????????: 無
*返回????????: 時
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD時獲取后轉化為DEC時
*************************************************************************************************************************/
__inline?u8?GetHour(void)
{
return?(BCD_to_DEC(RTC->BCDHOUR));//獲取時
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetWeek(void)
*功能????????: 獲取星期
*參數(shù)????????: 無
*返回????????: 星期
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD星期獲取后轉化為DEC星期,1-7:星期一-星期日
*************************************************************************************************************************/
__inline?u8?GetWeek(void)
{
return?(BCD_to_DEC(RTC->BCDDAY));//獲取星期
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetDate(void)
*功能????????: 獲取日
*參數(shù)????????: 無
*返回????????: 日
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD日獲取后轉化為DEC日
*************************************************************************************************************************/
__inline?u8?GetDate(void)
{
return?(BCD_to_DEC(RTC->BCDDATE));//獲取日
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetMonth(void)
*功能????????: 獲取月
*參數(shù)????????: 無
*返回????????: 月
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD月獲取后轉化為DEC月
*************************************************************************************************************************/
__inline?u8?GetMonth(void)
{
return?(BCD_to_DEC(RTC->BCDMON));//獲取月
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetYear(void)
*功能????????: 獲取年
*參數(shù)????????: 無
*返回????????: 年
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 將BCD年獲取后轉化為DEC年
*************************************************************************************************************************/
__inline?u8?GetYear(void)
{
return?(BCD_to_DEC(RTC->BCDYEAR));//獲取年
}
/*************************************************************************************************************************
*函數(shù)????????: void?UpdateTimer(void)
*功能????????: 更新時間
*參數(shù)????????: 無
*返回????????: 無
*依賴????????:? 底層函數(shù)
*作者????????: 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(); //更新秒
}
/*************************************************************************************************************************
*函數(shù)????????: u8?DEC_to_BCD(u8?DEC_Code)
*功能????????: DEC碼轉BCD碼
*參數(shù)????????: 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);//設置取秒
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetMin(u8?DEC_Min)
*功能????????: 設置分
*參數(shù)????????: 分
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetMin(u8?DEC_Min)
{
RTC->BCDMIN?=?DEC_to_BCD(DEC_Min);//設置分
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetHour(u8?DEC_Hour)
*功能????????: 設置時
*參數(shù)????????: 時
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetHour(u8?DEC_Hour)
{
RTC->BCDHOUR?=?DEC_to_BCD(DEC_Hour);//設置時
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetWeek(u8?DEC_Week)
*功能????????: 設置星期
*參數(shù)????????: 星期
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetWeek(u8?DEC_Week)
{
RTC->BCDDAY?=?DEC_to_BCD(DEC_Week);//設置星期
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetDate(u8?DEC_Date)
*功能????????: 設置日
*參數(shù)????????: 日
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetDate(u8?DEC_Date)
{
RTC->BCDDATE?=?DEC_to_BCD(DEC_Date);//設置日
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetMonth(u8?DEC_Month)
*功能????????: 設置月
*參數(shù)????????: 月
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetMonth(u8?DEC_Month)
{
RTC->BCDMON?=?DEC_to_BCD(DEC_Month);//設置月
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetYear(u8?DEC_Year)
*功能????????: 設置年
*參數(shù)????????: 年
*返回????????: 無
*依賴????????:? 無
*作者????????: cp1300@139.com
*時間????????: 20120329
*最后修改時間: 20120329
*說明????????: 設置時間,注意需要先開啟寫保護,否則無法寫入
*************************************************************************************************************************/
void?SetYear(u8?DEC_Year)
{
RTC->BCDYEAR?=?DEC_to_BCD(DEC_Year);//設置年
}
/*************************************************************************************************************************
*函數(shù)????????: void?InstallData(u16?Year,u8?Month,u8?Date,u8?Week)
*功能????????: 設置日期
*參數(shù)????????: 年,月,日,星期
*返回????????: 無
*依賴????????:? 底層函數(shù)
*作者????????: 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); //禁止更新時間
}
/*************************************************************************************************************************
*函數(shù)????????: void?InstallTime(u8?Hour,u8?Min,u8?Sec)
*功能????????: 設置時間
*參數(shù)????????: 時,分,秒
*返回????????: 無
*依賴????????:? 底層函數(shù)
*作者????????: 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); //禁止更新時間
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?ClearIntP(void)
*功能????????: 清除INTP中斷標志
*參數(shù)????????: 無
*返回????????: 無
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時間????????: 20120331
*最后修改時間: 20120331
*說明????????: 無
*************************************************************************************************************************/
__inline?ClearIntP(void)
{
RTC->INTP?|=?BIT0; //寫1清除TIC中斷
}
/*************************************************************************************************************************
*函數(shù)????????: bool?RTC_SecEnd(void)
*功能????????: 判斷秒是否到達
*參數(shù)????????: 無
*返回????????: TRUE:秒到達;FALSE:未到達
*依賴????????:? 底層函數(shù)
*作者????????: 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(); //中斷退出
}
/*************************************************************************************************************************
*函數(shù)????????: void?RTC_Init(u8?AutoUpdate)
*功能????????: 初始化RTC
*參數(shù)????????: 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底層驅動函數(shù)
?*?作者: 陳鵬
?*?創(chuàng)建時間: 2012年3月28日21:52
?*?最后修改時間:2012年3月28日
?*?詳細: RTC相關底層驅動函數(shù)
*************************************************************************************************************/
#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
//農(nóng)歷日月年節(jié)氣
u8?l_year; //年
u8?l_month; //月
u8?l_data; //日
u8?SolarTerms; //農(nóng)歷節(jié)氣?
#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




