📄 hart1151.c
字号:
void JustWR(void)
{
tag.FlashType=66; // 该段flash文件的类型,int or float
tag.FlashSize=30; // 该段文件的大小,以字节为单位
tag.FlashData=1; // flash写的版本
tag.FlashMonth=0; // flash写的版本
tag.Crc=56;//校验位
tag.Reserved=0;
//WriteTest();
//ReadFlash();
}
//-------------------------------
//
//-------------------------------
void FWrite_Modulus(volatile char *flashsegment,unsigned char *point,int Num,unsigned char startlocation)//源地址、写字节大小、起始偏移地址
{
int i;
for(i=startlocation;i<startlocation+Num;i++)
{
*(flashsegment+i)=*(point+i-TagLength); //写入FLASH中
}
}
//-------------------------------
//
//-------------------------------
void Write_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
int i;
unsigned char *p,*p1;
p=pointtag;
//p1=(unsigned char*)&EEP_RamT.Messenger[0];
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL2=(FWKEY+FSSEL_1+FN2); //mclk 2div
FCTL1=0XA540; //允许编程
//FCTL1=0XA502; //选择段擦除
//*modulus=0; //选择擦除段号
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
//FCTL1=0XA540; //允许编程
for(i=0;i<TagLength;i++)
{
*(flashsegment+i)=*(p+i); //tag写入FLASH中
}
//---------------------------------
p1=point;
FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
/*for(i=TagLength;i<WriteNum+TagLength;i++)
{
*(modulus+i)=*(p1+i-TagLength); //写入FLASH中
*(p2+i)=*(p1+i);
} */
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //重开中断
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void IniWrite_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
int i;
unsigned char *p,*p1;//,*p2
//p=(unsigned char*)&tag.FlashType;
//p=(unsigned char*)&tag;
p=pointtag;
//p2=(unsigned char*)&testflashtem;
//p1=(unsigned char*)&EEP_RamT.Messenger[0];
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL2=(FWKEY+FSSEL_1+FN2); //mclk 2div
FCTL1=0XA540; //允许编程
//FCTL1=0XA502; //选择段擦除
//*modulus=0; //选择擦除段号
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
//FCTL1=0XA540; //允许编程
for(i=0;i<TagLength;i++)
{
*(flashsegment+i)=*(p+i); //tag写入FLASH中
//*(p2+i)=*(p+i);
}
//---------------------------------
///p1=(unsigned char*)&EEP_DataStaticF;
p1=point;
///FWrite_Modulus(flashsegment,p1,sizeof(EEP_DataStaticF),TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
/*for(i=TagLength;i<WriteNum+TagLength;i++)
{
*(modulus+i)=*(p1+i-TagLength); //写入FLASH中
*(p2+i)=*(p1+i);
} */
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //重开中断
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void Read_Modulus(volatile char *flashsegment,unsigned char *point,int Num,unsigned char *pointtag)//源地址、写字节大小
{
//unsigned char *p,*p1;
int i;
//p=flashsegment;
//p1=(unsigned char*)&testflashtem;
//p1=(unsigned char*)&EEP_Ram;
//p1=point;
for(i=0;i<TagLength;i++)
{
//*(p+i)=*(flashsegment+i);
*(pointtag+i)=*(flashsegment+i);
}
for(i=TagLength;i<Num+TagLength;i++)
{
*(point+i-TagLength)=*(flashsegment+i);
}
}
//-------------------------------
//
//-------------------------------
void Write_Parameter(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
int i;
unsigned char *p,*p1;
///p=(unsigned char*)&tag_p;
p=pointtag;
//p1=(unsigned char*)&EEP_RamT.Messenger[0];
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL2=(FWKEY+FSSEL_1+FN2); //mclk 2div
FCTL1=0XA540; //允许编程
//FCTL1=0XA502; //选择段擦除
//*modulus=0; //选择擦除段号
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
//FCTL1=0XA540; //允许编程
for(i=0;i<TagLength;i++)
{
*(flashsegment+i)=*(p+i); //tag写入FLASH中
}
//---------------------------------
///p1=(unsigned char*)&EEP_RamT;
p1=point;
FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
/*for(i=TagLength;i<WriteNum+TagLength;i++)
{
*(modulus+i)=*(p1+i-TagLength); //写入FLASH中
*(p2+i)=*(p1+i);
} */
//while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //重开中断
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void IniWrite_Parameter(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
int i;
unsigned char *p,*p1;
///p=(unsigned char*)&tag_p;
p=pointtag;
//p1=(unsigned char*)&EEP_RamT.Messenger[0];
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL1=0XA540; //允许编程
FCTL1=0XA502; //选择段擦除
*flashsegment=0; //选择擦除段号
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
FCTL1=0XA540; //允许编程
//---------------------------------//tag初始化
//tag_p.FlashType=88; // 该段flash文件的类型,int or float
//tag_p.FlashSize=sizeof(EEP_Ram); // 该段文件的大小,以字节为单位
//tag_p.FlashData=1; // flash写的版本
//tag_p.FlashMonth=0; // flash写的版本
//tag_p.Crc=56;//校验位
//tag_p.Reserved=0;
//---------------------------------
for(i=0;i<TagLength;i++)
{
*(flashsegment+i)=*(p+i); //tag写入FLASH中
}
//---------------------------------
//p1=(unsigned char*)&EEP_DataStatic;
p1=point;
FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
/*for(i=TagLength;i<WriteNum+TagLength;i++)
{
*(modulus+i)=*(p1+i-TagLength); //写入FLASH中
*(p2+i)=*(p1+i);
} */
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //重开中断
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
}
void Defualt_init(void)
{
BurstCmd=2;
PreamNum=10;//
//SAddr=0;
Addr[0]=MFR_Rosemount;Addr[1]=Type_1151;
//Addr[2]=9;
//Addr[3]=1;
//Addr[4]=1;
Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
//if(tag.FlashType==66)
//if(EEP_Ram.PvDamp==1)
if(EEP_Ram.Tag==6)
{
//数据正确
//Read_Modulus(modulus,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
}
else
{
///Read_Modulus(modulus,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
/*if(tag_re.FlashType==56)//不是第一次读取
{
恢复备份数据到原始数据内
tag.FlashType=tag_re.FlashType; // 该段flash文件的类型,int or float
tag.FlashSize=tag_re.FlashSize; // 该段文件的大小,以字节为单位
tag.FlashData=tag_re.FlashData=2; // flash写的版本
tag.FlashMonth=tag_re.FlashMonth; // flash写的版本
tag.Crc=tag_re.Crc;//校验位
tag.Reserved=tag_re.Reserved;
//抬高当前电流
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
Flash_Clear(modulus);
IniWrite_Modulus(modulus,(unsigned char*)&modulus_re,(unsigned char*)&tag,sizeof(EEP_Ram_re));
///IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_Ram));
//EEP_Ram.UpSensorLimit=100;
//EEP_Ram.A4=99;
//Write_Modulus();
//Read_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char Num,unsigned char *pointtag)//源地址、写字节大小
Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
//needwrite_modulus=1;
}
else//初始化当前和备份两个区域*/
{
tag.FlashType=56; // 该段flash文件的类型,int or float =tag_re.FlashType
tag.FlashSize=sizeof(EEP_Ram); // 该段文件的大小,以字节为单位=tag_re.FlashSize
tag.FlashData=0; // flash写的版本=tag_re.FlashData
tag.FlashMonth=0; // flash写的版=tag_re.FlashMonth本
tag.Crc=56;//校验位=tag_re.Crc
tag.Reserved=0;//=tag_re.Reserved
Flash_Clear(modulus);
IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_DataStaticF));
//EEP_Ram.UpSensorLimit=100;
//EEP_Ram.A4=99;
//Write_Modulus();
Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
//needwrite_modulus=1;
//Flash_Clear(modulus_re);
//IniWrite_Modulus(modulus_re,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag_re,sizeof(EEP_DataStaticF));
//Read_Modulus(modulus_re,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
}
}
Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
if(EEP_RamT.Flag==8)
{
//数据正确
//Read_Modulus(parameter,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
}
else
{
/*Read_Modulus(parameter,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
if(tag_rep.FlashType==65)//不是第一次读取
{
//恢复备份数据到原始数据内
tag_p.FlashType=tag_rep.FlashType; // 该段flash文件的类型,int or float
tag_p.FlashSize=tag_rep.FlashSize; // 该段文件的大小,以字节为单位
tag_p.FlashData=tag_rep.FlashData=2; // flash写的版本
tag_p.FlashMonth=tag_rep.FlashMonth; // flash写的版本
tag_p.Crc=tag_rep.Crc;//校验位
tag_p.Reserved=tag_rep.Reserved;
//抬高当前电流
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
DA_DataOut(2000);
Flash_Clear(parameter);
IniWrite_Parameter(parameter,(unsigned char*)¶meter_re,(unsigned char*)&tag_p,sizeof(EEP_RamT_re));
//EEP_Ram.UpSensorLimit=100;
//EEP_Ram.A4=99;
//Write_Modulus();
//Read_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char Num,unsigned char *pointtag)//源地址、写字节大小
Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
//needwrite_modulus=1;
}
else//初始化当前和备份两个区域*/
{
tag_p.FlashType=65; // 该段flash文件的类型,int or float =tag_rep.FlashType
tag_p.FlashSize=sizeof(EEP_RamT); // 该段文件的大小,以字节为单位=tag_rep.FlashSize
tag_p.FlashData=0; // flash写的版本=tag_rep.FlashData
tag_p.FlashMonth=0; // flash写的版本=tag_rep.FlashMonth
tag_p.Crc=56;//校验位=tag_rep.Crc
tag_p.Reserved=0;//=tag_rep.Reserved
Flash_Clear(parameter);
//IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_DataStaticF));
IniWrite_Parameter(parameter,(unsigned char*)&EEP_DataStatic,(unsigned char*)&tag_p,sizeof(EEP_RamT));
//EEP_Ram.UpSensorLimit=100;
//EEP_Ram.A4=99;
//Write_Modulus();
Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
//needwrite_modulus=1;
//Flash_Clear(parameter_re);
//IniWrite_Parameter(parameter_re,(unsigned char*)&EEP_DataStatic,(unsigned char*)&tag_rep,sizeof(EEP_RamT_re));
//Read_Modulus(parameter_re,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
}
//tag_p.FlashType=65; // 该段flash文件的类型,int or float
//tag_p.FlashSize=sizeof(EEP_RamT); // 该段文件的大小,以字节为单位
//tag_p.FlashData=0; // flash写的版本
//tag_p.FlashMonth=0; // flash写的版本
//tag_p.Crc=56;//校验位
//tag_p.Reserved=0;
//Flash_Clear(parameter);
//IniWrite_Parameter();
//Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
}
//----------------------------//old
Addr[0]=EEP_RamT.Addr[0];
Addr[1]=EEP_RamT.Addr[1];
Addr[2]=EEP_RamT.Addr[2];
Addr[3]=EEP_RamT.Addr[3];
Addr[4]=EEP_RamT.Addr[4];
SAddr=EEP_RamT.SAddr;
PreamNum=EEP_RamT.WDELM_Num=10;//
Write_p=EEP_RamT.WriteProt;
//EEP_Ram.SensorS=SensorArry[2];
DAV_KB(EEP_RamT.DAHalfCode,EEP_RamT.DAZeroCode,12,4,1);//计算DA输出的斜率和截距//4-12
DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAHalfCode,20,12,2);//计算DA输出的斜率和截距12-20
BaseDAk=EEP_Ram.DANk;
BaseDAb=EEP_Ram.DANb;
/*if(EEP_Ram.TempZeroA==EEP_Ram.TempZeroB==EEP_Ram.TempZeroC==0)
{
EEP_Ram.TempZeroD=EEP_RamT.X0;
}
if(EEP_Ram.TempFullA==EEP_Ram.TempFullB==EEP_Ram.TempFullC==0)
{
EEP_Ram.TempFullD=EEP_RamT.Xs;
}*/
//TempLine(60,30,EEP_RamT.TempFull,EEP_RamT.TempZero);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -