578 lines
15 KiB
C
578 lines
15 KiB
C
|
|
#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);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|