avr eeprom保护方法
编译环境:WinAVR-20060421
基本思路:每份写到EEPRM的数据,都做三个备份,每个备份的数据都做CRC16校验,只要系统运行中出错,错误地修改了EEPROM数据,
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、定义一个数组:EEPROMData[EepromPageSize-2]
2、要保存数据时,先把数据放到数组中,然后调用EepromWriteBlock()函数,把这个数组的数据写进EEPROM,三个备份要写三次。
3、写完了之后,调用CheckWriteCRC()函数,该函数会计算出当前备份的CRC16检验数据并写到EEPROM备份的尾部,有多少个备份就要调用多少次。
4、至此,数据的备份工作已经完成。
5、校验数据(一般在复位后运行),执行CheckAllPage()函数,若通过了,则EEPROM数据没有问题,否则要运行DataRecover()函数,对损坏的备份进行修复
------------------修改原因:修改变量的定义形式
评论