uint8 TIME_AddMon(uint8 *pDate, uint8 mon) //月增量 { uint8 temp, temp1, temp2; temp = BcdToHex(pDate[1]) + mon; temp1 = temp % 12; temp2 = temp / 12; pDate[4] = HexToBcd(temp1); if (temp2 != 0) pDate[5] = HexToBcd(BcdToHex(pDate[5]) + temp2); return 0; }
uint8 TIME_AddHour(uint8 *pDate, uint8 hour) //小时增量 { uint8 temp, temp1, temp2; temp = BcdToHex(pDate[2]) + hour; temp1 = temp % 24; temp2 = temp / 24; pDate[2] = HexToBcd(temp1); if (temp2 != 0) TIME_AddDate(pDate, temp2); return 0; }
uint8 TIME_AddSec(uint8 *pDate, uint8 sec) //秒增量 { uint8 temp, temp1, temp2; temp = BcdToHex(pDate[0]) + sec; temp1 = temp % 60; temp2 = temp / 60; pDate[0] = HexToBcd(temp1); if (temp2 != 0) TIME_AddMin(pDate, temp2); return 0; }
uint8 TIME_AddMin(uint8 *pDate, uint8 min) //分钟增量 { uint8 temp, temp1, temp2; temp = BcdToHex(pDate[1]) + min; temp1 = temp % 60; temp2 = temp / 60; pDate[1] = HexToBcd(temp1); if (temp2 != 0) TIME_AddHour(pDate, temp2); return 0; }
// ============================================================================= // 功能:从RTC设备中读取RTC时间,单位微秒,取从1970年1月1日0:0:0到现在的时间差 // 参数:time, 时间值,需把日历时间转换成1970年1月1日0:0:0到现在的时间差 // 返回:true,正常操作,否则出错 // ============================================================================= bool_t Rtc_GetTime(s64 *time) { struct tm dtm; u32 rtc_timr,rtc_calr; u32 year,month,date,hour,min,sec; rtc_timr = RTC->RTC_TIMR; rtc_calr = RTC->RTC_CALR; year = (rtc_calr & RTC_CALR_YEAR_Msk) >> RTC_CALR_YEAR_Pos; month = (rtc_calr & RTC_CALR_MONTH_Msk) >> RTC_CALR_MONTH_Pos; date = (rtc_calr & RTC_CALR_DATE_Msk) >> RTC_CALR_DATE_Pos; hour = (rtc_timr & RTC_TIMR_HOUR_Msk) >> RTC_TIMR_HOUR_Pos; min = (rtc_timr & RTC_TIMR_MIN_Msk) >> RTC_TIMR_MIN_Pos; sec = (rtc_timr & RTC_TIMR_SEC_Msk) >> RTC_TIMR_SEC_Pos; dtm.tm_year = BcdToHex(year) + 2000; dtm.tm_mon = BcdToHex(month); dtm.tm_mday = BcdToHex(date); dtm.tm_hour = BcdToHex(hour); dtm.tm_min = BcdToHex(min); dtm.tm_sec = BcdToHex(sec); *time = 1000000 * Tm_MkTime(&dtm); return true; }
uint8 TIME_SubHour(uint8 *pDate, uint8 hour) //小时减法 { uint8 temp, temp1; temp = BcdToHex(pDate[1]); if (temp > hour) temp1 = temp - hour; else { temp1 = temp + 24 - hour; SubDate(pDate); } pDate[2] = HexToBcd(temp1); return 0; }
uint8 TIME_SubMin(uint8 *pDate, uint8 min) //分钟减法 { uint8 temp, temp1; temp = BcdToHex(pDate[1]); if (temp >= min) temp1 = temp - min; else { temp1 = temp + 60 - min; TIME_SubHour(pDate, 1); } pDate[1] = HexToBcd(temp1); return 0; }
// ============================================================================= // 功能:RTC中断,使用RTC模块的TICK计数器,配置为每一秒中断一次,并在中断中读取RTC // 时钟,并配置系统时钟 // 参数:中断线号 // 返回:0 // ============================================================================= u32 RTC_ISR(ufast_t rtc_int_line) { struct tm dtm; rRTCCON = 1 ; //RTC read and write enable dtm.tm_year = BcdToHex(rBCDYEAR) + 2000; dtm.tm_mon = BcdToHex(rBCDMON); dtm.tm_mday = BcdToHex(rBCDDATE); dtm.tm_hour = BcdToHex(rBCDHOUR); dtm.tm_min = BcdToHex(rBCDMIN); dtm.tm_sec = BcdToHex(rBCDSEC); rRTCCON &= ~1 ; //RTC read and write disable Tm_SetDateTime(&dtm); // 向OS的Clock模块传递新的时间值 return 0; }
// ============================================================================= // 功能:获取RTC时钟,读取RTC模块的时间,由于时钟模块的年存储的最大值为99,因此需将读 // 到的年份加基数年2000,如,读RTC模块的rBCDYEAR为14,则为2014年 // 参数:dtm,更新时间 // 返回:true // ============================================================================= bool_t RTC_TimeGet(s64 *time) { struct tm dtm; rRTCCON = 1 ; //RTC read and write enable dtm.tm_year = BcdToHex(rBCDYEAR) + 2000; dtm.tm_mon = BcdToHex(rBCDMON); dtm.tm_mday = BcdToHex(rBCDDATE); dtm.tm_hour = BcdToHex(rBCDHOUR); dtm.tm_min = BcdToHex(rBCDMIN); dtm.tm_sec = BcdToHex(rBCDSEC); rRTCCON &= ~1 ; //RTC read and write disable *time = 1000000 * Tm_MkTime(&dtm); return true; }
//-----更新RTC时钟--------------------------------------------------------------- //功能:将年月日时分秒写入到RTC时钟,更新RTC,由于RTC芯片存放的时间信息是基于BCD // 编码格式,所以在写入时间前,需要将时间信息转化为相应的BCD格式 //参数:DateTime,rtc_tm结构类型的变量,里面存放着需更新RTC的时间信息 //返回:无 //----------------------------------------------------------------------------- uint32_t rtc_time_get(struct rtc_tm *DateTime) { uint32_t sec, min, hour, mday, wday, mon, year; //判断是否需要初始化SPI,以防module_init_rtc未被调用 if(!rtc_spi_Config) { rtc_spi_Config = &pg_spi_Config; rtc_spi_Config->freq=CFG_RTC_SPI_SPEED; Spi_Init(CFG_RTC_SPI_BUS,rtc_spi_Config); } //从RTC读时间 sec = __rtc_read (RTC_CMD_SECONDS); min = __rtc_read (RTC_CMD_MINUTES); hour = __rtc_read (RTC_CMD_HOURS); mday = __rtc_read (RTC_CMD_DATE_OF_MONTH); wday = __rtc_read (RTC_CMD_DAY_OF_WEEK); mon = __rtc_read (RTC_CMD_MONTH); year = __rtc_read (RTC_CMD_YEAR); //将BCD格式转化为正常模式 DateTime->tm_sec = BcdToHex(sec & 0x7F); DateTime->tm_min = BcdToHex(min & 0x7F); DateTime->tm_hour = BcdToHex(hour); DateTime->tm_mday = BcdToHex(mday & 0x3F); DateTime->tm_wday = BcdToHex(wday & 0x07) - 1; DateTime->tm_mon = BcdToHex(mon & 0x1F); DateTime->tm_year = BcdToHex(year) + 2000; /*---------------------test use only----------------------*/ printf("Get RTC year: %04d mon: %02d mday: %02d wday: %02d " "hr: %02d min: %02d sec: %02d\r\n", DateTime->tm_year, DateTime->tm_mon, DateTime->tm_mday, DateTime->tm_wday, DateTime->tm_hour, DateTime->tm_min, DateTime->tm_sec); /*---------------------test use only----------------------*/ return 0; }
/* AT+CMGL=4 +CMGL: 1,0,,24 0891683108200845F7240D91683183185600F2210811509131918123044F60597D 0891683108200845F8240D91683183185600F221001150917145542302C618 OK */ BYTE Handle_PduSms(void) { static BYTE i,k,len; i = GetSignLoc(0x0A,2); if (i == 0xFF) { return FALSE; } if ((Sms_Buffer[i+1] != '0') || (Sms_Buffer[i+2] != '8')) { printf("--Err1\r\n"); return FALSE; } //短信中心号码 mcpy(CenterNumber,&Sms_Buffer[i+7],12); //27 来电号码 mcpy(SmsNumber,&Sms_Buffer[i+27],12); //41 if ((Sms_Buffer[i+41] != '0') || (Sms_Buffer[i+42] != '0')) { printf("--Err2\r\n"); return FALSE; // 非文本短信返回 } //43 时间 //年 SysTime[0] = (Sms_Buffer[i+44]-0x30)*16 + (Sms_Buffer[i+43]-0x30); //月 SysTime[2] = (Sms_Buffer[i+46]-0x30)*16 + (Sms_Buffer[i+45]-0x30); //日 SysTime[3] = (Sms_Buffer[i+48]-0x30)*16 + (Sms_Buffer[i+47]-0x30); //时 SysTime[4] = (Sms_Buffer[i+50]-0x30)*16 + (Sms_Buffer[i+49]-0x30); //分 SysTime[5] = (Sms_Buffer[i+52]-0x30)*16 + (Sms_Buffer[i+51]-0x30); //秒 SysTime[6] = (Sms_Buffer[i+54]-0x30)*16 + (Sms_Buffer[i+53]-0x30); // 57 len len = BcdToHex(Sms_Buffer[i+57],Sms_Buffer[i+58]); //59 内容 for (k=0;k<len;k++) { SmsContent2[k] = BcdToHex(Sms_Buffer[i+59+k*2],Sms_Buffer[i+60+k*2]); } SmsLength = Decode7bit(SmsContent2,SmsContent,len); SmsLength = len; printf((char *)SmsContent); // SetSysTime(); return TRUE; }
uint8 TIME_AddDate(uint8 *pDate, uint8 date) //日增量 { uint8 year1; uint8 month1; uint8 day1; uint8 days[13]; year1 = BcdToHex(pDate[5]); month1 = BcdToHex(pDate[4]); day1 = BcdToHex(pDate[3]); days[0] = 0; days[1] = 31; days[2] = 28; days[3] = 31; days[4] = 30; days[5] = 31; days[6] = 30; days[7] = 31; days[8] = 31; days[9] = 30; days[10] = 31; days[11] = 30; days[12] = 31; if( (!IsLeap(year1) || month1 != 2)) { if ((day1 + date) <= days[month1] ) { pDate[3] = HexToBcd(day1 + date); pDate[4] = HexToBcd(month1); pDate[5] = HexToBcd(year1); } else { pDate[3] = HexToBcd(day1 + date - days[month1]); if (month1 == 12) { pDate[5] = HexToBcd(year1 + 1); pDate[4] = 1; } else { pDate[5] = HexToBcd(year1); pDate[4] = HexToBcd(month1 + 1); } } } else { if ((day1 + date) < 29) { pDate[3] = HexToBcd(day1 + date); pDate[4] = 2; pDate[5] = HexToBcd(year1); } else { pDate[3] = HexToBcd(day1 + date - 29); pDate[4] = 3; pDate[5] = HexToBcd(year1); } } return 0; }