STC單片機EEPROM讀寫程序_第1頁
STC單片機EEPROM讀寫程序_第2頁
STC單片機EEPROM讀寫程序_第3頁
STC單片機EEPROM讀寫程序_第4頁
STC單片機EEPROM讀寫程序_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/* STC89C54RD+的flash空間從0x40000xf3ff 共90個扇區,每扇區512字節*/#define BaseAddr0x1000/*51rc*/#define EndSectoraddr0x3d00/*51rc*/#define EndAddr0x3fff/*51rc 12K eeprom*/#define BaseAddr0x4000#define EndSectoraddr0xf200#define EndAddr 0xf3ff#define UseAddr 0x1000/* - 定義扇區大小 - */#define PerSector512/* 用戶程序需要記憶的數

2、組, 用戶實際使用了n-1個數據,數組長度規整到2 4 8 16 32 64 上 */uchar Ttotal16=0x55,/* 作為判別引導頭使用,用戶程序請不要修改它 */* 用戶保存記憶的數據 */0x01,/* 用途說明.*/0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,;uint timerForDelay,/* 專供延時用的變量 */i,/* 循環變量*/EepromPtr;/* eeprom讀寫指針*/* - 命令定義 - */#define RdCommand0x01/* 字節讀 *

3、/#define PrgCommand0x02/* 字節寫 */#define EraseCommand0x03/* 扇區擦除 */* 定義常量 */#define Error 1#define Ok 0/* 定義Flash對應于20MHz晶振系統的操作等待時間 */* 時鐘倍頻時WaitTime用 0x00*/#define WaitTime0x01/* = 打開 ISP,IAP 功能 = */void ISP_IAP_enable(void)EA=0;/* 關中斷 */ISP_CONTR =ISP_CONTR & 0x18; /* 0001,1000*/ISP_CONTR =ISP

4、_CONTR | WaitTime;/* 寫入硬件延時*/ISP_CONTR =ISP_CONTR | 0x80; /* ISPEN=1*/* = 關閉 ISP,IAP 功能 = */void ISP_IAP_disable(void)ISP_CONTR=ISP_CONTR & 0x7f;/* ISPEN = 0 */ISP_TRIG=0x00;EA= 1;/* 開中斷 */* = 公用的觸發代碼 = */void ISPgoon(void)ISP_IAP_enable();/* 打開 ISP,IAP 功能*/ISP_TRIG=0x46;/* 觸發ISP_IAP命令字節1*/ISP_T

5、RIG=0xb9;/* 觸發ISP_IAP命令字節2*/_nop_();/* = 字節讀 = */uchar byte_read(uint byte_addr)ISP_ADDRH = (uchar)(byte_addr >> 8);/* 地址賦值*/ISP_ADDRL = (uchar)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD& 0xf8;/* 清除低3位 */ISP_CMD = ISP_CMD| RdCommand;/* 寫入讀命令*/ISPgoon();/* 觸發執行*/ISP_IAP_disable();/* 關閉ISP,I

6、AP功能*/return (ISP_DATA);/* 返回讀到的數據*/* = 扇區擦除 = */void SectorErase(uint sector_addr)uint iSectorAddr;iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */ISP_ADDRH = (uchar)(iSectorAddr >> 8);ISP_ADDRL = 0x00;ISP_CMD= ISP_CMD & 0xf8;/* 清空低3位 */ISP_CMD= ISP_CMD | EraseCommand;/* 擦除命令3 */ISPg

7、oon();/* 觸發執行*/ISP_IAP_disable();/* 關閉ISP,IAP功能*/* = 字節寫 = */void byte_write(uint byte_addr, uchar original_data)ISP_ADDRH =(uchar)(byte_addr >> 8); /* 取地址 */ISP_ADDRL =(uchar)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD & 0xf8;/* 清低3位*/ISP_CMD = ISP_CMD | PrgCommand;/* 寫命令2*/ISP_DATA = orig

8、inal_data;/* 寫入數據準備*/ISPgoon();/* 觸發執行*/ISP_IAP_disable();/* 關閉IAP功能*/* = 字節寫并校驗 = */uchar byte_write_verify(uint byte_addr, uchar original_data)ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */ISP_ADDRL = (uchar)(byte_addr & 0xff);ISP_CMD = ISP_CMD & 0xf8;/* 清低3位*/ISP_CMD = ISP_CMD | Prg

9、Command;/* 寫命令2*/ISP_DATA = original_data;ISPgoon();/* 觸發執行*/* 開始讀,沒有在此重復給地址,地址不會被自動改變 */ISP_DATA = 0x00;/* 清數據傳遞寄存器*/ISP_CMD = ISP_CMD & 0xf8;/* 清低3位*/ISP_CMD = ISP_CMD | RdCommand;/* 讀命令1*/ISP_TRIG=0x46;/* 觸發ISP_IAP命令字節1*/ISP_TRIG=0xb9;/* 觸發ISP_IAP命令字節2 */_nop_();/* 延時*/ISP_IAP_disable();/* 關閉

10、IAP功能*/if(ISP_DATA= original_data)/* 讀寫數據校驗*/returnOk;/* 返回校驗結果*/elsereturnError;/* = 數組寫入 = */uchar ArrayWrite(uint begin_addr, uint len, uchar *array)uinti;uintin_addr;/* 判是否是有效范圍,此函數不允許跨扇區操作 */if(len > PerSector)return Error;in_addr = begin_addr & 0x01ff; /* 扇區內偏移量 */if(in_addr + len) >

11、 PerSector)return Error;in_addr = begin_addr;/* 逐個寫入并校對 */ISP_IAP_enable();/* 打開IAP功能*/for(i = 0; i< len; i+)/* 寫一個字節 */ISP_ADDRH = (uchar)(in_addr >> 8);ISP_ADDRL = (uchar)(in_addr & 0x00ff);ISP_DATA = arrayi;/* 取數據*/ISP_CMD = ISP_CMD & 0xf8;/* 清低3位 */ISP_CMD = ISP_CMD | PrgCommand

12、;/* 寫命令2 */ISP_TRIG = 0x46;/* 觸發ISP_IAP命令字節1 */ISP_TRIG = 0xb9;/* 觸發ISP_IAP命令字節2 */_nop_();/* 讀回來 */ISP_DATA=0x00;ISP_CMD = ISP_CMD & 0xf8;/* 清低3位 */ISP_CMD = ISP_CMD | RdCommand;/* 讀命令1 */ISP_TRIG = 0x46;/* 觸發ISP_IAP命令字節1 */ISP_TRIG = 0xb9;/* 觸發ISP_IAP命令字節2 */_nop_();/* 比較對錯 */if(ISP_DATA != ar

13、rayi)ISP_IAP_disable();return Error;in_addr+;/* 指向下一個字節*/ISP_IAP_disable();returnOk;/* = 扇區讀出 = */* 程序對地址沒有作有效性判斷,請調用方事先保證他在規定范圍內*/void ArrayRead(uint begin_addr, uchar len)/uchar xdatadata_buffer;/* 整個扇區讀取緩存區*/uint iSectorAddr;uint i;iSectorAddr = begin_addr;/ & 0xfe00; /* 取扇區地址 */ISP_IAP_enabl

14、e();for(i = 0; i < len; i+)ISP_ADDRH =(uchar)(iSectorAddr >> 8);ISP_ADDRL =(uchar)(iSectorAddr & 0x00ff);ISP_CMD =ISP_CMD& 0xf8;/* 清低3位 */ISP_CMD =ISP_CMD| RdCommand;/* 讀命令1 */ISP_DATA = 0;ISP_TRIG = 0x46;/* 觸發ISP_IAP命令字節1 */ISP_TRIG = 0xb9;/* 觸發ISP_IAP命令字節2 */_nop_();Ttotali=ISP_DA

15、TA;iSectorAddr+;ISP_IAP_disable();/* 關閉IAP功能*/* = 從eeprom中讀取數據 = */void DataRestore()EepromPtr = BaseAddr;/* 指向eeprom的起始點*/while(EepromPtr < EndAddr)/* 在eeprom的可用區域內*/if(byte_read(EepromPtr) = 0x55)/* 找到了上一次有效紀錄*/break;/*尋找完成*/EepromPtr += 0x10;/* 指向下一個小區*/if(EepromPtr >= EndAddr)/* 如果照遍都沒有,是新

16、片*/EepromPtr = BaseAddr;/* 指向eeprom的起始點*/for(i=0;i<90;i+)SectorErase(EepromPtr+0x200*i);/* 全部扇區擦除*/while(ArrayWrite(EepromPtr, 0x10, Ttotal)/* 寫默認值*/* 寫入失敗才運行的部分*/byte_write(EepromPtr, 0);/* 該單元已經失效*/if(EepromPtr < EndAddr)EepromPtr += 0x10;/* 換一塊新的小區*/elseP1=0;/* 指示芯片內eeprom全壞*/EA= 0;/* 不再做任何事*/while(1);/* 死機*/ArrayRead(EepromPtr, 16);/* = 將需要記憶的數據保存到eeprom = */void DataSave()uintwrPtr;/* 臨時指針*/NextArea:byte_write_verify(EepromPtr, 0);/* 將原來的標記清除*/wrPtr = EepromPtr & 0xfe00;/* 上一個扇區的起始地址*/EepromPtr += 0x10;/* 目標存入地址*/* - 判斷是否啟用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論