您的位置 首页 动态

治标治本,彻底解决AVR单片机EEPROM数据丢掉问题

编译环境:WinAVR-20060421+AVRStudio412498ServicePack4基本思路:每份写到EEPRM的数据,都做三个备份,每个备份的数据都

编译环境:WinAVR-20060421 + AVR Studio 4.12.498 Service Pack 4

基本思路:每份写到EEPRM的数据,都做三个备份,每个备份的数据都做CRC16校验,只需体系运转中犯错,过错地修改了EEPROM数据,
那么依据校验字节就知道哪个备份的数据被修改了,然后用正确的备份掩盖犯错的备份,到达数据康复的意图。
EEPROMSave.h 文件:
/* EEPROM办理界说 */
#define EepromPageSize 64 //页容量界说
#define EepromPage0Addr 0x0000 //各个页的其始地址界说
#define EepromPage1Addr (EepromPage0Addr + EepromPageSize)
#define EepromPage2Addr (EepromPage1Addr + EepromPageSize)
#define EepromPage3Addr (EepromPage2Addr + EepromPageSize)
#define EepromPage4Addr (EepromPage3Addr + EepromPageSize)
#define EepromPage5Addr (EepromPage4Addr + EepromPageSize)
#define EepromPage6Addr (EepromPage5Addr + EepromPageSize)
#define EepromPage7Addr (EepromPage6Addr + EepromPageSize)
/*
最终两个字节为CRC16校验码,其他为数据
| 0 | 1 | 2 | |…………………..| 61 | 62 | 63 |
Data Data……………….Data…..CRCH CRCL
*/
#define VALID 0x01
#define INVALID 0x00
/*—————————————————————————————–*/
EEPROMSave.c 文件:
/*******************************************************************
*函数称号:EepromReadByte()
*函数功用:写一个Byte的数据进EEPROM
*输入参数:address:地址
*回来参数:从指定地址读出来的数据
*编写作者:my_avr
*编写时刻:2007年8月13日
*相关阐明:
********************************************************************/
unsigned char EepromReadByte(unsigned char *address)
{
unsigned char data;
data = 0;
eeprom_busy_wait();
data = eeprom_read_byte(address);
return data;
}
/*******************************************************************
*函数称号:EepromReadWord();
*函数功用:写一个Word的数据进EEPROM
*输入参数:address:地址
*回来参数:从指定地址读出来的数据
*编写作者:my_avr
*编写时刻:2007年8月13日
*相关阐明:
********************************************************************/
uint16_t EepromReadWord(uint16_t *address)
{
uint16_t data;
data = 0;
eeprom_busy_wait();
data = eeprom_read_word(address);
return data;
}
/*******************************************************************
*函数称号:EepromWriteByte()
*函数功用:写一个Byte的数据进EEPROM
*输入参数:address:地址;data:数据
*回来参数:无
*编写作者:my_avr
*编写时刻:2007年8月13日
*相关阐明:
********************************************************************/
void EepromWriteByte(unsigned char *address,unsigned char data)
{
eeprom_busy_wait();
eeprom_write_byte(address,data);
}
/*******************************************************************
*函数称号:EepromWriteWord()
*函数功用:写一个Word的数据进EEPROM
*输入参数:address:地址;data:数据
*回来参数:
*编写作者:my_avr
*编写时刻:2007年8月13日
*相关阐明:
********************************************************************/
void EepromWriteWord(unsigned int *address,unsigned int data)
{
eeprom_busy_wait();
eeprom_write_word(address,data);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/255020.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部