static bool_t __Rtc_SetTime(s64 time) { bool_t result = false; struct tm dtm; s64 time_s; u32 dtime,timout = 1500*mS; time_s = time/1000000; Tm_LocalTime_r(&time_s,&dtm); if((dtm.tm_year > 2000) && (dtm.tm_year < 2099)) { RTC->RTC_CR |= RTC_CR_UPDTIM | RTC_CR_UPDCAL; while((RTC->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD) { Djy_EventDelay(100*mS); timout -= 100*mS; if(timout <= 0) { RTC->RTC_CR &= ~(RTC_CR_UPDCAL | RTC_CR_UPDTIM) ; RTC->RTC_SCCR |= RTC_SCCR_SECCLR; /* clear SECENV in SCCR */ return false; } } // while ((RTC->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD) ; RTC->RTC_SCCR = RTC_SCCR_ACKCLR ; dtime = (HexToBcd(dtm.tm_hour) << RTC_TIMR_HOUR_Pos) | (HexToBcd(dtm.tm_min) << RTC_TIMR_MIN_Pos) | (HexToBcd(dtm.tm_sec) << RTC_TIMR_SEC_Pos); RTC->RTC_TIMR = dtime; if(dtm.tm_wday == 0) dtm.tm_wday = 7; dtime = (HexToBcd(dtm.tm_year - 2000) << RTC_CALR_YEAR_Pos) | (HexToBcd(dtm.tm_mon) << RTC_CALR_MONTH_Pos) | (HexToBcd(dtm.tm_mday) << RTC_CALR_DATE_Pos) | (HexToBcd(dtm.tm_wday) << RTC_CALR_DAY_Pos)| (HexToBcd(20) << RTC_CALR_CENT_Pos); RTC->RTC_CALR = dtime; RTC->RTC_CR &= ~(RTC_CR_UPDCAL | RTC_CR_UPDTIM) ; RTC->RTC_SCCR |= RTC_SCCR_SECCLR; /* clear SECENV in SCCR */ result = !((RTC->RTC_VER & RTC_VER_NVTIM) | (RTC->RTC_VER & RTC_VER_NVCAL)) ; } return result; }
// ============================================================================= // 功能:RTC时钟更新,将系统时间更新到RTC模块,由于时钟模块的年存储的最大值为99,因此 // 本RTC模块设计从2000为起始值,如2014,则RTC模块的rBCDYEAR存储的是14 // 参数:dtm,更新时间 // 返回:true,成功;false,失败 // ============================================================================= bool_t RTC_TimeUpdate(s64 time) { bool_t result = false; struct tm dtm; s64 time_s; time_s = time/1000000; Tm_LocalTime_r(&time_s,&dtm); if((dtm.tm_year > 2000) && (dtm.tm_year < 2099)) { rRTCCON = 1 ; //RTC read and write enable rBCDYEAR = HexToBcd(dtm.tm_year - 2000); rBCDMON = HexToBcd(dtm.tm_mon); rBCDDATE = HexToBcd(dtm.tm_mday); rBCDHOUR = HexToBcd(dtm.tm_hour); rBCDMIN = HexToBcd(dtm.tm_min); rBCDSEC = HexToBcd(dtm.tm_sec); rRTCCON &= ~1 ; //RTC read and write disable result = true; } return result; }
// ÔÚÏÔʾÆ÷µ×¶ËÏÔʾʱ¼ä void dis_wnd_bottom_text(struct tagGkWinRsc *parent) { static char text_time[]="2012Äê07ÔÂ06ÈÕ 23:59:59"; static s64 last_nowtime = 0; struct tagRectangle rect; char text_buf[32]; struct tm dtm; s64 nowtime; rect.left = 0; rect.top = 5; rect.right = 24*8+15; rect.bottom = 16+5; // ¸üÐÂʱ¼ä nowtime = TM_Time(NULL); if ((nowtime - last_nowtime) > 0) { Tm_LocalTime_r(&nowtime,&dtm); text_time[0] = '\0'; // Äê itoa(dtm.tm_year, text_buf, 10); strcat(text_buf, (const char*)"Äê"); strcat(text_time, text_buf); // Ô if (dtm.tm_mon<10) { strcat(text_time, "0"); } itoa(dtm.tm_mon, text_buf, 10); strcat(text_buf, "ÔÂ"); strcat(text_time, text_buf); // ÈÕ if (dtm.tm_mday<10) { strcat(text_time, "0"); } itoa(dtm.tm_mday, text_buf, 10); strcat(text_buf, "ÈÕ "); strcat(text_time, text_buf); // ʱ if (dtm.tm_hour<10) { strcat(text_time, "0"); } itoa(dtm.tm_hour, text_buf, 10); strcat(text_buf, ":"); strcat(text_time, text_buf); // ·Ö if (dtm.tm_min<10) { strcat(text_time, "0"); } itoa(dtm.tm_min, text_buf, 10); strcat(text_buf, ":"); strcat(text_time, text_buf); // Ãë if (dtm.tm_sec<10) { strcat(text_time, "0"); } itoa(dtm.tm_sec, text_buf, 10); strcat(text_time, text_buf); GK_ApiFillRect(parent, &rect, CN_COLOR_GREEN,0,CN_FILLRECT_MODE_N,0); GK_ApiDrawText(parent,NULL,NULL, 5, 5, text_time, strnlen(text_time, 100), CN_COLOR_WHITE, CN_R2_COPYPEN,CN_TIMEOUT_FOREVER); } }