forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

wujiazhi
2024-06-13 72def895431ad7a08e635b11f3da738e2b2c4618
Function/EXTERN_RTC/extern_rtc.c
@@ -1,65 +1,13 @@
#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_PULLUP);
}
//ÅжÏ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)
@@ -124,87 +72,62 @@
//²ÎÊý£º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)