📄 flash.c
字号:
/*
*Copyright(c) 2007
*All rights reserved
*filename: FLASH.c
*current edition 2.0
* 2007-6
*/
unsigned char FLASH_R_BYTE(unsigned char Page,unsigned int F_Addr)
{
unsigned char ch;
EA=0;
F_ADR_2 = ( (portU09Data&0xe0) | Page );//将page送于portU09的低5位
ch=(F_Addr>>8)&0xff;
F_ADR_1 = ch;
ch=F_Addr&0xff;
F_ADR_0 = ch;
F_DATA = FlashCommandReadArray;
_nop_();
_nop_();
ch = F_DATA;
EA=1;
return(ch);
}
unsigned int FLASH_R_UNINT(unsigned char Page, unsigned int F_Addr)
{
unsigned char ch;
unsigned int unIntData;
unIntData=FLASH_R_BYTE(Page,F_Addr);
ch=FLASH_R_BYTE(Page,F_Addr+1);
unIntData=unIntData*256+ch;
return(unIntData);
}
/*
int FLASH_R_INT(unsigned char Page,unsigned int F_Addr)
{
int intData;
unsigned char *ptrUCToInt;
ptrUCToInt=(unsigned char *)&intData;
*ptrUCToInt=FLASH_R_BYTE(Page,F_Addr);
ptrUCToInt++;
*ptrUCToInt=FLASH_R_BYTE(Page,F_Addr+1);
return (intData);
}
unsigned long FLASH_R_UNLOMG(unsigned char Page,unsigned int F_Addr)
{
unsigned char i;
unsigned char *ptrUCToUnLong;
unsigned long unLongData;
ptrUCToUnLong=(unsigned char *)&unLongData;
for (i=0; i<4; i++)
{
*ptrUCToUnLong=FLASH_R_BYTE(Page,F_Addr+i);
ptrUCToUnLong++;
}
return (unLongData);
}
*/
unsigned char FLASH_W_BYTE(unsigned char Page, unsigned int F_Addr, unsigned char Data)
{
unsigned char statusR;
unsigned int i;
unsigned char ch;
EA=0;
F_ADR_2 = ( (portU09Data&0xe0) | Page );//将page送于portU09的低5位
ch=(F_Addr>>8)&0xff;
F_ADR_1 = ch;
ch=F_Addr&0xff;
F_ADR_0 = ch;
F_DATA = FlashCommandWrite;
_nop_();
_nop_();
F_DATA = Data;
_nop_();
_nop_();
F_DATA = FlashCommandStatus;
i=0;
while(i < 60000)
{
//////////
SDA_PCFCAT=0;
SDA_PCFCAT=1;
//////////
i++;
statusR=F_DATA;
ch =statusR & 0x80;
if( ch != 0 ) break;
}
//ch =statusR & 0x10;//通过 statusR 可以检测各种错误
F_DATA = FlashCommandClear;
EA=1;
ch=statusR&0x1a;
return(ch);
}
unsigned char FLASH_W_UNINT(unsigned char Page, unsigned int F_Addr, unsigned int unIntData)
{
unsigned char ch;
unsigned char uncData;
uncData=unIntData >> 8;
ch=FLASH_W_BYTE(Page, F_Addr, uncData);
uncData=unIntData & 0xff;
ch=FLASH_W_BYTE(Page, F_Addr+1, uncData);
return(ch);
}
/*
unsigned char FLASH_W_INT(unsigned char Page, unsigned int F_Addr, int Data)
{
unsigned char *ptrUCToInt;
unsigned char ch;
ptrUCToInt=(unsigned char *)&Data;
ch=FLASH_W_BYTE(Page,F_Addr, *ptrUCToInt);
//if(ch!=0) return(ch);
ptrUCToInt++;
ch=FLASH_W_BYTE(Page,F_Addr+1,*ptrUCToInt);
return(ch);
}
unsigned char FLASH_W_UNLONG(unsigned char Page,unsigned int F_Addr,unsigned long Data)
{
unsigned char i;
unsigned char ch;
unsigned char *ptrUCToUnLong;
ptrUCToUnLong=(unsigned char *)&Data;
for(i=0; i<4; i++)
{
ch=FLASH_W_BYTE(Page,F_Addr, *ptrUCToUnLong);
//if(ch!=0) {return(ch);break;}
ptrUCToUnLong++;
}
return(ch);
}*/
void FLASH_CLR_LOCK(unsigned char Page) // Clear Lock-Bit
{
unsigned char ch;
unsigned int i;
EA=0;
F_ADR_2 = ( (portU09Data&0xe0) | Page );
F_ADR_1 = 0;
F_ADR_0 = 0;
F_DATA = FlashBlockLock_Bits;//0x60
_nop_();
_nop_();
F_DATA = FlashCommandConfirm;//0xD0
_nop_();
_nop_();
F_DATA = FlashCommandStatus; //0x70
i=0;
while(i < 80000)
{
//////////
SDA_PCFCAT=0;
SDA_PCFCAT=1;
//////////
i++;
ch = F_DATA & 0x80;
if( ch != 0 )
break;
}
///////////////////
DecToNo(i, 5);
for (i=0; i<5;i++)
{
Disp(1,1+i,16,8,*(number0+numberArray[i]));
}
///////////////////
F_DATA = FlashCommandClear;
EA=1;
}
void FLASH_BLK_ERASE(unsigned char Page) // Block Erase
{
unsigned char ch;
unsigned int i;
EA=0;
FLASH_CLR_LOCK(Page);
//FLASH_CLR_LOCK(Page);
F_ADR_2 = ( (portU09Data&0xe0) | Page );
F_ADR_1 = 0;
F_ADR_0 = 0;
F_DATA = FlashCommandErase;
F_DATA = FlashCommandConfirm;
F_DATA = FlashCommandStatus;
i=0;
while(i < 60000)
{
//////////
SDA_PCFCAT=0;
SDA_PCFCAT=1;
//////////
i++;
ch = F_DATA & 0x80;
if( ch != 0 ) break;
}
DecToNo(i, 5);
for (i=0; i<5;i++)
{
Disp(1,8+i,16,8,*(number0+numberArray[i]));
}
F_DATA = FlashCommandClear;
EA=1;
}
void FlashRecCurData(void)//存储当前的值
{
// inHourTimes++;
// hourSumDataSO2+=currentDataSO2;
// hourSumDataNO2+=currentDataNO2;
// hourSumDataPM10+=currentDataPM10;
FLASH_W_BYTE(end_CurData_page,last_CurData_Add ,year );
FLASH_W_BYTE(end_CurData_page,last_CurData_Add+1 ,newMonth);
FLASH_W_BYTE(end_CurData_page,last_CurData_Add+2 ,day );
FLASH_W_BYTE(end_CurData_page,last_CurData_Add+3 ,newHour );
FLASH_W_BYTE(end_CurData_page,last_CurData_Add+4 ,minute );
FLASH_W_BYTE(end_CurData_page,last_CurData_Add+5 ,second );//时间
FLASH_W_UNINT(end_CurData_page, last_CurData_Add+6, currentDataSO2 );
FLASH_W_UNINT(end_CurData_page, last_CurData_Add+8, curD_mgPm3 );
// FLASH_W_UNINT(end_CurData_page, last_CurData_Add+8, currentDataNO2 );
// FLASH_W_UNINT(end_CurData_page, last_CurData_Add+10,currentDataPM10);
// record_CurData++;
if (last_CurData_Add >= 0xfff0)
{
last_CurData_Add=0;
end_CurData_page++;
if (end_CurData_page > 30) end_CurData_page=0;
if (end_CurData_page == start_CurData_Page)
{
start_CurData_Page++;
if (start_CurData_Page > 30)
{
start_CurData_Page=0;
flashFullFlg=0xaa;
CAT1021Write(flashFullFlg_SAdd, 0xaa);
}
// record_CurData-=4096;
}
FLASH_BLK_ERASE(end_CurData_page);
CAT1021Write(start_CurData_Page_SAdd, start_CurData_Page);
CAT1021Write(end_CurData_page_SAdd, end_CurData_page );
}
else
{
last_CurData_Add+=16;
}
}
/*
void FlashRecDayAvg(void)//存储日平均值
{
unsigned char i;
unsigned long sumULong;
FLASH_W_BYTE(31, last_DayAvg_Add, catYear );//年
FLASH_W_BYTE(31, last_DayAvg_Add+1, catMonth);//月
FLASH_W_BYTE(31, last_DayAvg_Add+2, catDay );//日//存储日期
if (inDayTimes ==0)
{
FLASH_W_UNINT(31, last_DayAvg_Add+3, currentDataSO2);//SO2日平均值
// FLASH_W_UNINT(31, last_DayAvg_Add+9, currentDataNO2);//NO2日平均值
}
else
{
sumULong=0;
for (i=0; i<24; i++)
{
sumULong+=CAT1021ReadUnInt(TAvg_SO2_SAdd+i*2);
}
FLASH_W_UNINT(31, last_DayAvg_Add+3, sumULong/inDayTimes);//SO2日平均值
sumULong=0;
for (i=0; i<24; i++)
{
sumULong+=CAT1021ReadUnInt(TAvg_NO2_SAdd+i*2);
}
FLASH_W_UNINT(31, last_DayAvg_Add+9, sumULong/inDayTimes);//NO2日平均值
sumULong=0;
for (i=0; i<inDayTimes; i++)
{
sumULong+=CAT1021ReadUnInt(TAvg_PM10_SAdd+i*2);
}
FLASH_W_UNINT(31, last_DayAvg_Add+15, sumULong/inDayTimes);//PM10日平均值
}
CAT1021WriteUnInt(last_DayAvg_Add_SAdd, last_DayAvg_Add+21);
last_DayAvg_Add +=21; //日平均值的最后地址
//Disp(1,7,16,8,*(number0));
catYear=year;
catMonth=newMonth;
catDay=day;
CAT1021Write(catYear_SAdd, year );
CAT1021Write(catMonth_SAdd,newMonth);
CAT1021Write(catDay_SAdd, day );
inDayTimes=0;
CAT1021Write(inDayTimes_SAdd, 0); //更新CAT1021中的日期
for (i=0; i<144; i++)
{
CAT1021Write(TAvg_SO2_SAdd+i, 0);
}//清空小时均值数据区
}
void FlashRecMonAvg(void)//存储月平均值
{
unsigned int sAddr=0;
unsigned char flg=0;
unsigned char year0,month0;
unsigned char dayTimes0=0;
unsigned long monthSum_SO2 =0;
// unsigned long monthSum_NO2 =0;
// unsigned long monthSum_PM10=0;
do
{
year0 =FLASH_R_BYTE(31, sAddr );
month0=FLASH_R_BYTE(31, sAddr+1);
if ((255==year0) || (255==month0))
{
break;
}
if ((year0==year) && ( month0== catMonth_MA) )
{
flg=1;
monthSum_SO2 +=FLASH_R_UNINT(31, sAddr+3 );
// monthSum_NO2 +=FLASH_R_UNINT(31, sAddr+9 );
// monthSum_PM10+=FLASH_R_UNINT(31, sAddr+15);
dayTimes0++;
}
sAddr+=21;
}while (sAddr < 0xf7a7);
if (1==flg)
{
monthSum_SO2 /=dayTimes0;
// monthSum_NO2 /=dayTimes0;
// monthSum_PM10/=dayTimes0;
FLASH_W_BYTE(31, last_MonthAvg_Add, year );//年
FLASH_W_BYTE(31, last_MonthAvg_Add+1, catMonth_MA);//月
FLASH_W_UNINT(31,last_MonthAvg_Add+2, (unsigned int)monthSum_SO2 );//SO2月平均值
// FLASH_W_UNINT(31,last_MonthAvg_Add+8, (unsigned int)monthSum_NO2 );//NO2月平均值
// FLASH_W_UNINT(31,last_MonthAvg_Add+14,(unsigned int)monthSum_PM10);//PM10月平均值
CAT1021WriteUnInt(last_MonthAvg_Add_SAdd, last_MonthAvg_Add+20);
CAT1021Write(catMonth_MA_SAdd,newMonth);
last_MonthAvg_Add+=20;
}
}
*/
void FlashClearDataAll(void)
{
unsigned char i;
for (i=0; i<32; i++)
{
FLASH_BLK_ERASE(i);
Delay1ms(1);
}
//FLASH
last_CurData_Add=0;
//record_CurData=0;
start_CurData_Page=0;
end_CurData_page =0;
last_DayAvg_Add =0 ;
last_MonthAvg_Add=0xf7a7;
//COUNT
// inHourTimes=0;
// hourSumDataSO2=0;
// hourSumDataNO2=0;
// inDayTimes=0;
//CAT1021
CAT1021WriteUnInt(last_DayAvg_Add_SAdd, 0);
CAT1021WriteUnInt(last_MonthAvg_Add_SAdd, 0xf7a7);
//CAT1021WriteUnInt(last_CurData_Add_SAdd, 0);
CAT1021Write(start_CurData_Page_SAdd,0);
CAT1021Write( end_CurData_page_SAdd,0);
CAT1021Write( flashFullFlg_SAdd, 0);
// CAT1021Write( inDayTimes_SAdd, 0);
GetTimeDec();
catYear =buffTime[0];
catMonth =buffTime[1];
catDay =buffTime[2];
catMonth_MA=buffTime[1];
CAT1021Write(catMonth_MA_SAdd,buffTime[1]);
CAT1021Write(catYear_SAdd, buffTime[0]);
CAT1021Write(catMonth_SAdd, buffTime[1]);
CAT1021Write(catDay_SAdd, buffTime[2]);
for (i=0; i<144; i++)
{
CAT1021Write(TAvg_SO2_SAdd+i, 0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -