📄 checkmode.c
字号:
/*************************************************************************************
文件类型:
文件作用:对flash进行擦除操作
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.11.24
当前版本:Ver0.1
版本信息:Ver0.1
**************************************************************************************/
#include "Tiger.h"
extern unsigned char recover_item(unsigned int flashaddr,unsigned int ramaddr,unsigned char num);
extern void Recover_meter(void);
struct check_struct //参数地址列表
{ unsigned int flashaddr; //参数在flash中的地址
unsigned int id_data; //ID号
unsigned char num; //参数在flash中的长度
};
const struct check_struct code check_addrtalbe[]=
{ {FL_canshu01+130,ID_PRIOXUL ,3}, //需量参数
{FL_canshu01+133,ID_CHANGSHU,4}, //脉冲常数
{FL_canshu01+137,ID_BANTRATA,2}, // 波特率
{FL_canshu01+139,ID_COMADDR,7}, //表号
{FL_canshu01+146,ID_GATCUTPOW,4}, //是呀门限
{FL_canshu01+150,ID_GATLOSTCUR,4}, //失流门限
{FL_canshu01+154,ID_TIMERETUN,2}, //轮显时间
{FL_canshu01+156,ID_PRIOCOSENG,2} //功率因数计量周期
};
//======================================================================
//函数功能:对check模块进行初始化
//
//======================================================================
void Ini_checkmode(void)
{ unsigned char i;
flag_runcheckmode=0;
flag_mincheck=RTCTIME.rMinute;
for(i=0;i<16;i++)
count_flagereas[i]=0; //清零页擦除等待计数器
times_pllerror=0;
flag_errorflash01.byte=0;
}
//==================================================================
//函数功能:对pll进行渐次
//
//==================================================================
void check_pll(void)
{ unsigned char xdata *p;
p=0x28d3;
if(*p!=0x01)
{ times_pllerror++;
if(times_pllerror>3)
{ times_pllerror=0;
SetPLL(); //开pll电路
}
}
else
times_pllerror=0;
}
//==========================================================
//函数功能:对flash页状态进行检测
//备注:检测到页损坏,置位相应的标志位
//==========================================================
void check_flashpage(void)
{ unsigned char i,temp_flag;
temp_flag=flag_ereasflash01.byte;
for(i=0;i<8;i++)
{ if((temp_flag&0x01)==0x01) //如果该页擦除标志位置位
count_flagereas[i]++; //计数器累加
else
count_flagereas[i]=0; //如果每置位,则清零标志位
if(count_flagereas[i]>10) //如果擦除标志位10钟尚未相应,则该页错误
{ flag_errorflash01.byte=flag_errorflash01.byte|set_bittable[i]; //置位页损坏标志位
count_flagereas[i]=0;
}
temp_flag=temp_flag>>1;
}
/*
temp_flag=flag_ereasflash02.byte;
for(i=0;i<3;i++)
{ if(temp_flag&0x01==0x01) //如果该页擦除标志位置位
count_flagereas[i+8]++; //计数器累加
else
count_flagereas[i+8]=0; //如果每置位,则清零标志位
if(count_flagereas[i+8]>10) //如果擦除标志位10钟尚未相应,则该页错误
{ flag_errorflash02.byte=flag_errorflash02.byte|set_bittable[i]; //置位页损坏标志位
count_flagereas[i+8]=0;
}
temp_flag=temp_flag>>1;
}
*/
}
//==========================================================================
//函数功能:程序自检,对个参数和flash页的状态进行自检
//
//==========================================================================
void check_mode(void)
{ static unsigned char i;
if(flag_runcheckmode==1)
{ flag_runcheckmode=0;
check_flashpage(); //flash每秒检测一次,确定页有没有损坏
check_pll(); //pll电路每秒检测一次
if(flag_mincheck!=RTCTIME.rMinute) //参数每1分钟检测一次
{ if(i<8) //分8次测试数据
{ i++;
}
else
{ i=0;
flag_mincheck=RTCTIME.rMinute;
}
if(i<8)
{ addr_baseonIDandtype(RAM,check_addrtalbe[i].id_data); //取指针
recover_item(check_addrtalbe[i].flashaddr,(*ID_coretalbpoint[0]).dataaddr,check_addrtalbe[i].num);
}
else
Recover_meter();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -