1.EEPROM我使用的時候查看了使用手冊了解相關(guān)寄存器的使用(寄存器設(shè)置沒看懂只是看著用) 查看例程只用擦除扇區(qū)函數(shù),讀和寫操作,(都是可用的函數(shù)拿來就可以用),關(guān)閉IAP寄存器操作函數(shù),在進(jìn)行操作的時候初始化一邊即可多次調(diào)用讀寫函數(shù) 我遇到的問題1.STC15F2K60S2只有2個扇區(qū)每個扇區(qū)512個字節(jié),字節(jié)數(shù)1K,我當(dāng)時不明白,在進(jìn)行多個扇區(qū)讀寫失敗 用IAP字節(jié)讀時EEPROM起始扇區(qū)首地址: 0000h;用IAP字節(jié)讀時EEPROM結(jié)束扇區(qū)末地址: 03FFh 2.不明白怎么調(diào)用讀寫函數(shù) 寫入函數(shù)調(diào)用 void IapProgramByte( 扇區(qū)地址, 寫入的數(shù)據(jù))讀寫函數(shù)調(diào)用 unsigned char IapReadByte(想要讀出數(shù)據(jù)的扇區(qū)地址) 總體而言開始之前我了解EEPROM的作用能做什么,然后我才想怎么開始使用,我看了看數(shù)據(jù)手冊,看完我不懂,我隨后百度查EERPOM的應(yīng)用和初始化,以及函數(shù)的編寫,最后是調(diào)用測試
在使用EEPROM 的時候操作步驟 先開始對EEPROM進(jìn)行初始化操作 sfr IAP_DATA = 0xC2; //IAP數(shù)據(jù)寄存器 sfr IAP_ADDRH = 0xC3; //IAP地址寄存器高字節(jié) sfr IAP_ADDRL = 0xC4; //IAP地址寄存器低字節(jié) sfr IAP_CMD = 0xC5; //IAP命令寄存器 sfr IAP_TRIG = 0xC6; //IAP命令觸發(fā)寄存器 sfr IAP_CONTR = 0xC7; //IAP控制寄存器 #define CMD_IDLE 0 //空閑模式 #define CMD_READ 1 //IAP字節(jié)讀命令 #define CMD_PROGRAM 2 //IAP字節(jié)編程命令 #define CMD_ERASE 3 //IAP扇區(qū)擦除命令 注具體看使用手冊 然后在進(jìn)行編寫函數(shù)操作 擦除函數(shù)(函數(shù)的格式是固定的) void IapEraseSector(WORD addr) { IAP_CONTR= ENABLE_IAP; //使能IAP IAP_CMD= CMD_ERASE; //使能IAP命令 IAP_ADDRL= addr; //設(shè)置IAP低地址 IAP_ADDRH= addr >> 8; //設(shè)置IAP高地址 IAP_TRIG= 0x5a; //寫觸發(fā)命令0x5a IAP_TRIG= 0xa5; ///寫觸發(fā)命令0xa5 _nop_(); //等待寫ISP/IAP/EEPROM數(shù)據(jù)完成 IapIdle(); //關(guān)閉IAP功能 } 寫入EEPROM區(qū)域數(shù)據(jù)函數(shù)(單字節(jié)寫入) void IapProgramByte(WORD addr, BYTE dat) { IAP_CONTR= ENABLE_IAP; //使能IAP IAP_CMD= CMD_PROGRAM; //設(shè)置IAP命令 IAP_ADDRL= addr; //設(shè)置IAP低地址 IAP_ADDRH= addr >> 8; //設(shè)置IPA高地址 IAP_DATA= dat; //寫ISP/IAP/EEPROM數(shù)據(jù) IAP_TRIG= 0x5a; //寫觸發(fā)命令0x5a IAP_TRIG= 0xa5; //寫觸發(fā)命令0xa5 _nop_(); //等待寫ISP/IAP/EEPROM數(shù)據(jù)完成 IapIdle(); //關(guān)閉IAP功能 } 讀出單字節(jié)EEPROM區(qū)域數(shù)據(jù) unsigned char IapReadByte(WORD addr) { BYTE dat; //數(shù)據(jù)緩沖區(qū) IAP_CONTR= ENABLE_IAP; //使能IAP IAP_CMD= CMD_READ; //設(shè)置讀取命令 IAP_ADDRL= addr; //設(shè)置IAP低八位地址 IAP_ADDRH= addr >> 8; //設(shè)置IAP高八位地址 IAP_TRIG= 0x5a; //寫觸發(fā)命令(0x5a) IAP_TRIG= 0xa5; //寫觸發(fā)命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 dat= IAP_DATA; //讀ISP/IAP/EEPROM數(shù)據(jù) IapIdle(); //關(guān)閉IAP功能 return dat; //返回 } 關(guān)閉對IAP寄存器操作函數(shù) void IapIdle() { IAP_CONTR= 0; //關(guān)閉IAP功能 寄存器讀寫開關(guān) IAP_CMD= 0; //清除指令待機(jī) IAP_TRIG= 0; //清空觸發(fā)器寄存器 IAP_ADDRH= 0x80; //地址寄存器高八位 IAP_ADDRL= 0; //地址寄存器低八位 } 目的: 單片機(jī)運行時的數(shù)據(jù)都存在于RAM(隨機(jī)存儲器)中,在掉電后RAM中的數(shù)據(jù)是無法保留的,那么怎樣使數(shù)據(jù)在掉電后不丟失呢?這就需要使用內(nèi)部EEPROM (EEPROM可以擦寫100000次)或FLASHROM 等存儲器來實現(xiàn)。在傳統(tǒng)的單片機(jī)系統(tǒng)中,一般是在片外擴(kuò)展存儲器,單片機(jī)與存儲器之間通過IIC 或SPI 等接口來進(jìn)行數(shù)據(jù)通信。這樣不光會增加開發(fā)成本,同時在程序開發(fā)上也要花更多的心思。在STC 單片機(jī)中內(nèi)置了EEPROM(其實是采用ISP/IAP技術(shù)讀寫內(nèi)部FLASH 來實現(xiàn)EEPROM),正是因為有了IAP,從而可以使單片機(jī)可以將數(shù)據(jù)寫入到程序存儲器中,使得數(shù)據(jù)如同燒入的程序一樣,掉電不丟失。當(dāng)然寫入數(shù)據(jù)的區(qū)域與程序存儲區(qū)要分開來,以使程序不會遭到破壞。這樣就節(jié)省了片外資源,使用起來也更加方便。 下面就詳細(xì)介紹STC 單片機(jī)內(nèi)置EEPROM 及其使用方法 2.STC15F2K60S2系列單片機(jī)的內(nèi)部結(jié)構(gòu)圖 STC15F2K60S2系列單片機(jī)的內(nèi)部結(jié)構(gòu)框圖如下圖所示,STC15F2K60S2系列單片機(jī)中包含中央處理器(CPU)、程序存儲器(Flash)、數(shù)據(jù)存儲器(SRAM)、定時器、IO口、高速A/D轉(zhuǎn)換、看門狗、UART高速異步串行通信口1/串行通信口2,CCP/PWM/PCA,一組高速同步串行端口SPI,片內(nèi)高精度R/C時鐘及高可靠復(fù)位等模塊,STC15F2K60S2系列單片機(jī)幾乎包含了數(shù)據(jù)采集和控制中的所有單元模塊。
來源:網(wǎng)絡(luò),如侵,刪
|