新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC單片機EEPROM的應用和程序

        STC單片機EEPROM的應用和程序

        作者: 時間:2016-11-24 來源:網絡 收藏
        最近,由于工作的需要,用STC89C52來開發新產品,要用天STC的Eeprom的功能,上網也找了一點資料,得到很大幫助,真的非常感謝。程序是我在網上摘錄的,調試通過了,不過我產品在用動態掃描顯示的,由于在Eeprom擦除時要用幾十毫秒,會有一閃爍的。不過這是正常的。

        本文引用地址:http://www.104case.com/article/201611/320955.htm

        單片機運行時的數據都存在于RAM(隨機存儲器)中,在掉電后RAM 中的數據是無
        法保留的,那么怎樣使數據在掉電后不丟失呢?這就需要使用EEPROM 或FLASHROM 等
        存儲器來實現。在傳統的單片機系統中,一般是在片外擴展存儲器,單片機與存儲器之間通
        過IIC 或SPI 等接口來進行數據通信。這樣不光會增加開發成本,同時在程序開發上也要花
        更多的心思。在STC 單片機中內置了EEPROM(其實是采用IAP 技術讀寫內部FLASH 來
        實現EEPROM),這樣就節省了片外資源,使用起來也更加方便。下面就詳細介紹STC 單
        片機內置EEPROM 及其使用方法。
        STC 各型號單片機內置的EEPROM 的容量各有不同,見下表:
        (內部EEPROM 可以擦寫100000 次以上)
        上面提到了IAP,它的意思是“在應用編程”,即在程序運行時程序存儲器可由程序自
        身進行擦寫。正是是因為有了IAP,從而可以使單片機可以將數據寫入到程序存儲器中,使
        得數據如同燒入的程序一樣,掉電不丟失。當然寫入數據的區域與程序存儲區要分開來,以
        使程序不會遭到破壞。
        要使用IAP 功能,與以下幾個特殊功能寄存器相關:
        ISP_DATA: ISP/IAP 操作時的數據寄存器。
        ISP/IAP 從Flash 讀出的數據放在此處,向Flash 寫的數據也需放在此處
        ISP_ADDRH:ISP/IAP 操作時的地址寄存器高八位。
        ISP_ADDRL:ISP/IAP 操作時的地址寄存器低八位。
        ISP_CMD: ISP/IAP 操作時的命令模式寄存器,須命令觸發寄存器觸發方可生效。
        ISP_TRIG:ISP/IAP 操作時的命令觸發寄存器。
        當ISPEN(ISP_CONTR.7)=1 時,對ISP_TRIG 先寫入0x46,再寫入0xb9,ISP/IAP
        命令才會生效。
        單片機芯片型號起始地址內置EEPROM 容量(每扇區512 字節)
        STC89C51RC,STC89LE51RC 0x2000 共八個扇區
        STC89C52RC,STC89LE52RC 0x2000 共八個扇區
        STC89C54RD+,STC89LE54RD+ 0x8000 共五十八個扇區
        STC89C55RD+,STC89LE55RD+ 0x8000 共五十八個扇區
        STC89C58RD+,STC89LE58RD+ 0x8000 共五十八個扇區
        寄存器標識地址名稱7 6 5 4 3 2 1 0 初始值
        ISP_DATA 0xE2 ISP/IAP閃存數據寄存器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 閃存命令觸發xxxxxxxx
        ISP_CONTR 0xE7 ISP/IAP 控制寄存器ISPEN SWBS SWRST WT2
        WT1 WT0 00xx000
        B7 B6 B5 B4 B3 B2 B1 B0 命令/操作模式選擇
        保留命令選擇
        - - - - - 0 0 0 待機模式,無ISP/IAP 操作
        - - - - - 0 0 1 對用戶的應用程序Flash 區及數據Flash 區字節讀
        - - - - - 0 1 0 對用戶的應用程序Flash 區及數據Flash 區字節編程
        - - - - - 0 1 1 對用戶的應用程序Flash 區及數據Flash 區扇區擦除
        ISP_CONTR:ISP/IAP 控制寄存器。
        ISPEN:ISP/IAP 功能允許位。0:禁止ISP/IAP 編程改變Flash,1:允許編程改變Flash
        SWBS:軟件選擇從用戶主程序區啟動(0),還是從ISP 程序區啟動(1)。
        SWRST:0:不操作,1:產生軟件系統復位,硬件自動清零。
        ISP_CONTR 中的SWBS 與SWRST 這兩個功能位,可以實現單片機的軟件啟動,并
        啟動到ISP 區或用戶程序區,這在“STC 單片機自動下載”一節,亦有所應用。
        如:
        ISP_CONTR=0x60? 則可以實現從用戶應用程序區軟件復位到ISP 程序區開始運行
        程序。
        ISP_CONTR=0x20? 則可以實現從ISP 程序區軟件復位到用戶應用程序區開始運行
        程序。
        用IAP 向Flash 中讀寫數據,是需要一定的讀寫時間的,讀寫數據命令發出后,要等待
        一段時間才可以讀寫成功。這個等待時間就是由WT2、WT1、WT0 與晶體振蕩器頻率決定
        的。
        (以上的建議時鐘是(WT2、WT1、WT0)取不同的值時的標稱時鐘,用戶系統中的時鐘
        不要過高,否則可能使操作不穩定。)

        #include "reg52.h"
        #include "eeprom.h"

        //****************** 關閉 ISP,IAP 功能 **************
        void ISP_IAP_Disable(void)
        {
        ISP_CONTR = 0x00;
        ISP_CMD = 0X00;
        ISP_TRIG = 0x00;
        EA = 1; //開中斷
        }

        //*******************字節讀***************************

        ucharByte_read(uint byte_addr)
        {

        ISP_CONTR = En_Wait_TIME;//開啟ISP/IAP;并送等待時間
        ISP_CMD = Read_COM; //送字節讀命令字
        ISP_ADDRH = (uchar)(byte_addr >> 8);//送地址高字節
        ISP_ADDRL = (uchar)(byte_addr & 0X00FF);//送地址低字節
        EA = 0;//關中斷
        ISP_TRIG = 0X46;//送觸發命令字 0X46、0XB9
        ISP_TRIG = 0XB9;
        _nop_();
        ISP_IAP_Disable(); //關閉ISP/IAP功能
        EA = 1; //開中斷
        return ((unsigned char)ISP_DATA);
        }

        //********************字節編程***********************

        void Byte_program(uint byte_addr, uchar isp_iap_data)
        {

        ISP_CONTR = En_Wait_TIME;//開啟ISP/IAP;并送等待時間
        ISP_CMD = Prog_COM; //送字節編程命令字
        ISP_ADDRH = (uchar)(byte_addr >> 8);//送地址高字節
        ISP_ADDRL = (uchar)(byte_addr & 0X00FF);//送地址低字節
        ISP_DATA = isp_iap_data;//送數據進ISP_DATA
        EA = 0;//關中斷
        ISP_TRIG = 0X46;//送觸發命令字 0X46、0XB9
        ISP_TRIG = 0XB9;
        _nop_();
        ISP_IAP_Disable(); //關閉ISP/IAP功能
        EA = 1; //開中斷
        }

        //********************* 扇區擦除*********************
        voidSector_erase(uint sector_addr)
        {

        ISP_CONTR = En_Wait_TIME;//開啟ISP/IAP;并送等待時間
        //ISP_CONTR=0xc1;
        ISP_CMD = Dele_COM; //送扇區擦除命令字
        ISP_ADDRH = (uchar)(sector_addr >> 8);//送地址高字節
        ISP_ADDRL = (uchar)(sector_addr & 0X00FF);//送地址低字節
        EA = 0;//關中斷
        ISP_TRIG = 0X46;//送觸發命令字 0X46、0XB9
        ISP_TRIG = 0XB9;
        _nop_();
        ISP_IAP_Disable(); //關閉ISP/IAP功能
        EA = 1;
        }


        #ifndef _eeprom_h
        #define _eeprom_H

        //*********************EEPROM定義命令字節******************
        #define Read_COM0X01//字節讀數據存儲區
        #define Prog_COM0X02//字節編程數據存儲區
        #define Dele_COM0X03//扇區擦除數據存儲區
        #define En_Wait_TIME 0X81//設置等待時間 ,并使能ISP/IAP
        //從用戶區啟動程序
        //0X00==40MHZ以下,0X01==20MHZ以下
        //0X02==10MHZ以下,0X03==5MHZ以下,現在設置了20MHZ以下的,
        //
        #define Start_ADDRH0X20 //扇區地址高位,STC89C/LE52RC
        #define Start_ADDRL0X00 //扇區地址低位

        #endif

        注意了,要寫數據時,一定要對該扇區先擦除后寫數據的,所以要寫的數據盡量不要多,也可以對不同功能的數據存在不同的扇區里。如:

        Sector_erase(0X2e00);//扇區擦除,第八個扇區
        Byte_program(0X2e00,Eeprom_ReadCode);//寫EEPROM,保存可讀命令

        要讀數據時,就直接讀就可以了。

        ReadData=Byte_read(0X2002);//讀取該地址的數據

        讀一個字節、編程一個字節、擦除一個扇區分別用時10us、60us、10ms



        關鍵詞: STC單片機EEPRO

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 榆社县| 屏东县| 西青区| 阿拉善右旗| 永宁县| 西昌市| 金寨县| 永善县| 石景山区| 湖南省| 开江县| 万源市| 隆德县| 萨迦县| 沾益县| 邵阳市| 东安县| 马山县| 孝感市| 宝应县| 海门市| 互助| 河池市| 邳州市| 柞水县| 尉氏县| 台中县| 广宁县| 乌兰察布市| 惠水县| 肇源县| 屏东县| 永春县| 彭山县| 图木舒克市| 崇左市| 资中县| 都匀市| 盈江县| 黎平县| 富民县|