| | |
| | | #include "extern_rtc.h" |
| | | #include "i2c.h" |
| | | #include "uart.h" |
| | | #include "gpio.h" |
| | | #include "system_general_para.h" |
| | | #include "sundry.h" |
| | | |
| | | __IO sClockBCD sys_clockBCD_g = {24,1,1,0,0,0}; |
| | | #include "ex_rtc.h" |
| | | |
| | | //__IO CALENDAR_TIME_T calendar_g = {0}; |
| | | |
| | | void RTC_GPIO_Init(void) |
| | | { |
| | | I2c_Scl_Gpio_Init(); |
| | | |
| | | InputtIO(EXT_RTC_INT_PORT,EXT_RTC_INT_PIN,IN_NORMAL); |
| | | } |
| | | |
| | | |
| | | |
| | | //ÅжÏBCDʱ¼äÊÇ·ñÓÐЧ£¬ FAIL±íʾʱ¼äÓÐÎó£¬PASS±íʾʱ¼äÓÐЧ |
| | | ErrorStatus TimeEffectJudgm(const sClockBCD TimeBCD) |
| | | { |
| | | uint8_t yearDec,monthDec,dayDec,hourDec,minDec,secDec; |
| | | |
| | | yearDec = BCD_2_DECIMAL(TimeBCD.year); |
| | | monthDec = BCD_2_DECIMAL(TimeBCD.month); |
| | | dayDec = BCD_2_DECIMAL(TimeBCD.day); |
| | | hourDec = BCD_2_DECIMAL(TimeBCD.hour); |
| | | minDec = BCD_2_DECIMAL(TimeBCD.min); |
| | | secDec = BCD_2_DECIMAL(TimeBCD.sec); |
| | | |
| | | if((yearDec>99)||(yearDec<20)||(monthDec>12)||(monthDec==0)||(dayDec>31)||(dayDec==0)||(hourDec>23)||(minDec>59)||(secDec>59)) |
| | | { |
| | | //ʱ¼äÎÞЧ |
| | | return FAIL; |
| | | }else |
| | | { |
| | | switch(monthDec) |
| | | { |
| | | case 4: |
| | | case 6: |
| | | case 9: |
| | | case 11: |
| | | if(dayDec>30) |
| | | return FAIL; |
| | | case 2: |
| | | if(((yearDec&0x3) != 0) && (dayDec>28)){ |
| | | return FAIL; |
| | | } |
| | | else if(((yearDec&0x3) == 0) && (dayDec > 29)){ |
| | | return FAIL; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return PASS; |
| | | } |
| | | } |
| | | |
| | | |
| | | __IO CALENDAR_TIME_T calendar_test_g = {0}; |
| | | |
| | | |
| | | void R8025T_Write(uint8_t sadd,uint8_t * pBuffer,uint8_t length) |
| | |
| | | //²ÎÊý£ºBCD¸ñʽ |
| | | void Set_Extern_Rtc_Time(uint16_t year,uint8_t month,uint8_t day,uint8_t week,uint8_t hour,uint8_t min,uint8_t sec) |
| | | { |
| | | uint8_t rtc_time[7] = {0,0,0,0,1,1,0x15}; |
| | | sClockBCD calendar_l; |
| | | uint8_t time[7] = {0,0,0,0,1,1,0x15}; |
| | | year &= 0x00FF; |
| | | if(Bcd_2_Hex(sec) < 60) |
| | | time[0] = sec; |
| | | if(Bcd_2_Hex(min) < 60) |
| | | time[1] = min; |
| | | if(Bcd_2_Hex(hour) < 24) |
| | | time[2] = hour; |
| | | time[3] = week; |
| | | if(Bcd_2_Hex(day) < 32) |
| | | time[4] = day; |
| | | if(Bcd_2_Hex(month) < 13) |
| | | time[5] = month; |
| | | if(Bcd_2_Hex(year) < 100) |
| | | time[6] = year; |
| | | |
| | | calendar_l.year = year & 0x00FF; |
| | | calendar_l.month = month; |
| | | calendar_l.day = day; |
| | | calendar_l.hour = hour; |
| | | calendar_l.min = min; |
| | | calendar_l.sec = sec; |
| | | |
| | | if(TimeEffectJudgm(calendar_l)==PASS)//ʱ¼äÕýÈ·²ÅÉèÖÃRTC |
| | | { |
| | | rtc_time[0] = sec; |
| | | rtc_time[1] = min; |
| | | rtc_time[2] = hour; |
| | | rtc_time[3] = week; |
| | | rtc_time[4] = day; |
| | | rtc_time[5] = month; |
| | | rtc_time[6] = year; |
| | | R8025T_Write(0,rtc_time,7); |
| | | } |
| | | // R8025T_Write(0,time,7); |
| | | R8025T_write(0,time,7); |
| | | } |
| | | |
| | | //»ñÈ¡ÍⲿRTCʱ¼ä |
| | | ErrorStatus Get_Extern_Rtc_Time(__IO sClockBCD * calendar_p) |
| | | void Get_Extern_Rtc_Time(__IO CALENDAR_TIME_T * calendar_p) |
| | | { |
| | | uint8_t rtc_time[7]; |
| | | sClockBCD calendar_l; |
| | | R8025T_Read(0,rtc_time,7); |
| | | // R8025T_Read(0,rtc_time,7); |
| | | R8025T_read(0,rtc_time,7); |
| | | |
| | | calendar_l.year = rtc_time[6]; |
| | | calendar_l.month = rtc_time[5]; |
| | | calendar_l.day = rtc_time[4]; |
| | | calendar_l.hour = rtc_time[2]; |
| | | calendar_l.min = rtc_time[1]; |
| | | calendar_l.sec = rtc_time[0]; |
| | | |
| | | if(TimeEffectJudgm(calendar_l)==PASS) //¶ÁÈ¡µÄʱ¼äÕýÈ·²Å²Ù×÷Ö¸Õë |
| | | { |
| | | calendar_p->sec = rtc_time[0]; |
| | | calendar_p->min = rtc_time[1]; |
| | | if(Bcd_2_Hex(rtc_time[0]) < 60) |
| | | calendar_p->second = rtc_time[0]; |
| | | else |
| | | calendar_p->second = 0; |
| | | if(Bcd_2_Hex(rtc_time[1]) < 60) |
| | | calendar_p->minute = rtc_time[1]; |
| | | else |
| | | calendar_p->minute = 0; |
| | | if(Bcd_2_Hex(rtc_time[2]) < 24) |
| | | calendar_p->hour = rtc_time[2]; |
| | | else |
| | | calendar_p->hour = 0; |
| | | calendar_p->week = rtc_time[3]; |
| | | if(Bcd_2_Hex(rtc_time[4]) < 32) |
| | | calendar_p->day = rtc_time[4]; |
| | | else |
| | | calendar_p->day = 1; |
| | | if(Bcd_2_Hex(rtc_time[5]) < 13) |
| | | calendar_p->month = rtc_time[5]; |
| | | calendar_p->year = rtc_time[6]; |
| | | else |
| | | calendar_p->month = 0x12; |
| | | if(Bcd_2_Hex(rtc_time[6]) < 100) |
| | | calendar_p->year = 0x2000 + rtc_time[6]; |
| | | else |
| | | calendar_p->year = 0x2015; |
| | | #ifdef RS232_PRINTF |
| | | printf("EX_RTC_TIME = %X-%02X-%02X-%02X-%02X-%02X \r\n",calendar_p->year,calendar_p->month,calendar_p->day, |
| | | calendar_p->hour,calendar_p->minute,calendar_p->second); |
| | | #endif |
| | | |
| | | return PASS; |
| | | }else |
| | | { |
| | | //ÔÙ¶ÁÒ»´Î |
| | | R8025T_Read(0,rtc_time,7); |
| | | calendar_l.year = rtc_time[6]; |
| | | calendar_l.month = rtc_time[5]; |
| | | calendar_l.day = rtc_time[4]; |
| | | calendar_l.hour = rtc_time[2]; |
| | | calendar_l.min = rtc_time[1]; |
| | | calendar_l.sec = rtc_time[0]; |
| | | |
| | | if(TimeEffectJudgm(calendar_l)==PASS) //¶ÁÈ¡µÄʱ¼äÕýÈ·²Å²Ù×÷Ö¸Õë |
| | | { |
| | | calendar_p->sec = rtc_time[0]; |
| | | calendar_p->min = rtc_time[1]; |
| | | calendar_p->hour = rtc_time[2]; |
| | | calendar_p->day = rtc_time[4]; |
| | | calendar_p->month = rtc_time[5]; |
| | | calendar_p->year = rtc_time[6]; |
| | | #ifdef RS232_PRINTF |
| | | printf("EX_RTC_TIME = %X-%02X-%02X-%02X-%02X-%02X \r\n",calendar_p->year,calendar_p->month,calendar_p->day, |
| | | calendar_p->hour,calendar_p->minute,calendar_p->second); |
| | | #endif |
| | | |
| | | return PASS; |
| | | }else |
| | | { |
| | | return FAIL; |
| | | } |
| | | } |
| | | } |
| | | |
| | | void Set_Rtc_UpdataInterrupt(void) |