STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計_第1頁
STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計_第2頁
STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計_第3頁
STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計_第4頁
STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

STC單片機利用IAP技術(shù)實現(xiàn)EEPROM設(shè)計STC89C51、52內(nèi)部都自帶有2K字節(jié)的EEPROM,54、55和58都自帶有16K字節(jié)的EEPROM,STC單片機是利用IAP技術(shù)實現(xiàn)的EEPROM,內(nèi)部Flash擦寫次數(shù)可達100,000次以上,先來介紹下ISP與IAP的區(qū)別和特點。知識點:ISP與IAP介紹ISP:InSystemProgramable是指在系統(tǒng)編程,通俗的講,就是片子已經(jīng)焊板子上,不用取下,就可以簡單而方便地對其進行編程。比如我們通過電腦給STC單片機下載程序,或給AT89S51單片機下載程序,這就是利用了ISP技術(shù)。IAP:InApplicationProgramable是指在應(yīng)用編程,就是片子提供一系列的機制(硬件/軟件上的)當(dāng)片子在運行程序的時候可以提供一種改變flash數(shù)據(jù)的方法。通俗點講,也就是說程序自己可以往程序存儲器里寫數(shù)據(jù)或修改程序。這種方式的典型應(yīng)用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機的ISP功能就是通過IAP技術(shù)來實現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開始運行這段程序,當(dāng)檢測到上位機有下載要求時,便和上位機通信,然后下載數(shù)據(jù)到存儲區(qū)。大家要注意千萬不要嘗試去擦除這段ISP引導(dǎo)程序,否則恐怕以后再也下載不了程序了。STC單片機內(nèi)部有幾個專門的特殊功能寄存器負責(zé)管理ISP/IAP功能的,見表1。表1ISP/IAP相關(guān)寄存器列表名稱地址功能描述D7D6D5D4D3D2D1D0復(fù)位值ISP_DATAE2hFlash數(shù)據(jù)寄存器11111111ISP_ADDRHE3hFlash高字節(jié)地址寄存器00000000ISP_ADDRLE4hFlash低字節(jié)地址寄存器00000000ISP_CMDE5hFlash命令模式寄存器----------MS2MS1MS0xxxxx000ISP_TRIGE6hFlash命令觸發(fā)寄存器xxxxxxxxISP_CONTRE7hISP/IAP控制寄存器ISPENSWBSSWRST----WT2WT1WT0000xx000ISP_DATA:ISP/IAP操作時的數(shù)據(jù)寄存器。ISP/IAP從Flash讀出的數(shù)據(jù)放在此處,向Flash寫入的數(shù)據(jù)也需放在此處。ISP_ADDRH:ISP/IAP操作時的地址寄存器高八位。ISP_ADDRL:ISP/IAP操作時的地址寄存器低八位。ISP_CMD:ISP/IAP操作時的命令模式寄存器,須命令觸發(fā)寄存器觸發(fā)方可生效。命令模式如表2所示。表2ISP_CMD寄存器模式設(shè)置D7D6D5D4D3D2D1D0模式選擇保留命令選擇----------000待機模式,無ISP操作----------001對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)讀----------010對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)編程----------011對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)扇區(qū)擦除程序在系統(tǒng)ISP程序區(qū)時可以對用戶應(yīng)用程序區(qū)/數(shù)據(jù)Flash區(qū)(EEPROM)進行字節(jié)讀/字節(jié)編程/扇區(qū)擦除;程序在用戶應(yīng)用程序區(qū)時,僅可以對數(shù)據(jù)Flash區(qū)(EEPROM)進行字節(jié)讀/字節(jié)編程/扇區(qū)擦除。STC89C51RC/RD+系列單片機出廠時已經(jīng)固化有ISP引導(dǎo)碼,并設(shè)置為上電復(fù)位進入ISP程序區(qū),并且出廠時就已完全加密。ISP_TRIG:ISP/IAP操作時的命令觸發(fā)寄存器。在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,再寫入B9h,ISP/IAP命令才會生效。STC89C52RC,STC89LE52RC單片機內(nèi)部可用DataFlash(EEPROM)的地址如表3所示,其它型號單片機請查閱相關(guān)資料。表3STC89C52RC、STC89LE52RC單片機內(nèi)部EEPROM地址表第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2000H21FFH2200H23FFH2400H25FFH2600H27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2800H29FFH2A00H2BFFH2C00H2DFFH2E00H2FFFH每個扇區(qū)為512字節(jié),建議大家在寫程序時,將同一次修改的數(shù)據(jù)放在同一個扇區(qū),方便修改,因為在執(zhí)行擦除命令時,一次最少要擦除一個扇區(qū)的數(shù)據(jù)(需要提供扇區(qū)的首地址),每次在更新數(shù)據(jù)前都必須要擦除原數(shù)據(jù)方可重新寫入新數(shù)據(jù),不能直接在原來數(shù)據(jù)基礎(chǔ)上更新內(nèi)容。注意:上面的是數(shù)據(jù)存儲區(qū)的地址,程序存儲區(qū)地址是從0~1FFF,共8K,程序區(qū)只能是ISP編程。以下是自己寫的這部分功能代碼,因為風(fēng)格問題,不太喜歡原著代碼,感覺自己的還嚴謹一點。/****************************************************************************//*IAP驅(qū)動*//****************************************************************************//************************************************************************************************************************//*ISP/IAP相關(guān)寄存器列表*//*名稱地址功能描述D7D6D5D4D3D2D1D0復(fù)位值*//*ISP_DATAE2hFlash數(shù)據(jù)寄存器11111111*//*ISP_ADDRHE3hFlash高字節(jié)地址寄存器00000000*//*ISP_ADDRLE4hFlash低字節(jié)地址寄存器00000000*//*ISP_CMDE5hFlash命令模式寄存器----------MS2MS1MS0xxxxx000*//*ISP_TRIGE6hFlash命令觸發(fā)寄存器xxxxxxxx*//*ISP_CONTRE7hISP/IAP控制寄存器ISPENSWBSSWRST----WT2WT1WT0000xx000*//************************************************************************************************************************//************************************************************************************//*ISP_CMD寄存器模式設(shè)置*//*D7D6D5D4D3D2D1D0模式選擇*//*保留命令選擇*//*----------000待機模式,無ISP操作*//*----------001對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)讀*//*----------010對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)編程*//*----------011對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)扇區(qū)擦除*//************************************************************************************//*在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,再寫入B9h,ISP/IAP命令才會生效。*//*定義常量*/#defineERROR0#defineOK1/*定義Flash操作等待時間*///#defineWAIT_TIME0x00//mcuclock40mhz//#defineWAIT_TIME0x01//mcuclock20mhz//#defineWAIT_TIME0x02//mcuclock10mhz#defineWAIT_TIME0x03//mcuclock5mhzsfrISP_DATA=0xe2;//Flash數(shù)據(jù)寄存器sfrISP_ADDRH=0xe3;//Flash高字節(jié)地址寄存器sfrISP_ADDRL=0xe4;//Flash低字節(jié)地址寄存器sfrISP_CMD=0xe5;//Flash命令模式寄存器sfrISP_TRIG=0xe6;//Flash命令觸發(fā)寄存器sfrISP_CONTR=0xe7;//ISP/IAP控制寄存器#defineCMD_READ0x01//定義IAP的讀字節(jié)操作#defineCMD_PRGM0x02//定義IAP的寫字節(jié)操作#defineCMD_ERASE0x03//定義IAP的擦除扇區(qū)操作/***********************打開ISP,IAP功能***********************/staticvoidISPIAPEnable(void){//EA=0;//關(guān)中斷ISP_CONTR=ISP_CONTR&0x18;//0001,1000ISP_CONTR=ISP_CONTR|WAIT_TIME;//寫入硬件延時ISP_CONTR=ISP_CONTR|0x80;//ISPEN=1}/***********************關(guān)閉ISP,IAP功能***********************/staticvoidISPIAPDisable(void){ISP_CONTR=ISP_CONTR&0x7f;//ISPEN=0ISP_TRIG=0x00;//EA=1;//開中斷}/*************************觸發(fā)Flash操作*************************/staticActiveOperate(void){biteacpy;eacpy=EA;EA=0;ISPIAPEnable();ISP_TRIG=0x46;//觸發(fā)ISP_IAP命令字節(jié)1ISP_TRIG=0xb9;//觸發(fā)ISP_IAP命令字節(jié)2{UINT8i=2;while(i--);}ISPIAPDisable();EA=eacpy;}/****************************讀一字節(jié)****************************/staticUINT8IAPReadByte(constUINT16uiAddr){ISP_ADDRH=(UINT8)(uiAddr》》8);//寫地址ISP_ADDRL=(UINT8)(uiAddr&0xFF);ISP_CMD=ISP_CMD&0xf8;//清低三位ISP_CMD=ISP_CMD|CMD_READ;//寫入讀命令A(yù)ctiveOperate();//觸發(fā)執(zhí)行return(ISP_DATA);//返回讀到的數(shù)據(jù)}/****************************寫一字節(jié)****************************/staticvoidIAPWriteByte(constUINT16uiAddr,constUINT8ucData){ISP_ADDRH=(UINT8)(uiAddr》》8);//寫地址ISP_ADDRL=(UINT8)(uiAddr&0xFF);ISP_CMD=ISP_CMD&0xf8;//清低三位ISP_CMD=ISP_CMD|CMD_PRGM;//寫入寫命令I(lǐng)SP_DATA=ucData;//寫入數(shù)據(jù)準備ActiveOperate();//觸發(fā)執(zhí)行}/****************************擦除一扇區(qū)****************************/staticvoidIAPEarseSection(constUINT16uiAddr){UINT16uiSecAddr;uiSecAddr=(uiAddr&0xfe00);//取扇區(qū)地址ISP_ADDRH=(UINT8)(uiSecAddr》》8);//寫地址ISP_ADDRL=0x00;ISP_CMD=ISP_CMD&0xf8;//清低三位ISP_CMD=ISP_CMD|CMD_ERASE;//寫入擦除命令A(yù)ctiveOperate();//觸發(fā)執(zhí)行}------------------------------------------------------------------------------------------------------------------------#include//到宏晶網(wǎng)站下載頭文件或自己在現(xiàn)有的頭文件上加上相應(yīng)的寄存器定義即可。#includ

溫馨提示

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

評論

0/150

提交評論