AVR單片機(jī)中的EEPROM
1.EEPROM介紹
Electrically Erasable Programmable Read Only Memory電氣可拭除可編程只讀存儲(chǔ)器
發(fā)展過(guò)程:ROM – > PROM –> EPROM –> EEPROM
2.EEPROM和FLASH的區(qū)別
2.1 使用上的區(qū)別
FLASH用于存放程序,在程序運(yùn)行過(guò)程中不能更改。我們編寫(xiě)的程序是燒錄到FLASH中的;
RAM用作程序運(yùn)行時(shí)的數(shù)據(jù)存儲(chǔ)器;
EEPROM用于存放數(shù)據(jù),是用來(lái)保存掉電后用戶不希望丟的數(shù)據(jù),開(kāi)機(jī)時(shí)用到的參數(shù)。運(yùn)行過(guò)程中可以改變。
FLASH是用于存儲(chǔ)程序代碼的,有些場(chǎng)合也可能用它來(lái)保存數(shù)據(jù),當(dāng)然前提是該單片機(jī)的FLASH工藝是可以自寫(xiě)的(運(yùn)行中可擦寫(xiě)),但要注意FLASH的擦寫(xiě)次數(shù)通常小于一萬(wàn)次,而且通常FLASH只能按塊擦除。EEPROM不能用來(lái)存程序,通常單片機(jī)的指令尋址不能到這個(gè)區(qū)域。EEPROM的擦寫(xiě)次數(shù)應(yīng)有百萬(wàn)次,而且可以按字節(jié)擦寫(xiě)。EEPROM在一個(gè)PAGE內(nèi)是可以任意寫(xiě)的,F(xiàn)LSAH則必須先擦除成BLANK,然后再寫(xiě)入,而一般沒(méi)有單字節(jié)擦除的功能,至少一個(gè)扇區(qū)擦除。
2.2 結(jié)構(gòu)上的區(qū)別
EEPROM和FLASH都是非易失性存儲(chǔ)器。
FLASH的全稱是FLASH EEPROM,但跟常規(guī)EEPROM的操作方法不同。
FLASH 和EEPROM的最大區(qū)別是FLASH按扇區(qū)操作,EEPROM則按字節(jié)操作,二者尋址方法不同,存儲(chǔ)單元的結(jié)構(gòu)也不同,F(xiàn)LASH的電路結(jié)構(gòu)較簡(jiǎn)單,同樣容量占芯片面積較小,成本自然比EEPROM低,因而適合用作程序存儲(chǔ)器,EEPROM則更多的用作非易失的數(shù)據(jù)存儲(chǔ)器。當(dāng)然用FLASH做數(shù)據(jù)存儲(chǔ)器也行,但操作比EEPROM麻煩的多,所以更“人性化”的MCU設(shè)計(jì)會(huì)集成FLASH和EEPROM兩種非易失性存儲(chǔ)器,而廉價(jià)型設(shè)計(jì)往往只有 FLASH,早期可電擦寫(xiě)型MCU則都是EEPRM結(jié)構(gòu),現(xiàn)在已基本上停產(chǎn)了。
3.EEPROM的使用方法
AVRGCC里面自帶有EEPROM讀寫(xiě)函數(shù)。
使用時(shí)需包含頭文件#include ,部分讀寫(xiě)函數(shù)如下:
#define eeprom_is_ready() bit_is_clear(EECR, EEWE)//檢測(cè)EEPROM是否準(zhǔn)備好。OK返回1(返回EEWE位)
#define eeprom_busy_wait() do {} while (!eeprom_is_ready())//等待EEPROM操作完成
extern uint8_t eeprom_read_byte (const uint8_t *addr);//讀取指定地址的一個(gè)字節(jié)8bit的EEPROM數(shù)據(jù)
extern uint16_t eeprom_read_word (const uint16_t *addr);//讀取指定地址的一個(gè)字16bit的EEPROM數(shù)據(jù)
extern void eeprom_read_block (void *buf, const void *addr, size_t n);//讀取由指定地址開(kāi)始的指定長(zhǎng)度的EEPROM數(shù)據(jù)
extern void eeprom_write_byte (uint8_t *addr, uint8_t val);//向指定地址寫(xiě)入一個(gè)字節(jié)8bit的EEPROM數(shù)據(jù)
extern void eeprom_write_word (uint16_t *addr, uint16_t val);//向指定地址寫(xiě)入一個(gè)字16bit的EEPROM數(shù)據(jù)
使用示例:
/*-----------------------------------------------------------------------------*從EEPROM中讀取配置信息*----------------------------------------------------------------------------*/uint8_tread_EEPROM_config(void){factory_mode=eeprom_read_byte((uint8_t*)0x10);short_address=eeprom_read_word((uint16_t*)0x11);transmit_power_DBM_uin=eeprom_read_byte((uint8_t*)0x13);pan_id=eeprom_read_word((uint16_t*)0x14);channel_page=eeprom_read_byte((uint8_t*)0x16);channel=eeprom_read_byte((uint8_t*)0x17);return1;}/*------------------------------------------------------------------------------*將從串口讀出的配置信息存放于EEPROM中*-----------------------------------------------------------------------------*/uint8_twrite_EEPROM_config(void){eeprom_write_byte((uint8_t*)0x10,factory_mode);eeprom_write_word((uint16_t*)0x11,short_address);eeprom_write_byte((uint8_t*)0x13,transmit_power_DBM_uin);eeprom_write_word((uint16_t*)0x14,pan_id);eeprom_write_byte((uint8_t*)0x16,channel_page);eeprom_write_byte((uint8_t*)0x17,channel);return1;}
通過(guò)串口向單片機(jī)發(fā)送配置命令,單片機(jī)收到指令后,利用函數(shù)write_EEPROM_config()將相應(yīng)的配置信息存放于EEPROM中。系統(tǒng)初始化時(shí),利用函數(shù)read_EEPROM_config()從EEPROM中取出相應(yīng)的數(shù)據(jù),用于系統(tǒng)的初始化。