新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于STC單片機(jī)EEPROM的應(yīng)用總結(jié)

        關(guān)于STC單片機(jī)EEPROM的應(yīng)用總結(jié)

        作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        大建議:
        1、同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū)中不是同一次修改的數(shù)據(jù)放在另外的扇區(qū)就不須讀出保護(hù)。
        2、如果一個(gè)扇區(qū)只用一個(gè)字節(jié),那就是真正的EEPROM,STC單片機(jī)的Dataflash比外部EEPROM要快很多讀一個(gè)字節(jié)/編程一個(gè)字節(jié)大概是2個(gè)時(shí)鐘/55微秒。
        3、如果在一個(gè)扇區(qū)中存放了大量的數(shù)據(jù),某次只需要修改其中的一個(gè)字節(jié)或一部分字節(jié)時(shí),則另外的不需要修改的數(shù)據(jù)須先讀出放在STC單片機(jī)的RAM中,然后擦除整個(gè)扇區(qū),再將需要保留的數(shù)據(jù)和需修改的數(shù)據(jù)按字節(jié)逐字節(jié)寫回該扇區(qū)中(只有字節(jié)寫命令,無連續(xù)字節(jié)寫命令)。這時(shí)每個(gè)扇區(qū)使用的字節(jié)數(shù)是使用的越少越方便(不需要讀出一大堆需保留數(shù)據(jù))。
        常見問題:
        1、IAP指令完成后,地址是否會(huì)自動(dòng)” 加1”或“減1”?
        不會(huì)
        2、送5A和A5觸發(fā)之后下一次IAP命令是否還需要送5A和A5觸發(fā)?
        是,一定要。
        STC12C5201AD/PWM單片機(jī)內(nèi)部EEPROM地址表

        第一扇區(qū)
        第二扇區(qū)
        第三扇區(qū)
        第四扇區(qū)
        每個(gè)扇區(qū)
        512字節(jié)
        建議同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū),不是同一次修改的數(shù)據(jù)放在不同的扇區(qū),不必用滿,當(dāng)然也可以用滿。
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        0000h
        1FFH
        200H
        3FFH
        400H
        5FFH
        600H
        7FFH
        第五扇區(qū)
        第六扇區(qū)
        第七扇區(qū)
        第八扇區(qū)
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        800H
        9FFH
        A00H
        BFFH
        C00H
        DFFH
        E00H
        FFFH
        第九扇區(qū)
        第十扇區(qū)
        第十一扇區(qū)
        第十二扇區(qū)
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        起始地址
        結(jié)束地址
        1000H
        11FFH
        1200H
        13FFH
        1400H
        15FFH
        1600H
        17FFH

        下面就舉一個(gè)例子來說明一下EEPROM的應(yīng)用
        程序功能:
        三個(gè)按鍵分別是,開關(guān)、增大、減小。通過7段數(shù)碼管將鍵值顯示出來(1-9)。
        并將開關(guān)鍵關(guān)閉前的鍵值保存在EEPROM中,系統(tǒng)再次上電時(shí)顯示上次關(guān)閉前的鍵值。
        #include//頭文件
        #include”intrins.h”
        /******宏定義*************/
        #define uintunsigned int//用unsigned int 代替unsigned int
        #define ucharunsigned char//用uchar 替代unsigned char
        /*********位定義**************/
        sbit SW=P3^2;//開關(guān)
        sbit INC=P3^3;//增大按鍵
        sbit DEC=P3^4;//減小按鍵
        sbitDATA=P1^5;//595數(shù)據(jù)流
        sbitSHIFT=P1^6;//595移位寄存器
        sbitSTORAGE=P1^7;//595存儲(chǔ)寄存器
        sbitBEEP=P1^4;//蜂鳴器
        /數(shù)碼管顯示代碼
        uchar codenum[]={0x01,0xf3,0x89,0xa1,0xb2,0xa4,0x84,0xf1,0x80,0x20} ; //0-9代碼
        //變量聲明
        bit kai=0,biaozhi=0;
        uchar MA,dat;
        /*定義與EEPROM相關(guān)的特殊功能寄存器*/
        sfrIAP_DATA=0XC2;//FLASH data register
        sfrIAP_ADDRH=0XC3;//FLASH address high
        sfrIAP_ADDRL=0XC4;//FLASH address low
        sfrIAP_CMD=0XC5;//FLASH command register
        sfrIAP_TRIG=0XC6;//FLSH command trigger
        sfrIAP_CONTR=0XC7;//flashcontrol register
        /*定義IAP/ISP/EEPROM命令*/
        #define CMD_IDLE0//stand_by
        #define CMD_READ1//byte_read
        #defineCMD_PROGRAM 2//byte_program
        #defineCMD_ERASE 3//sector_erase
        /*定義與EEPROM相關(guān)的寄存器 */
        //#defineENABLE_IAP0X80 //if sysclk<30MHz
        //#defineENABLE_IAP0X81 //if sysclk<24MHz
        //#defineENABLE_IAP0X82 //if sysclk<20MHz
        #defineENABLE_IAP0X83 //if sysclk<12MHz//定義控制寄存器
        //#defineENABLE_IAP0X84 //if sysclk<6MHz
        //#defineENABLE_IAP0X85 //if sysclk<3MHz
        //#define ENABLE_IAP 0X86//if sysclk<2MHz
        //#defineENABLE_IAP0X87 //if sysclk<1MHz
        /*定義EEPROM 的起始地址*/
        #defineIAP_ADDRESS 0X0000
        /****初始化函數(shù)**********/
        Void iapidle()
        {
        IAP_CONTR=0;//關(guān)閉IAP功能
        IAP_CMD=0;//CMD寄存器初始化
        IAP_TRIG=0;//清空觸發(fā)寄存器
        IAP_ADDRH=0X80;//數(shù)據(jù)指針指向非EEPROM區(qū)
        IAP_ADDRL=0;//CLEAR IAP address to preventmisuse
        }
        /*讀EEPROM的一個(gè)字節(jié)地址的內(nèi)容
        輸入:地址
        輸出:EEPROM字節(jié)數(shù)據(jù)
        */
        uchar iapreadbyte(uint addr)
        {
        IAP_CONTR=ENABLE_IAP;//設(shè)置IAP控制寄存器
        IAP_CMD=CMD_READ;//設(shè)置IAP的命令寄存器為讀狀態(tài)
        IAP_ADDRL=addr;//設(shè)置EERPROM的低8位地址
        IAP_ADDRH=addr>>8;
        IAP_TRIG=0X5A;
        IAP_TRIG=0XA5;
        _nop_();
        dat=IAP_DATA;
        iapidle();
        return dat;
        }
        /*寫一個(gè)字節(jié)的IAP/ISP/EEPROM空間
        輸入: 字節(jié)地址
        要寫入的數(shù)據(jù)
        Void iapprogrambyte(uint addr,uchar dat)
        {
        IAP_CONTR=ENABLE_IAP;//打開IAP功能并設(shè)置等待時(shí)間
        IAP_CMD=CMD_PROGRAM;//設(shè)置寫命令
        IAP_ADDRL=addr;//設(shè)置字節(jié)地址低8位
        IAP_ADDRH=addr>>8;//設(shè)置字節(jié)地址的高8位
        IAP_DATA=dat;//寫內(nèi)容
        IAP_TRIG=0X5A;//發(fā)送觸發(fā)命令1
        IAP_TRIG=0XA5;//發(fā)送觸發(fā)命令2
        _nop_();//等待直到寫操作完成
        Iapidle();
        }
        /*扇區(qū)擦除
        輸入:地址
        Void iaperasesector(uint addr)
        {
        IAP_CONTR=ENABLE_IAP;//開IAP功能并設(shè)置等待時(shí)間
        IAP_CMD=CMD_ERASE;//設(shè)置擦除命令
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        IAP_TRIG=0x5a;
        IAP_TRIG=0XA5;
        _nop_();
        Iapidle();
        }
        /********寫595函數(shù)*******************/
        void write_595(uchar x)
        {
        uchar j;
        for(j=0;j<8;j++)
        {
        x=x<<1;
        SHIFT=0;
        _nop_();
        _nop_();
        _nop_();
        DATA=CY;
        SHIFT=1;
        _nop_();
        _nop_();
        _nop_();
        SHIFT=0;
        }

        關(guān)鍵詞: STC單片機(jī)EEPRO

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 肇源县| 青龙| 瑞安市| 伊宁市| 云龙县| 饶平县| 历史| 五台县| 博湖县| 体育| 前郭尔| 田东县| 佛山市| 扶绥县| 永福县| 开江县| 洛阳市| 崇州市| 普定县| 德庆县| 伊川县| 岢岚县| 临潭县| 拉孜县| 鹤峰县| 三门峡市| 治县。| 专栏| 贵州省| 柳林县| 大理市| 穆棱市| 马关县| 永丰县| 平凉市| 亳州市| 周口市| 萨迦县| 新竹市| 乌审旗| 呼和浩特市|