Files

578 lines
15 KiB
C
Raw Permalink Normal View History

#include "CH57x_common.h"
#include "rtc.h"
#include "DBG.h"
#include <time.h>
#include "net.h"
//<2F><><EFBFBD><EFBFBD>?<3F><>RTC<54><43>y?Y(<28><>?<3F><><EFBFBD><EFBFBD>????<3F><>y?Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??a<><61>?????)
S_RTC RTC_Raw_Data;
S_RTC MCU_RTC_Data = {
.year = 0x24,
.month = 1,
.day = 1,
.week = 0,
.hour = 0,
.minute = 0,
.second = 0,
};
S_RTC Net_RTC_Data; //2024-08-03 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
TIME_INFO_T g_time_info;
/*******************************************************************************
* Function Name : RTC_DATA_Type_Cast_DEC
* Description : RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>y?Y<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?D?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??????DD<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><EFBFBD><EFBFBD><EFBFBD>a??<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>????<EFBFBD><EFBFBD>a???a<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>y
<EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>y <EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>???? <EFBFBD><EFBFBD>?????
0x16 -> 16
*******************************************************************************/
uint8_t RTC_DATA_Type_Cast_DEC(uint8_t data)
{
uint8_t rev = 0;
rev = (data / 16) * 10 + (data % 16);
return rev;
}
void RTC_Init(void)
{
//RTC_SDA - PB8
//RTC_SCL - PB9
RTC_SDA_OUTPUT;
RTC_SCL_OUTPUT;
RTC_SDA_H;
RTC_SCL_H;
memset(&RTC_Raw_Data,0,sizeof(RTC_Raw_Data));
memset(&g_time_info,0,sizeof(TIME_INFO_T));
}
void RTC_Wait(void)
{
__nop();__nop();
}
/********?a??SD2058<35><38>?IIC<49><43><EFBFBD><EFBFBD>??********/
void RTC_Start(void)
{
RTC_SDA_OUTPUT;
RTC_Wait();
RTC_SDA_H;
RTC_SCL_H;
RTC_Wait();
RTC_SDA_L;
RTC_Wait();
RTC_SCL_L;
RTC_Wait();
}
/********1?<3F><>?SD2058<35><38>?IIC<49><43><EFBFBD><EFBFBD>??*******/
void RTC_Stop(void)
{
RTC_SDA_OUTPUT;
RTC_SDA_L;
RTC_SCL_L;
RTC_Wait();
RTC_SCL_H;
RTC_Wait();
RTC_SDA_H;
}
/*********<2A><><EFBFBD><EFBFBD>?<3F><> ACK*********/
void RTC_Ack(void)
{
RTC_SDA_OUTPUT;
RTC_SCL_L;
RTC_SDA_L;
RTC_Wait();
RTC_SCL_H;
RTC_Wait();
RTC_SCL_L;
}
/*********<2A><><EFBFBD><EFBFBD>?<3F><>NO ACK*********/
void RTC_NoAck(void)
{
RTC_SDA_OUTPUT;
RTC_SCL_L;
RTC_SDA_H;
RTC_Wait();
RTC_SCL_H;
RTC_Wait();
RTC_SCL_L;
}
/*********?<3F><><EFBFBD><EFBFBD>?ACKD?o?*********/
uint8_t RTC_WaitAck(void)
{
uint8_t cnt = 0;
RTC_SCL_L;
RTC_SDA_INPUT;
RTC_SDA_H;
RTC_Wait();
RTC_SCL_H;
while(RTC_SDA == 1)
{
cnt++;
if(cnt > 250) return FALSE;
}
RTC_SCL_L;
return TRUE;
}
/************MCU?<3F><>SD2058<35><38><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>???<3F><>??<3F><>*************/
void RTC_SendByte(uint8_t demand)
{
uint8_t i = 8;
RTC_SDA_OUTPUT;
while(i--)
{
RTC_SCL_L;
__nop();__nop();
if(demand & 0x80) RTC_SDA_H;
else RTC_SDA_L;
demand <<= 1;
RTC_Wait();
RTC_SCL_H;
RTC_Wait();
}
RTC_SCL_L;
}
/*********MCU<43>䨮SD2058?<3F><><EFBFBD><EFBFBD>?<3F><>?<3F><>??<3F><>*********/
uint8_t RTC_ReceiveByte(void)
{
uint8_t i = 8;
uint8_t data = 0;
RTC_SDA_INPUT;
RTC_SDA_H;
while(i--)
{
data <<= 1;
RTC_SCL_L;
RTC_Wait();
RTC_SCL_H;
RTC_Wait();
if(RTC_SDA != 0) data |= 0x01;
}
RTC_SCL_L;
return data;
}
/******RTCD<43>䨰???<3F><>??<3F><>******/
uint8_t RTC_WriteOneByte(uint8_t DeviceAddress,uint8_t add,uint8_t data)
{
RTC_Start();
RTC_SendByte(DeviceAddress);
RTC_WaitAck();
RTC_SendByte(add);
RTC_WaitAck();
RTC_SendByte(data);
RTC_WaitAck();
RTC_Stop();
return TRUE;
}
/******RTC?<3F><><EFBFBD><EFBFBD>???<3F><>??<3F><>******/
uint8_t RTC_ReadOneByte(uint8_t DeviceAddress,uint8_t add)
{
uint8_t date = 0;
RTC_Start();
RTC_SendByte(DeviceAddress);
if(!RTC_WaitAck()){RTC_Stop(); return FALSE;}
RTC_SendByte(add);
RTC_WaitAck();
RTC_Start();
RTC_SendByte(DeviceAddress+1);
RTC_WaitAck();
date = RTC_ReceiveByte();
RTC_NoAck();
RTC_Stop();
return date;
}
/******D<><44>SD2058?<3F><>D<EFBFBD><44>3<EFBFBD><33>D<EFBFBD><44>******/
uint8_t RTC_WriteTimeOn(void)
{
if(!RTC_WriteOneByte(RTC_Address,0x10,0x80))return FALSE;
RTC_WriteOneByte(RTC_Address,0x0f,0x84);
return TRUE;
}
/******D<><44>SD2058???13<31><33>D<EFBFBD><44>******/
uint8_t RTC_WriteTimeOff(void)
{
if(!RTC_WriteOneByte(RTC_Address,0x0f,0))return FALSE;
RTC_WriteOneByte(RTC_Address,0x10,0);
return TRUE;
}
/******<2A><><EFBFBD><EFBFBD>??SD2058<35><38><EFBFBD><EFBFBD>?<3F><>?D???Y<><59>?3<><33>D<EFBFBD><44>?Y<><59>?******/
void RTC_WriteALARM(void) //<2F><><EFBFBD><EFBFBD>??<3F><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??<3F><>o2015?<3F><>2??14<31><34>? 8<><38>o00
{ //??<3F><>D<EFBFBD><44><EFBFBD><EFBFBD>???<3F><EFBFBD><E4A8A4><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>??2?<3F><>DD<44><44>
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x09,0x08); //8<><38><EFBFBD><EFBFBD>
RTC_WriteOneByte(RTC_Address,0x0b,0x14); //14<31><34>?
RTC_WriteOneByte(RTC_Address,0x0c,0x02); //02??
RTC_WriteOneByte(RTC_Address,0x0d,0x15); //15?<3F><>
RTC_WriteOneByte(RTC_Address,0x0e,0x74); //<2F><><EFBFBD><EFBFBD>??<3F><><EFBFBD><EFBFBD>?<3F><>?<3F><>D<EFBFBD><44><EFBFBD><EFBFBD><EAA1A7>1?<3F><>?<3F><>?<3F><>???<3F>騨??<3F><>D?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>?
RTC_WriteOneByte(RTC_Address,0x10,0x92); //<2F><><EFBFBD><EFBFBD>??INT?D????<3F><><EFBFBD><EFBFBD><EFBFBD>ꡧINTS1<53><31>?INTS0<53><30>?<3F><>??<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><>?D??<3F><><EFBFBD><EFBFBD>?<3F><>D<EFBFBD><44>??<3F>ꡧINTAE<41><45>?
RTC_WriteTimeOff();
}
/******1?<3F><>?SD2058<35><38><EFBFBD><EFBFBD>?<3F><>?D??3<><33>D<EFBFBD><44>******/
void RTC_ClrALARM(void) //1?<3F><>?<3F><><EFBFBD><EFBFBD>?<3F><>?D??
{
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x10,0x90);
RTC_WriteTimeOff();
}
/******<2A><><EFBFBD><EFBFBD>??SD2058<35><38>1??<3F><><EFBFBD><EFBFBD>?D???Y<><59>?******/
void RTC_SetDjs(void) //<2F><><EFBFBD><EFBFBD>??<3F><>1??<3F><><EFBFBD><EFBFBD>?D??
{
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x10,0x0f);//?<3F><>??<3F><>1??<3F><><EFBFBD><EFBFBD>?D??<3F><><EFBFBD><EFBFBD>?<3F><>D<EFBFBD><44>??<3F>ꡧINTDE<44><45>?
RTC_WriteOneByte(RTC_Address,0x10,0xf4);//<2F><><EFBFBD><EFBFBD>???<3F><>?<3F><>D??D??<3F>ꡧIM=1<><31>?INT?D????<3F><><EFBFBD><EFBFBD><EFBFBD>ꡧINTS1<53><31>?INTS0<53><30>?<3F><>?????<3F><>1??<3F><><EFBFBD><EFBFBD>?D??<3F><><EFBFBD><EFBFBD>?<3F><>D<EFBFBD><44>??<3F>ꡧINTDE<44><45>?
RTC_WriteOneByte(RTC_Address,0x11,0x30);//?????<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><>?<3F><>?<3F><>?<3F><><EFBFBD>ꡧTDS1?<3F><>TDS0<53><30>??a1/60HZ
RTC_WriteOneByte(RTC_Address,0x13,0x05);//<2F><>1??<3F><><EFBFBD><EFBFBD>3??<3F><>??<3F><>??<3F>¡<EFBFBD>?<3F><><EFBFBD><EFBFBD>??8??<3F><>1??<3F><><EFBFBD><EFBFBD>??<3F><>y3??<3F>̡ꡧ5min<69><6E>?
RTC_WriteTimeOff();
}
/******1?<3F><>?SD2058<35><38>1??<3F><><EFBFBD><EFBFBD>?D??3<><33>D<EFBFBD><44>******/
void RTC_ClrDjs(void)
{
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x10,0xf0);
RTC_WriteTimeOff();
}
/******<2A><><EFBFBD><EFBFBD>??SD2058?<3F><>?<3F><>?D???Y<><59>?******/
void RTC_SetFrq(void)
{
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x10,0xa1); //??<3F><><EFBFBD><EFBFBD>?<3F><>?<3F><>?D??<3F>ꡧINTS1<53><31>?INTS0<53><30>?<3F><>?<3F><><EFBFBD><EFBFBD>???<3F><>?<3F><>?D??<3F><><EFBFBD><EFBFBD>?<3F><>D<EFBFBD><44>??<3F>ꡧINTFE<46><45>?
RTC_WriteOneByte(RTC_Address,0x11,0x09); //<2F><><EFBFBD><EFBFBD>??2Hz?<3F><>?<3F><>?D??
RTC_WriteTimeOff();
}
/******1?<3F><>?SD2058?<3F><>?<3F><>?D??******/
void RTC_ClrFrq(void)
{
RTC_WriteTimeOn();
RTC_WriteOneByte(RTC_Address,0x10,0xa0);
RTC_WriteTimeOff();
}
//|************IIC<49><43>?D??<3F><>?<3F><>??<3F><>??<3F><>************|
uint8_t RTCReadSerial(uint8_t DeviceAddress, uint8_t Address, uint8_t len,uint8_t *ps)
{
uint8_t i;
RTC_Start();
RTC_SendByte(DeviceAddress);
if(!RTC_WaitAck()){RTC_Stop(); return FALSE;}
RTC_SendByte(Address); //<2F><><EFBFBD><EFBFBD>??<3F><>a?<3F><><EFBFBD><EFBFBD>?<3F><>??<3F><>
RTC_WaitAck();
RTC_Start();
RTC_SendByte(DeviceAddress+1);
RTC_WaitAck();
for(i=0;i<len-1;i++,ps++)
{
*ps=RTC_ReceiveByte(); //?<3F><><EFBFBD><EFBFBD>y?Y
RTC_Ack();
}
*ps=RTC_ReceiveByte();
RTC_NoAck();
RTC_Stop();
return TRUE;
}
//|******************IIC<49><43>?D?D<><44>?<3F><>??<3F><>??<3F><>******************|
uint8_t RTCWriteSerial(uint8_t DeviceAddress, uint8_t Address, uint8_t len,uint8_t *ps)
{
uint8_t i;
if(!RTC_WriteTimeOn()) return FALSE;
RTC_Start();
RTC_SendByte(DeviceAddress); //?<3F><>?t<><74>??<3F><>
RTC_WaitAck();
RTC_SendByte(Address); //<2F><><EFBFBD><EFBFBD>???e<><65>?<3F><>??<3F><>
RTC_WaitAck();
for(i=0;i<len;i++)
{
RTC_SendByte(*(ps++));
RTC_Ack();
}
RTC_Stop();
RTC_WriteTimeOff();
return TRUE;
}
#if (USE_CORE_TYPE == 1) //<2F><>1<EFBFBD><31>?C1Fo?D?<3F><>?
uint8_t RTC_ReadDate(S_RTC *psRTC)
{
if(g_time_info.time_select == 0x02){
/* CSIOʱ<4F><CAB1><EFBFBD><EFBFBD>ȡ <20><>ʼ*/
psRTC->year = MCU_RTC_Data.year;
psRTC->month = MCU_RTC_Data.month;
psRTC->day = MCU_RTC_Data.day;
psRTC->hour = MCU_RTC_Data.hour;
psRTC->minute = MCU_RTC_Data.minute;
psRTC->second = MCU_RTC_Data.second;
psRTC->week = MCU_RTC_Data.week;
/* CSIOʱ<4F><CAB1><EFBFBD><EFBFBD>ȡ <20><><EFBFBD><EFBFBD>*/
}else{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ <20><>ʼ */
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰʱ<C7B0><CAB1>+<2B><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
uint32_t rtc_tick = 0;
rtc_tick = RTC_Conversion_To_Unix(&Net_RTC_Data);
//rtc_tick += rtc_hour*3600+rtc_min*60+rtc_sec;
rtc_tick += SysTick_1s - g_time_info.Mcu_GetTime_tick;
Unix_Conversion_To_RTC(psRTC,rtc_tick);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ <20><><EFBFBD><EFBFBD> */
}
return 0;
}
uint8_t RTC_WriteDate(S_RTC SetRTC)
{
MCU_RTC_Data.year = SetRTC.year;
MCU_RTC_Data.month = SetRTC.month;
MCU_RTC_Data.day = SetRTC.day;
MCU_RTC_Data.hour = SetRTC.hour;
MCU_RTC_Data.minute = SetRTC.minute;
MCU_RTC_Data.second = SetRTC.second;
MCU_RTC_Data.week = SetRTC.week;
// g_time_info.Mcu_GetTime_tick = SysTick_1s; //<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
return 0;
}
uint8_t NetRTC_WriteDate(S_RTC SetRTC)
{
Net_RTC_Data.year = SetRTC.year;
Net_RTC_Data.month = SetRTC.month;
Net_RTC_Data.day = SetRTC.day;
Net_RTC_Data.hour = SetRTC.hour;
Net_RTC_Data.minute = SetRTC.minute;
Net_RTC_Data.second = SetRTC.second;
Net_RTC_Data.week = SetRTC.week;
g_time_info.Mcu_GetTime_tick = SysTick_1s; //<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
return 0;
}
#elif (USE_CORE_TYPE == 2) //<2F><>1<EFBFBD><31>?C1o?D?<3F><>?
/******?<3F><>SD2058<35><38><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>y?Y??<3F><>??<3F><>******/
uint8_t RTC_ReadDate(S_RTC *psRTC)
{
RTC_Start();
RTC_SendByte(RTC_Address+1);
if(!RTC_WaitAck()){RTC_Stop(); return FALSE;}
psRTC->second=RTC_ReceiveByte();
RTC_Ack();
psRTC->minute=RTC_ReceiveByte();
RTC_Ack();
psRTC->hour=RTC_ReceiveByte()&0x7F;
RTC_Ack();
psRTC->week=RTC_ReceiveByte();
RTC_Ack();
psRTC->day=RTC_ReceiveByte();
RTC_Ack();
psRTC->month=RTC_ReceiveByte();
RTC_Ack();
psRTC->year=RTC_ReceiveByte();
RTC_NoAck();
RTC_Stop();
return TRUE;
}
/******D<><44>SD2058<35><38><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>y?Y??<3F><>??<3F><>******/
//D<><EFBFBD><E4A8BA>??2<><32><EFBFBD><EFBFBD><EFBFBD>¨<EFBFBD>a?<3F><><EFBFBD><EFBFBD>?<3F><>???<3F><><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>????<3F><>??<3F><>(00H~06H)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?D<>䨨?<3F><>?
//2??<3F><><EFBFBD><EFBFBD>?<3F>̣<EFBFBD>?<3F><>??7??<3F><><EFBFBD><EFBFBD>??<3F><>y?Y?D<><44>??3<><33>?????DDD<44><44>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>??<3F><>?<3F><>?<3F><>?<3F><><EFBFBD><EFBFBD>y?e<><65><EFBFBD><EFBFBD>??<3F><>y?Y<><59>?<3F>䨪?<3F><>????.
//<2F><>aDT?????D?3<><33>???<3F><>y?Y , <20><>|<7C><>?<3F><>?D?D<>䨨?<3F><>?2? 7 ??<3F><><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>y?Y.
uint8_t RTC_WriteDate(S_RTC SetRTC)
{
S_RTC *psRTC;
psRTC=&SetRTC;
RTC_WriteTimeOn(); //<2F><>1?<3F><><EFBFBD><EFBFBD>??a??
RTC_Start();
RTC_SendByte(RTC_Address);
if(!RTC_WaitAck()){RTC_Stop(); return FALSE;}
RTC_SendByte(0x00); //<2F><><EFBFBD><EFBFBD>??D<><44>?e<><65>?<3F><>??<3F><>
RTC_WaitAck();
RTC_SendByte(psRTC->second); //second
RTC_WaitAck();
RTC_SendByte(psRTC->minute); //minute
RTC_WaitAck();
RTC_SendByte(psRTC->hour|0x80); //hour ,<2C><>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??D?<3F><><EFBFBD><EFBFBD>??<3F><>??<3F>¡<EFBFBD>?????<3F>ꡧ0<EAA1A7><30>o?a12D?<3F><><EFBFBD><EFBFBD>??<3F><>?1<><31>o?a24D?<3F><><EFBFBD><EFBFBD>??<3F><>?
RTC_WaitAck();
RTC_SendByte(psRTC->week); //week
RTC_WaitAck();
RTC_SendByte(psRTC->day); //day
RTC_WaitAck();
RTC_SendByte(psRTC->month); //month
RTC_WaitAck();
RTC_SendByte(psRTC->year); //year
RTC_WaitAck();
RTC_Stop();
RTC_WriteTimeOff(); //<2F><>1?<3F><><EFBFBD><EFBFBD>?1???
return TRUE;
}
#endif
/*1S?<3F><><EFBFBD><EFBFBD>?<3F><>?<3F><>?*/
void RTC_TASK(void)
{
static uint32_t RTC_Tick = 0;
static uint8_t r_minute = 0; //2025-12-09 <20>޸ĵ<DEB8><C4B5><EFBFBD><EFBFBD><EFBFBD>CSIO<49><4F>ȡʱ<C8A1><CAB1>ʱ<EFBFBD><CAB1>Log_Time_ms<6D>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ʱ<D6BE><EFBFBD><E4B2BB>ȷ
if(SysTick_1ms - RTC_Tick >= 1000)
{
RTC_Tick = SysTick_1ms;
RTC_ReadDate(&RTC_Raw_Data);
if(r_minute != RTC_Raw_Data.minute)
{
r_minute = RTC_Raw_Data.minute;
Log_Time_ms = SysTick_1ms;
}
if(server_info.sync_tick==0x01)
{
server_info.sync_tick = 0x02;
}
}
}
/*******************************************************************************
* Function Name : RTC_TimeDate_Correct_Figure
* Description : RTCʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> A~F
* Return : 0x00:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x01:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD>ȷ
*******************************************************************************/
uint8_t RTC_TimeDate_Correct_Figure(uint8_t data){
uint8_t temp_num = data;
if( ((temp_num & 0x0F) < 0x0A) ){
temp_num >>= 4;
if( ((temp_num & 0x0F) < 0x0A) ){
return 0x00;
}
}
return 0x01;
}
/*******************************************************************************
* Function Name : HEX_data_conversion_to_DEC
* Description : ??<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>????<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>y?Y<EFBFBD><EFBFBD>a???a<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>y?Y 0x20 -> 20
* Return : None
*******************************************************************************/
uint8_t HEX_Conversion_To_DEC(uint8_t c_num)
{
uint8_t rev_num = 0;
rev_num = (c_num/16)*10 + (c_num%16);
return rev_num;
}
/*******************************************************************************
* Function Name : HEX_data_conversion_to_DEC
* Description : ??<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>y?Y<EFBFBD><EFBFBD>a???a<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>????<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>y?Y 20 -> 0x20
* Return : None
*******************************************************************************/
uint8_t DEV_Conversion_To_HEX(uint8_t c_num)
{
uint8_t rev_num = 0;
rev_num = (c_num/10)*16 + (c_num%10);
return rev_num;
}
/*******************************************************************************
* Function Name : RTC_Conversion_To_UTC
* Description : ??RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??<EFBFBD><EFBFBD>a?<EFBFBD><EFBFBD>?aUTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??
* Return : None
*******************************************************************************/
uint32_t RTC_Conversion_To_Unix(S_RTC *rtc_time)
{
uint32_t timestamp = 0;
struct tm test_time;
// Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"RTC<54><43><EFBFBD><EFBFBD>??: 20%X-%X-%X %X:%X:%X D??<3F><>%X\r\n",rtc_time->year,rtc_time->month,rtc_time->day,rtc_time->hour,rtc_time->minute,rtc_time->second,rtc_time->week);
test_time.tm_year = HEX_Conversion_To_DEC(rtc_time->year) + 2000 - 1900;
if(rtc_time->month != 0x00)
{
test_time.tm_mon = HEX_Conversion_To_DEC(rtc_time->month) - 1;
}else {
test_time.tm_mon = 1;
}
test_time.tm_mday = HEX_Conversion_To_DEC(rtc_time->day);
test_time.tm_hour = HEX_Conversion_To_DEC(rtc_time->hour);
test_time.tm_min = HEX_Conversion_To_DEC(rtc_time->minute);
test_time.tm_sec = HEX_Conversion_To_DEC(rtc_time->second);
test_time.tm_isdst = -1;
timestamp = mktime(&test_time); //?a<><61>a?<3F><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>??<3F><>?UTC<54><43><EFBFBD><EFBFBD>??<3F>
/*<2A><><EFBFBD><EFBFBD>??<3F><><EFBFBD><EFBFBD>???1D<31><44><EFBFBD><EFBFBD>a??<3F><><EFBFBD><EFBFBD>8D?<3F><><EFBFBD><EFBFBD>*/
timestamp -= 8*3600;
return timestamp;
}
/*******************************************************************************
* Function Name : UTC_Conversion_To_RTC
* Description : ??UTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??<EFBFBD><EFBFBD>a?<EFBFBD><EFBFBD>?aRTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??
* Return : None
*******************************************************************************/
void Unix_Conversion_To_RTC(S_RTC *rtc_time,uint32_t utc_tick)
{
uint8_t temp = 0;
time_t temp_tick = utc_tick + 8*3600; /*<2A><><EFBFBD><EFBFBD>??<3F><><EFBFBD><EFBFBD>??????3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??1D<31><44><EFBFBD><EFBFBD>a?<3F><><EFBFBD><EFBFBD>?8D?<3F><><EFBFBD><EFBFBD>*/
struct tm *test_time;
test_time = localtime(&temp_tick);
temp = ( 1900 + test_time->tm_year ) - 2000;
rtc_time->year = DEV_Conversion_To_HEX(temp);
temp = 1 + test_time->tm_mon;
rtc_time->month = DEV_Conversion_To_HEX(temp);
temp = test_time->tm_mday;
rtc_time->day = DEV_Conversion_To_HEX(temp);
temp = test_time->tm_hour;
rtc_time->hour = DEV_Conversion_To_HEX(temp);
temp = test_time->tm_min;
rtc_time->minute = DEV_Conversion_To_HEX(temp);
temp = test_time->tm_sec;
rtc_time->second = DEV_Conversion_To_HEX(temp);
temp = test_time->tm_wday;
rtc_time->week = DEV_Conversion_To_HEX(temp);
// strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", test_time);
// Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"%s",tmpbuf);
// Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"RTC<54><43><EFBFBD><EFBFBD>??: 20%X-%X-%X %X:%X:%X D??<3F><>%X\r\n",rtc_time->year,rtc_time->month,rtc_time->day,rtc_time->hour,rtc_time->minute,rtc_time->second,rtc_time->week);
}