S3C6410裸機(jī)RTC實(shí)時(shí)時(shí)鐘
掃描二維碼
隨時(shí)隨地手機(jī)看文章
相對于STM32,6410的RTC是相當(dāng)?shù)暮唵?
/************************************************************************************************************* ?*?文件名: 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è)置 *返回????????: 無 *依賴?????:? 底層宏定義 *作者????????: cp1300@139.com *時(shí)間?????: 20120328 *最后修改時(shí)間: 20120329 *說明?????: 平時(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碼 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 用于將BCD碼時(shí)間轉(zhuǎn)換為十進(jìn)制時(shí)間,長度為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 *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD秒獲取后轉(zhuǎn)化為DEC秒 *************************************************************************************************************************/ __inline?u8?GetSec(void) { return?(BCD_to_DEC(RTC->BCDSEC));//獲取秒 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetMin(void) *功能????????: 獲取分 *參數(shù)????????: 無 *返回????????: 分 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD分獲取后轉(zhuǎn)化為DEC分 *************************************************************************************************************************/ __inline?u8?GetMin(void) { return?(BCD_to_DEC(RTC->BCDMIN));//獲取分 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetHour(void) *功能????????: 獲取時(shí) *參數(shù)????????: 無 *返回????????: 時(shí) *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD時(shí)獲取后轉(zhuǎn)化為DEC時(shí) *************************************************************************************************************************/ __inline?u8?GetHour(void) { return?(BCD_to_DEC(RTC->BCDHOUR));//獲取時(shí) } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetWeek(void) *功能????????: 獲取星期 *參數(shù)????????: 無 *返回????????: 星期 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD星期獲取后轉(zhuǎn)化為DEC星期,1-7:星期一-星期日 *************************************************************************************************************************/ __inline?u8?GetWeek(void) { return?(BCD_to_DEC(RTC->BCDDAY));//獲取星期 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetDate(void) *功能????????: 獲取日 *參數(shù)????????: 無 *返回????????: 日 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD日獲取后轉(zhuǎn)化為DEC日 *************************************************************************************************************************/ __inline?u8?GetDate(void) { return?(BCD_to_DEC(RTC->BCDDATE));//獲取日 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetMonth(void) *功能????????: 獲取月 *參數(shù)????????: 無 *返回????????: 月 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD月獲取后轉(zhuǎn)化為DEC月 *************************************************************************************************************************/ __inline?u8?GetMonth(void) { return?(BCD_to_DEC(RTC->BCDMON));//獲取月 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetYear(void) *功能????????: 獲取年 *參數(shù)????????: 無 *返回????????: 年 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將BCD年獲取后轉(zhuǎn)化為DEC年 *************************************************************************************************************************/ __inline?u8?GetYear(void) { return?(BCD_to_DEC(RTC->BCDYEAR));//獲取年 } /************************************************************************************************************************* *函數(shù)????????: void?UpdateTimer(void) *功能????????: 更新時(shí)間 *參數(shù)????????: 無 *返回????????: 無 *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 將時(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碼 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 用于將DEC碼時(shí)間轉(zhuǎn)換為BCD時(shí)間,長度為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ù)????????: 分 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ void?SetMin(u8?DEC_Min) { RTC->BCDMIN?=?DEC_to_BCD(DEC_Min);//設(shè)置分 } /************************************************************************************************************************* *函數(shù)????????: void?SetHour(u8?DEC_Hour) *功能????????: 設(shè)置時(shí) *參數(shù)????????: 時(shí) *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ void?SetHour(u8?DEC_Hour) { RTC->BCDHOUR?=?DEC_to_BCD(DEC_Hour);//設(shè)置時(shí) } /************************************************************************************************************************* *函數(shù)????????: void?SetWeek(u8?DEC_Week) *功能????????: 設(shè)置星期 *參數(shù)????????: 星期 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ void?SetWeek(u8?DEC_Week) { RTC->BCDDAY?=?DEC_to_BCD(DEC_Week);//設(shè)置星期 } /************************************************************************************************************************* *函數(shù)????????: void?SetDate(u8?DEC_Date) *功能????????: 設(shè)置日 *參數(shù)????????: 日 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ void?SetDate(u8?DEC_Date) { RTC->BCDDATE?=?DEC_to_BCD(DEC_Date);//設(shè)置日 } /************************************************************************************************************************* *函數(shù)????????: void?SetMonth(u8?DEC_Month) *功能????????: 設(shè)置月 *參數(shù)????????: 月 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ void?SetMonth(u8?DEC_Month) { RTC->BCDMON?=?DEC_to_BCD(DEC_Month);//設(shè)置月 } /************************************************************************************************************************* *函數(shù)????????: void?SetYear(u8?DEC_Year) *功能????????: 設(shè)置年 *參數(shù)????????: 年 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置時(shí)間,注意需要先開啟寫保護(hù),否則無法寫入 *************************************************************************************************************************/ 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ù)????????: 年,月,日,星期 *返回????????: 無 *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置會(huì)自動(dòng)去除寫保護(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í),分,秒 *返回????????: 無 *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120329 *說明????????: 設(shè)置會(huì)自動(dòng)去除寫保護(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ù)????????: 無 *返回????????: 無 *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時(shí)間????????: 20120331 *最后修改時(shí)間: 20120331 *說明????????: 無 *************************************************************************************************************************/ __inline?ClearIntP(void) { RTC->INTP?|=?BIT0; //寫1清除TIC中斷 } /************************************************************************************************************************* *函數(shù)????????: bool?RTC_SecEnd(void) *功能????????: 判斷秒是否到達(dá) *參數(shù)????????: 無 *返回????????: TRUE:秒到達(dá);FALSE:未到達(dá) *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時(shí)間????????: 20120331 *最后修改時(shí)間: 20120331 *說明????????: 無 *************************************************************************************************************************/ bool?RTC_SecEnd(void) { if(uAutoTimeUpdate?==?TRUE) //開啟了自動(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:是否開啟中斷 *返回????????: 無 *依賴????????:? 無 *作者????????: cp1300@139.com *時(shí)間????????: 20120329 *最后修改時(shí)間: 20120331 *說明????????: 判斷時(shí)鐘是否寫保護(hù),如果沒,則寫開啟保護(hù),并更新時(shí)間 *************************************************************************************************************************/ void?RTC_Init(FunctionalState?EnableInt) { RTC->TICNT?=?32768-1; RTC->CON?=?BIT8; //使能標(biāo)記定時(shí)器,32768分頻 RTC_Install(DISABLE); //開啟時(shí)鐘寫保護(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