治標(biāo)治本,徹底解決AVR單片機(jī)EEPROM數(shù)據(jù)丟失問題
基本思路:每份寫到EEPRM的數(shù)據(jù),都做三個(gè)備份,每個(gè)備份的數(shù)據(jù)都做CRC16校驗(yàn),只要系統(tǒng)運(yùn)行中出錯(cuò),錯(cuò)誤地修改了EEPROM數(shù)據(jù),
那么根據(jù)校驗(yàn)字節(jié)就知道哪個(gè)備份的數(shù)據(jù)被修改了,然后用正確的備份覆蓋出錯(cuò)的備份,達(dá)到數(shù)據(jù)恢復(fù)的目的。
EEPROMSave.h 文件:
/* EEPROM管理定義 */
#define EepromPageSize 64 //頁(yè)容量定義
#define EepromPage0Addr 0x0000 //各個(gè)頁(yè)的其始地址定義
#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)
/*
最后兩個(gè)字節(jié)為CRC16校驗(yàn)碼,其余為數(shù)據(jù)
| 0 | 1 | 2 | |.......................| 61 | 62 | 63 |
Data Data...................Data.....CRCH CRCL
*/
#define VALID 0x01
#define INVALID 0x00
/*-----------------------------------------------------------------------------------------*/
EEPROMSave.c 文件:
/*******************************************************************
*函數(shù)名稱:EepromReadByte()
*函數(shù)功能:寫一個(gè)Byte的數(shù)據(jù)進(jìn)EEPROM
*輸入?yún)?shù):address:地址
*返回參數(shù):從指定地址讀出來(lái)的數(shù)據(jù)
*編寫作者:my_avr
*編寫時(shí)間:2007年8月13日
*相關(guān)說明:
********************************************************************/
unsigned char EepromReadByte(unsigned char *address)
{
unsigned char data;
data = 0;
eeprom_busy_wait();
data = eeprom_read_byte(address);
return data;
}
/*******************************************************************
*函數(shù)名稱:EepromReadWord();
*函數(shù)功能:寫一個(gè)Word的數(shù)據(jù)進(jìn)EEPROM
*輸入?yún)?shù):address:地址
*返回參數(shù):從指定地址讀出來(lái)的數(shù)據(jù)
*編寫作者:my_avr
*編寫時(shí)間:2007年8月13日
*相關(guān)說明:
********************************************************************/
uint16_t EepromReadWord(uint16_t *address)
{
uint16_t data;
data = 0;
eeprom_busy_wait();
data = eeprom_read_word(address);
return data;
}
/*******************************************************************
*函數(shù)名稱:EepromWriteByte()
*函數(shù)功能:寫一個(gè)Byte的數(shù)據(jù)進(jìn)EEPROM
*輸入?yún)?shù):address:地址;data:數(shù)據(jù)
*返回參數(shù):無(wú)
*編寫作者:my_avr
*編寫時(shí)間:2007年8月13日
*相關(guān)說明:
********************************************************************/
void EepromWriteByte(unsigned char *address,unsigned char data)
{
eeprom_busy_wait();
eeprom_write_byte(address,data);
}
/*******************************************************************
*函數(shù)名稱:EepromWriteWord()
*函數(shù)功能:寫一個(gè)Word的數(shù)據(jù)進(jìn)EEPROM
*輸入?yún)?shù):address:地址;data:數(shù)據(jù)
*返回參數(shù):
*編寫作者:my_avr
*編寫時(shí)間:2007年8月13日
*相關(guān)說明:
********************************************************************/
void EepromWriteWord(unsigned int *address,unsigned int data)
{
eeprom_busy_wait();
eeprom_write_word(address,data);
}
關(guān)鍵詞:
AVR單片機(jī)EEPROM數(shù)據(jù)丟
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論