STC單片機(jī)EEPROM的應(yīng)用和程序
單片機(jī)運(yùn)行時(shí)的數(shù)據(jù)都存在于RAM(隨機(jī)存儲(chǔ)器)中,在掉電后RAM 中的數(shù)據(jù)是無(wú)
法保留的,那么怎樣使數(shù)據(jù)在掉電后不丟失呢?這就需要使用EEPROM 或FLASHROM 等
存儲(chǔ)器來(lái)實(shí)現(xiàn)。在傳統(tǒng)的單片機(jī)系統(tǒng)中,一般是在片外擴(kuò)展存儲(chǔ)器,單片機(jī)與存儲(chǔ)器之間通
過(guò)IIC 或SPI 等接口來(lái)進(jìn)行數(shù)據(jù)通信。這樣不光會(huì)增加開(kāi)發(fā)成本,同時(shí)在程序開(kāi)發(fā)上也要花
更多的心思。在STC 單片機(jī)中內(nèi)置了EEPROM(其實(shí)是采用IAP 技術(shù)讀寫(xiě)內(nèi)部FLASH 來(lái)
實(shí)現(xiàn)EEPROM),這樣就節(jié)省了片外資源,使用起來(lái)也更加方便。下面就詳細(xì)介紹STC 單
片機(jī)內(nèi)置EEPROM 及其使用方法。
STC 各型號(hào)單片機(jī)內(nèi)置的EEPROM 的容量各有不同,見(jiàn)下表:
(內(nèi)部EEPROM 可以擦寫(xiě)100000 次以上)
上面提到了IAP,它的意思是“在應(yīng)用編程”,即在程序運(yùn)行時(shí)程序存儲(chǔ)器可由程序自
身進(jìn)行擦寫(xiě)。正是是因?yàn)橛辛薎AP,從而可以使單片機(jī)可以將數(shù)據(jù)寫(xiě)入到程序存儲(chǔ)器中,使
得數(shù)據(jù)如同燒入的程序一樣,掉電不丟失。當(dāng)然寫(xiě)入數(shù)據(jù)的區(qū)域與程序存儲(chǔ)區(qū)要分開(kāi)來(lái),以
使程序不會(huì)遭到破壞。
要使用IAP 功能,與以下幾個(gè)特殊功能寄存器相關(guān):
ISP_DATA: ISP/IAP 操作時(shí)的數(shù)據(jù)寄存器。
ISP/IAP 從Flash 讀出的數(shù)據(jù)放在此處,向Flash 寫(xiě)的數(shù)據(jù)也需放在此處
ISP_ADDRH:ISP/IAP 操作時(shí)的地址寄存器高八位。
ISP_ADDRL:ISP/IAP 操作時(shí)的地址寄存器低八位。
ISP_CMD: ISP/IAP 操作時(shí)的命令模式寄存器,須命令觸發(fā)寄存器觸發(fā)方可生效。
ISP_TRIG:ISP/IAP 操作時(shí)的命令觸發(fā)寄存器。
當(dāng)ISPEN(ISP_CONTR.7)=1 時(shí),對(duì)ISP_TRIG 先寫(xiě)入0x46,再寫(xiě)入0xb9,ISP/IAP
命令才會(huì)生效。
單片機(jī)芯片型號(hào)起始地址內(nèi)置EEPROM 容量(每扇區(qū)512 字節(jié))
STC89C51RC,STC89LE51RC 0x2000 共八個(gè)扇區(qū)
STC89C52RC,STC89LE52RC 0x2000 共八個(gè)扇區(qū)
STC89C54RD+,STC89LE54RD+ 0x8000 共五十八個(gè)扇區(qū)
STC89C55RD+,STC89LE55RD+ 0x8000 共五十八個(gè)扇區(qū)
STC89C58RD+,STC89LE58RD+ 0x8000 共五十八個(gè)扇區(qū)
寄存器標(biāo)識(shí)地址名稱7 6 5 4 3 2 1 0 初始值
ISP_DATA 0xE2 ISP/IAP閃存數(shù)據(jù)寄存器11111111
ISP_ADDRH 0xE3 ISP/IAP 閃存地址高位00000000
ISP_ADDRL 0xE4 ISP/IAP 閃存地址低位00000000
ISP_CMD 0xE5 ISP/IAP閃存命令寄存器MS2
MS1 MS0 xxxxx000
ISP_TRIG 0xE6 ISP/IAP 閃存命令觸發(fā)xxxxxxxx
ISP_CONTR 0xE7 ISP/IAP 控制寄存器ISPEN SWBS SWRST WT2
WT1 WT0 00xx000
B7 B6 B5 B4 B3 B2 B1 B0 命令/操作模式選擇
保留命令選擇
- - - - - 0 0 0 待機(jī)模式,無(wú)ISP/IAP 操作
- - - - - 0 0 1 對(duì)用戶的應(yīng)用程序Flash 區(qū)及數(shù)據(jù)Flash 區(qū)字節(jié)讀
- - - - - 0 1 0 對(duì)用戶的應(yīng)用程序Flash 區(qū)及數(shù)據(jù)Flash 區(qū)字節(jié)編程
- - - - - 0 1 1 對(duì)用戶的應(yīng)用程序Flash 區(qū)及數(shù)據(jù)Flash 區(qū)扇區(qū)擦除
ISP_CONTR:ISP/IAP 控制寄存器。
ISPEN:ISP/IAP 功能允許位。0:禁止ISP/IAP 編程改變Flash,1:允許編程改變Flash
SWBS:軟件選擇從用戶主程序區(qū)啟動(dòng)(0),還是從ISP 程序區(qū)啟動(dòng)(1)。
SWRST:0:不操作,1:產(chǎn)生軟件系統(tǒng)復(fù)位,硬件自動(dòng)清零。
ISP_CONTR 中的SWBS 與SWRST 這兩個(gè)功能位,可以實(shí)現(xiàn)單片機(jī)的軟件啟動(dòng),并
啟動(dòng)到ISP 區(qū)或用戶程序區(qū),這在“STC 單片機(jī)自動(dòng)下載”一節(jié),亦有所應(yīng)用。
如:
ISP_CONTR=0x60? 則可以實(shí)現(xiàn)從用戶應(yīng)用程序區(qū)軟件復(fù)位到ISP 程序區(qū)開(kāi)始運(yùn)行
程序。
ISP_CONTR=0x20? 則可以實(shí)現(xiàn)從ISP 程序區(qū)軟件復(fù)位到用戶應(yīng)用程序區(qū)開(kāi)始運(yùn)行
程序。
用IAP 向Flash 中讀寫(xiě)數(shù)據(jù),是需要一定的讀寫(xiě)時(shí)間的,讀寫(xiě)數(shù)據(jù)命令發(fā)出后,要等待
一段時(shí)間才可以讀寫(xiě)成功。這個(gè)等待時(shí)間就是由WT2、WT1、WT0 與晶體振蕩器頻率決定
的。
(以上的建議時(shí)鐘是(WT2、WT1、WT0)取不同的值時(shí)的標(biāo)稱時(shí)鐘,用戶系統(tǒng)中的時(shí)鐘
不要過(guò)高,否則可能使操作不穩(wěn)定。)
#include "reg52.h"
#include "eeprom.h"
//****************** 關(guān)閉 ISP,IAP 功能 **************
void ISP_IAP_Disable(void)
{
}
//*******************字節(jié)讀***************************
uchar
{
}
//********************字節(jié)編程***********************
void
{
}
//********************* 扇區(qū)擦除*********************
void
{
//
}
#ifndef _eeprom_h
#define _eeprom_H
#define Read_COM
#define Prog_COM
#define Dele_COM
#define En_Wait_TIME
#define Start_ADDRH
#define Start_ADDRL
#endif
注意了,要寫(xiě)數(shù)據(jù)時(shí),一定要對(duì)該扇區(qū)先擦除后寫(xiě)數(shù)據(jù)的,所以要寫(xiě)的數(shù)據(jù)盡量不要多,也可以對(duì)不同功能的數(shù)據(jù)存在不同的扇區(qū)里。如:
Sector_erase(0X2e00);
Byte_program(0X2e00,Eeprom_ReadCode);//寫(xiě)EEPROM,保存可讀命令
要讀數(shù)據(jù)時(shí),就直接讀就可以了。
ReadData=Byte_read(0X2002);//讀取該地址的數(shù)據(jù)
讀一個(gè)字節(jié)、編程一個(gè)字節(jié)、擦除一個(gè)扇區(qū)分別用時(shí)10us、60us、10ms
評(píng)論