📄 manage_rtc.c
字号:
////////////////////////////////////////////////////
#include "manage_RTC.h"
////////////////////////////////////////////////////
rom const unsigned char DBL_PARA[]= //双备份数据长度表
{
59,8,4,6,42,0
};
////////////////////////////////////////////////////
void manage_RTC(void) //RTC管理模块
{
union UNI_UINT16 uni1;
signed char temp;
unsigned char i,j,pt[3],para[2];
unsigned int addr;
if (!_UINT8_RSTflagbits.RTC)
{
//模块初始化
_UINT8_RSTflagbits.RTC=1; //置RTC管理模块复位标志
_UINT8_CLOCK[UINT8_RTC][0]=0x50; //清零RTC管理模块时钟
_UINT8_CLOCK[UINT8_RTC][1]=0;
}
//模块正常运行
_UINT8_SLEEPflagbits.RTC=0;
if (_UINT8_CLOCK[UINT8_RTC][0]>=0x25)
{
//250ms读一次RTC
Read_RTC();
//历史数据转存
if (!_UINT8_RTC[0] && !_UINT8_RTC[1])
{
ReadFRAM(FRAM1_AMRD,para,2); //读自动抄表日时
if (_UINT8_RTC[2]>=para[0] && _UINT8_RTC[4]>=para[1])
{
j=_UINT8_RTC[5];
ReadFRAM(FRAM2_HKWHPT1,pt,2); //读当前历史记录指针
if (j!=pt[0])
{
//数据转存
pt[1]%=3;
//转存电能记录
SaveHistory(FRAM1_PKWH,FRAM2_HKWH1+pt[1]*32,32);
pt[0]=j;
pt[1]=(pt[1]+1)%3;
WriteFRAM(FRAM2_HKWHPT1,pt,2); //写当前历史记录指针
}
}
}
//零点1分进行双份数据的校验、修正
if (!_UINT8_RTC[0] && _UINT8_RTC[1]==1 && !_UINT8_RTC[2])
{
i=0;
j=0;
addr=FRAM1_AVRMSGAIN;
while (DBL_PARA[i])
{
ReadFRAM(addr,pt,DBL_PARA[i]);
uni1.uint16=table_crc(pt,DBL_PARA[i]-2);
if (uni1.low!=pt[DBL_PARA[i]-2] || uni1.high!=pt[DBL_PARA[i]-1]) j|=0b00000001; //第1份错误
ReadFRAM(addr+FRAM1_OFFSET,pt,DBL_PARA[i]);
uni1.uint16=table_crc(pt,DBL_PARA[i]-2);
if (uni1.low!=pt[DBL_PARA[i]-2] || uni1.high!=pt[DBL_PARA[i]-1]) j|=0b00000010; //第2份错误
if (j==0b00000001)
{
WriteFRAM(addr,pt,DBL_PARA[i]); //用第2份修复第1份
}
if (j==0b00000010)
{
ReadFRAM(addr,pt,DBL_PARA[i]);
WriteFRAM(addr+FRAM1_OFFSET,pt,DBL_PARA[i]); //用第1份修复第2份
}
addr+=DBL_PARA[i];
i++;
}
}
_UINT8_CLOCK[UINT8_RTC][0]=0; //清零RTC管理模块时钟
_UINT8_CLOCK[UINT8_RTC][1]=0;
}
}
////////////////////////////////////////////////////
void SaveHistory(unsigned int addr1,unsigned int addr2,unsigned char len) //历史数据转存
{
unsigned char pt[32];
ReadFRAM(addr1,pt,len);
WriteFRAM(addr2,pt,len);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -