治标治本,彻底解决AVR单片机EEPROM数据丢失问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
治标治本,彻底解决A VR单片机EEPROM数据丢失问题
在项目中复制出来的程序,使用时可能有些地方需要修改。
编译环境:WinAVR-20060421 + AVR Studio 4.12.498 Service Pack 4
基本思路:每份写到EEPRM的数据,都做三个备份,每个备份的数据都做CRC16校验,只要系统运行中出错,错误地修改了EEPROM数据,
那么根据校验字节就知道哪个备份的数据被修改了,然后用正确的备份覆盖出错的备份,达到数据恢复的目的。
EEPROMSave.h 文件:
1./* EEPROM管理定义 */
2.
3.#define EepromPageSize 64 //页容量定
义
4.
5.#define EepromPage0Addr 0x0000 //各
个页的其始地址定义
6.#define EepromPage1Addr (EepromPage0Addr + EepromPageSize)
7.#define EepromPage2Addr (EepromPage1Addr + EepromPageSize)
8.#define EepromPage3Addr (EepromPage2Addr + EepromPageSize)
9.#define EepromPage4Addr (EepromPage3Addr + EepromPageSize)
10.#define EepromPage5Addr (EepromPage4Addr + EepromPageSize)
11.#define EepromPage6Addr (EepromPage5Addr + EepromPageSize)
12.#define EepromPage7Addr (EepromPage6Addr + EepromPageSize)
13.
14./*
15.最后两个字节为CRC16校验码,其余为数据
16.
17.| 0 | 1 | 2 | |.......................| 61 | 62 | 63 |
18.Data Data...................Data.....CRCH CRCL
19.*/
20.
21.#define VALID 0x01
22.#define INVALID 0x00
23.
24./*------------------------------------------------------------
-----------------------------*/
复制代码
EEPROMSave.c 文件:
1./*************************************************************
******
2.*函数名称:EepromReadByte()
3.*函数功能:写一个Byte的数据进EEPROM
4.*输入参数:address:地址
5.*返回参数:从指定地址读出来的数据
6.*编写作者:my_avr
7.*编写时间:2007年8月13日
8.*相关说明:
9.**************************************************************
******/
10.unsigned char EepromReadByte(unsigned char *address)
11.{
12. unsigned char data;
13.
14. data = 0;
15.
16. eeprom_busy_wait();
17. data = eeprom_read_byte(address);
18.
19. return data;
20.}
21.
22./*************************************************************
******
23.*函数名称:EepromReadWord();
24.*函数功能:写一个Word的数据进EEPROM
25.*输入参数:address:地址
26.*返回参数:从指定地址读出来的数据
27.*编写作者:my_avr
28.*编写时间:2007年8月13日
29.*相关说明:
30.**************************************************************
******/
31.uint16_t EepromReadWord(uint16_t *address)
32.{
33. uint16_t data;
34.
35. data = 0;
36.
37. eeprom_busy_wait();
38. data = eeprom_read_word(address);
39.
40. return data;
41.}
42.
43./*************************************************************
******
44.*函数名称:EepromWriteByte()
45.*函数功能:写一个Byte的数据进EEPROM
46.*输入参数:address:地址;data:数据
47.*返回参数:无
48.*编写作者:my_avr
49.*编写时间:2007年8月13日