相對于STM32,6410的RTC是相當?shù)暮唵?
/************************************************************************************************************* ?*?文件名: RTC.c ?*?功能: S3C6410?RTC底層驅(qū)動函數(shù) ?*?作者: cp1300@139.com ?*?創(chuàng)建時間: 2012年3月28日21:52 ?*?最后修改時間:2012年3月28日 ?*?詳細: RTC相關(guān)底層驅(qū)動函數(shù) *************************************************************************************************************/ #include?"system.h" #include?"rtc.h" Time_TypeDef?Timer;//存放全局時間 //內(nèi)部靜態(tài)變量聲明 static?bool?uAutoTimeUpdate?=?FALSE; //標記是否自動由中斷更新時間 static?bool?uSecEnd?=?FALSE; //秒結(jié)束標志,結(jié)束后就可以更新時間了 /************************************************************************************************************************* *函數(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碼轉(zhuǎn)DEC碼 *參數(shù)????????: BCD碼 *返回????????: DEC碼 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 用于將BCD碼時間轉(zhuǎn)換為十進制時間,長度為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秒獲取后轉(zhuǎn)化為DEC秒 *************************************************************************************************************************/ __inline?u8?GetSec(void) { return?(BCD_to_DEC(RTC->BCDSEC));//獲取秒 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetMin(void) *功能????????: 獲取分 *參數(shù)????????: 無 *返回????????: 分 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將BCD分獲取后轉(zhuǎn)化為DEC分 *************************************************************************************************************************/ __inline?u8?GetMin(void) { return?(BCD_to_DEC(RTC->BCDMIN));//獲取分 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetHour(void) *功能????????: 獲取時 *參數(shù)????????: 無 *返回????????: 時 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將BCD時獲取后轉(zhuǎn)化為DEC時 *************************************************************************************************************************/ __inline?u8?GetHour(void) { return?(BCD_to_DEC(RTC->BCDHOUR));//獲取時 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetWeek(void) *功能????????: 獲取星期 *參數(shù)????????: 無 *返回????????: 星期 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 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 *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將BCD日獲取后轉(zhuǎn)化為DEC日 *************************************************************************************************************************/ __inline?u8?GetDate(void) { return?(BCD_to_DEC(RTC->BCDDATE));//獲取日 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetMonth(void) *功能????????: 獲取月 *參數(shù)????????: 無 *返回????????: 月 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將BCD月獲取后轉(zhuǎn)化為DEC月 *************************************************************************************************************************/ __inline?u8?GetMonth(void) { return?(BCD_to_DEC(RTC->BCDMON));//獲取月 } /************************************************************************************************************************* *函數(shù)????????: __inline?u8?GetYear(void) *功能????????: 獲取年 *參數(shù)????????: 無 *返回????????: 年 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將BCD年獲取后轉(zhuǎn)化為DEC年 *************************************************************************************************************************/ __inline?u8?GetYear(void) { return?(BCD_to_DEC(RTC->BCDYEAR));//獲取年 } /************************************************************************************************************************* *函數(shù)????????: void?UpdateTimer(void) *功能????????: 更新時間 *參數(shù)????????: 無 *返回????????: 無 *依賴????????:? 底層函數(shù) *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 將時間放在了全局的結(jié)構(gòu)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碼轉(zhuǎn)BCD碼 *參數(shù)????????: DEC碼 *返回????????: BCD碼 *依賴????????:? 無 *作者????????: cp1300@139.com *時間????????: 20120329 *最后修改時間: 20120329 *說明????????: 用于將DEC碼時間轉(zhuǎn)換為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) //秒結(jié)束 { 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; //秒結(jié)束時間成立 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);//關(guān)閉TIC中斷 } }
/************************************************************************************************************* ?*?文件名: RTC.H ?*?功能: S3C6410?RTC底層驅(qū)動函數(shù) ?*?作者: 陳鵬 ?*?創(chuàng)建時間: 2012年3月28日21:52 ?*?最后修改時間:2012年3月28日 ?*?詳細: RTC相關(guān)底層驅(qū)動函數(shù) *************************************************************************************************************/ #ifndef?_RTC_H_ #define?_RTC_H_ ?//時間結(jié)構(gòu)體 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