avr eeprom保護方法
編譯環(huán)境:WinAVR-20060421
基本思路:每份寫到EEPRM的數(shù)據,都做三個備份,每個備份的數(shù)據都做CRC16校驗,只要系統(tǒng)運行中出錯,錯誤地修改了EEPROM數(shù)據,
EEPROMSave.h
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
EEPROMSave.c
unsigned
{
unsigned
data
eeprom_busy_wait();
data
return
}
uint16_t
{
uint16_t
data
eeprom_busy_wait();
data
return
}
void
{
eeprom_busy_wait();
eeprom_write_byte(address,data);
}
void
{
eeprom_busy_wait();
eeprom_write_word(address,data);
}
void
{
unsigned
for
{
EepromWriteByte((unsigned
buff++;
}
}
unsigned
{
unsigned
unsigned
crc
ref_crc
for
{
crc
for
{
if
{
crc
}
else
{
crc
}
}
pdata
}
ref_crc
ref_crc
pdata
ref_crc
if
{
return
}
else
{
return
}
}
unsigned
{
unsigned
unsigned
crc
for
{
crc
for
{
if
{
crc
}
else
{
crc
}
}
pdata
}
EepromWriteByte(pdata,(uint8_t)
pdata
EepromWriteByte(pdata,(uint8_t)
pdata
if
{
return
}
else
{
return
}
}
uint8_t
{
if
{
return
}
return
}
uint8_t
{
unsigned
unsigned
unsigned
unsigned
unsigned
invalidpage[0]
invalidpage[1]
invalidpage[2]
validpage
temp
page
if
{
validpage
}
else
{
invalidpage[page]
page
}
if
{
validpage
}
else
{
invalidpage[page]
page
}
if
{
validpage
}
else
{
invalidpage[page]
page
}
if
{
return
}
while
{
for
{
temp
EepromWriteByte((uint8_t
}
}
if
{
return
}
return
}
使用方法(三個備份):
1、定義一個數(shù)組:EEPROMData[EepromPageSize-2]
2、要保存數(shù)據時,先把數(shù)據放到數(shù)組中,然后調用EepromWriteBlock()函數(shù),把這個數(shù)組的數(shù)據寫進EEPROM,三個備份要寫三次。
3、寫完了之后,調用CheckWriteCRC()函數(shù),該函數(shù)會計算出當前備份的CRC16檢驗數(shù)據并寫到EEPROM備份的尾部,有多少個備份就要調用多少次。
4、至此,數(shù)據的備份工作已經完成。
5、校驗數(shù)據(一般在復位后運行),執(zhí)行CheckAllPage()函數(shù),若通過了,則EEPROM數(shù)據沒有問題,否則要運行DataRecover()函數(shù),對損壞的備份進行修復
------------------修改原因:修改變量的定義形式
評論