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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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日

相关文档
最新文档