S3C6410裸機(jī)RTC實(shí)時(shí)時(shí)鐘
掃描二維碼
隨時(shí)隨地手機(jī)看文章
相對(duì)于STM32,6410的RTC是相當(dāng)?shù)暮?jiǎn)單.
/*************************************************************************************************************
?*?文件名: RTC.c
?*?功能: S3C6410?RTC底層驅(qū)動(dòng)函數(shù)
?*?作者: cp1300@139.com
?*?創(chuàng)建時(shí)間: 2012年3月28日21:52
?*?最后修改時(shí)間:2012年3月28日
?*?詳細(xì): RTC相關(guān)底層驅(qū)動(dòng)函數(shù)
*************************************************************************************************************/
#include?"system.h"
#include?"rtc.h"
Time_TypeDef?Timer;//存放全局時(shí)間
//內(nèi)部靜態(tài)變量聲明
static?bool?uAutoTimeUpdate?=?FALSE; //標(biāo)記是否自動(dòng)由中斷更新時(shí)間
static?bool?uSecEnd?=?FALSE; //秒結(jié)束標(biāo)志,結(jié)束后就可以更新時(shí)間了
/*************************************************************************************************************************
*函數(shù)????????: void?RTC_Install(u8?ENABLE)
*功能????????: RTC設(shè)置使能與失能
*參數(shù)????????: Enable:使能時(shí)鐘設(shè)置,Disable:使能時(shí)鐘設(shè)置
*返回????????: 無(wú)
*依賴?????:? 底層宏定義
*作者????????: cp1300@139.com
*時(shí)間?????: 20120328
*最后修改時(shí)間: 20120329
*說(shuō)明?????: 平時(shí)不設(shè)置時(shí)應(yīng)該設(shè)置為Disable
*************************************************************************************************************************/
void?RTC_Install(u8?ENABLE)
{
if(ENABLE)
RTC->CON?|=??BIT0;//RTC時(shí)鐘設(shè)置使能
else
RTC->CON?&=??~BIT0;//RTC時(shí)鐘設(shè)置失能
}
/*************************************************************************************************************************
*函數(shù)????????: u8?BCD_to_DEC(u8?BCD_Code)
*功能????????: BCD碼轉(zhuǎn)DEC碼
*參數(shù)????????: BCD碼
*返回????????: DEC碼
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 用于將BCD碼時(shí)間轉(zhuǎn)換為十進(jìn)制時(shí)間,長(zhǎng)度為8bit
*************************************************************************************************************************/
u8?BCD_to_DEC(u8?BCD_Code)
{
return?((BCD_Code?>>?4)?*?10?+?(BCD_Code?&?0x0f));
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetSec(void)
*功能????????: 獲取秒
*參數(shù)????????: 無(wú)
*返回????????: 秒
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD秒獲取后轉(zhuǎn)化為DEC秒
*************************************************************************************************************************/
__inline?u8?GetSec(void)
{
return?(BCD_to_DEC(RTC->BCDSEC));//獲取秒
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetMin(void)
*功能????????: 獲取分
*參數(shù)????????: 無(wú)
*返回????????: 分
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD分獲取后轉(zhuǎn)化為DEC分
*************************************************************************************************************************/
__inline?u8?GetMin(void)
{
return?(BCD_to_DEC(RTC->BCDMIN));//獲取分
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetHour(void)
*功能????????: 獲取時(shí)
*參數(shù)????????: 無(wú)
*返回????????: 時(shí)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD時(shí)獲取后轉(zhuǎn)化為DEC時(shí)
*************************************************************************************************************************/
__inline?u8?GetHour(void)
{
return?(BCD_to_DEC(RTC->BCDHOUR));//獲取時(shí)
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetWeek(void)
*功能????????: 獲取星期
*參數(shù)????????: 無(wú)
*返回????????: 星期
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD星期獲取后轉(zhuǎn)化為DEC星期,1-7:星期一-星期日
*************************************************************************************************************************/
__inline?u8?GetWeek(void)
{
return?(BCD_to_DEC(RTC->BCDDAY));//獲取星期
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetDate(void)
*功能????????: 獲取日
*參數(shù)????????: 無(wú)
*返回????????: 日
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD日獲取后轉(zhuǎn)化為DEC日
*************************************************************************************************************************/
__inline?u8?GetDate(void)
{
return?(BCD_to_DEC(RTC->BCDDATE));//獲取日
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetMonth(void)
*功能????????: 獲取月
*參數(shù)????????: 無(wú)
*返回????????: 月
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD月獲取后轉(zhuǎn)化為DEC月
*************************************************************************************************************************/
__inline?u8?GetMonth(void)
{
return?(BCD_to_DEC(RTC->BCDMON));//獲取月
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?u8?GetYear(void)
*功能????????: 獲取年
*參數(shù)????????: 無(wú)
*返回????????: 年
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將BCD年獲取后轉(zhuǎn)化為DEC年
*************************************************************************************************************************/
__inline?u8?GetYear(void)
{
return?(BCD_to_DEC(RTC->BCDYEAR));//獲取年
}
/*************************************************************************************************************************
*函數(shù)????????: void?UpdateTimer(void)
*功能????????: 更新時(shí)間
*參數(shù)????????: 無(wú)
*返回????????: 無(wú)
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 將時(shí)間放在了全局的結(jié)構(gòu)Timer中
*************************************************************************************************************************/
void?UpdateTimer(void)
{
Timer.w_year?=?2000?+?GetYear(); //更新年,起點(diǎn)為2000年
Timer.w_month?=?GetMonth(); //更新月
Timer.w_date?=?GetDate(); //更新日
Timer.week?=?GetWeek(); //更新星期
Timer.hour?=?GetHour(); //更新時(shí)
Timer.min?=?GetMin(); //更新分
Timer.sec?=?GetSec(); //更新秒
}
/*************************************************************************************************************************
*函數(shù)????????: u8?DEC_to_BCD(u8?DEC_Code)
*功能????????: DEC碼轉(zhuǎn)BCD碼
*參數(shù)????????: DEC碼
*返回????????: BCD碼
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 用于將DEC碼時(shí)間轉(zhuǎn)換為BCD時(shí)間,長(zhǎng)度為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è)置取秒
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetMin(u8?DEC_Min)
*功能????????: 設(shè)置分
*參數(shù)????????: 分
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetMin(u8?DEC_Min)
{
RTC->BCDMIN?=?DEC_to_BCD(DEC_Min);//設(shè)置分
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetHour(u8?DEC_Hour)
*功能????????: 設(shè)置時(shí)
*參數(shù)????????: 時(shí)
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetHour(u8?DEC_Hour)
{
RTC->BCDHOUR?=?DEC_to_BCD(DEC_Hour);//設(shè)置時(shí)
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetWeek(u8?DEC_Week)
*功能????????: 設(shè)置星期
*參數(shù)????????: 星期
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetWeek(u8?DEC_Week)
{
RTC->BCDDAY?=?DEC_to_BCD(DEC_Week);//設(shè)置星期
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetDate(u8?DEC_Date)
*功能????????: 設(shè)置日
*參數(shù)????????: 日
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetDate(u8?DEC_Date)
{
RTC->BCDDATE?=?DEC_to_BCD(DEC_Date);//設(shè)置日
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetMonth(u8?DEC_Month)
*功能????????: 設(shè)置月
*參數(shù)????????: 月
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetMonth(u8?DEC_Month)
{
RTC->BCDMON?=?DEC_to_BCD(DEC_Month);//設(shè)置月
}
/*************************************************************************************************************************
*函數(shù)????????: void?SetYear(u8?DEC_Year)
*功能????????: 設(shè)置年
*參數(shù)????????: 年
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置時(shí)間,注意需要先開(kāi)啟寫(xiě)保護(hù),否則無(wú)法寫(xiě)入
*************************************************************************************************************************/
void?SetYear(u8?DEC_Year)
{
RTC->BCDYEAR?=?DEC_to_BCD(DEC_Year);//設(shè)置年
}
/*************************************************************************************************************************
*函數(shù)????????: void?InstallData(u16?Year,u8?Month,u8?Date,u8?Week)
*功能????????: 設(shè)置日期
*參數(shù)????????: 年,月,日,星期
*返回????????: 無(wú)
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置會(huì)自動(dòng)去除寫(xiě)保護(hù),年范圍為2000-2099
*************************************************************************************************************************/
void?InstallData(u16?Year,u8?Month,u8?Date,u8?Week)
{
RTC_Install(ENABLE); //允許更新時(shí)間
SetYear(Year-2000); //設(shè)置年
SetMonth(Month); //設(shè)置月
SetDate(Date); //設(shè)置日
SetWeek(Week); //設(shè)置星期
RTC_Install(DISABLE); //禁止更新時(shí)間
}
/*************************************************************************************************************************
*函數(shù)????????: void?InstallTime(u8?Hour,u8?Min,u8?Sec)
*功能????????: 設(shè)置時(shí)間
*參數(shù)????????: 時(shí),分,秒
*返回????????: 無(wú)
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120329
*說(shuō)明????????: 設(shè)置會(huì)自動(dòng)去除寫(xiě)保護(hù)
*************************************************************************************************************************/
void?InstallTime(u8?Hour,u8?Min,u8?Sec)
{
RTC_Install(ENABLE); //允許更新時(shí)間
SetHour(Hour); //設(shè)置時(shí)
SetMin(Min); //設(shè)置分
SetSec(Sec); //設(shè)置秒
RTC_Install(DISABLE); //禁止更新時(shí)間
}
/*************************************************************************************************************************
*函數(shù)????????: __inline?ClearIntP(void)
*功能????????: 清除INTP中斷標(biāo)志
*參數(shù)????????: 無(wú)
*返回????????: 無(wú)
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120331
*最后修改時(shí)間: 20120331
*說(shuō)明????????: 無(wú)
*************************************************************************************************************************/
__inline?ClearIntP(void)
{
RTC->INTP?|=?BIT0; //寫(xiě)1清除TIC中斷
}
/*************************************************************************************************************************
*函數(shù)????????: bool?RTC_SecEnd(void)
*功能????????: 判斷秒是否到達(dá)
*參數(shù)????????: 無(wú)
*返回????????: TRUE:秒到達(dá);FALSE:未到達(dá)
*依賴????????:? 底層函數(shù)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120331
*最后修改時(shí)間: 20120331
*說(shuō)明????????: 無(wú)
*************************************************************************************************************************/
bool?RTC_SecEnd(void)
{
if(uAutoTimeUpdate?==?TRUE) //開(kāi)啟了自動(dòng)更新時(shí)間
{
if(uSecEnd?==?TRUE) //秒結(jié)束
{
uSecEnd?=?FALSE; //清除標(biāo)志
return?TRUE;
}
else
return?FALSE;
}
if(RTC->INTP?&?BIT0) //TIC中斷標(biāo)志置位
{
ClearIntP(); //清除中斷標(biāo)志
return?TRUE;
}
return?FALSE;
}
//TIC中斷服務(wù)程序,用于自動(dòng)更新時(shí)間
void?__irq?Isr_RTC_InspectTick(void)
{
uSecEnd?=?TRUE; //秒結(jié)束時(shí)間成立
UpdateTimer(); //更新所有時(shí)間
ClearIntP(); //清除中斷標(biāo)志
VICInterruptEnd(); //中斷退出
}
/*************************************************************************************************************************
*函數(shù)????????: void?RTC_Init(u8?AutoUpdate)
*功能????????: 初始化RTC
*參數(shù)????????: EnableInt:是否開(kāi)啟中斷
*返回????????: 無(wú)
*依賴????????:? 無(wú)
*作者????????: cp1300@139.com
*時(shí)間????????: 20120329
*最后修改時(shí)間: 20120331
*說(shuō)明????????: 判斷時(shí)鐘是否寫(xiě)保護(hù),如果沒(méi),則寫(xiě)開(kāi)啟保護(hù),并更新時(shí)間
*************************************************************************************************************************/
void?RTC_Init(FunctionalState?EnableInt)
{
RTC->TICNT?=?32768-1;
RTC->CON?=?BIT8; //使能標(biāo)記定時(shí)器,32768分頻
RTC_Install(DISABLE); //開(kāi)啟時(shí)鐘寫(xiě)保護(hù)
UpdateTimer(); //更新所有時(shí)間
if(EnableInt?==?ENABLE) //使能自動(dòng)更新時(shí)間
{
uAutoTimeUpdate?=?TRUE;//標(biāo)志有效
Set_IsrAddr(INT_RTC_TIC,(u32)Isr_RTC_InspectTick);//設(shè)置中斷向量地址
Set_IntEnable(INT_RTC_TIC,ENABLE);//使能TIC中斷
}
else
{
uAutoTimeUpdate?=?FALSE;
Set_IntEnable(INT_RTC_TIC,DISABLE);//關(guān)閉TIC中斷
}
}/*************************************************************************************************************
?*?文件名: RTC.H
?*?功能: S3C6410?RTC底層驅(qū)動(dòng)函數(shù)
?*?作者: 陳鵬
?*?創(chuàng)建時(shí)間: 2012年3月28日21:52
?*?最后修改時(shí)間:2012年3月28日
?*?詳細(xì): RTC相關(guān)底層驅(qū)動(dòng)函數(shù)
*************************************************************************************************************/
#ifndef?_RTC_H_
#define?_RTC_H_
?//時(shí)間結(jié)構(gòu)體
typedef?struct?
{
u8?hour;? //小時(shí)
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;//存放全局時(shí)間
void?UpdateTimer(void); //更新全部時(shí)間
void?RTC_Init(FunctionalState?EnableInt); //初始化RTC
void?InstallData(u16?Year,u8?Month,u8?Date,u8?Week); //設(shè)置日期
void?InstallTime(u8?Hour,u8?Min,u8?Sec); //設(shè)置時(shí)間
bool?RTC_SecEnd(void); //判斷秒是否到達(dá)
#endif




