STC內(nèi)部EEPROM應(yīng)用函數(shù)
STC12C5410系列單片機(jī)內(nèi)帶2KEEPROM,分成4個(gè)扇區(qū),每個(gè)扇區(qū)512byte。使用時(shí)注意以下幾點(diǎn):
1、有三個(gè)基本命令:字節(jié)讀,字節(jié)寫,扇區(qū)擦除
2、沒有字節(jié)擦除,只有扇區(qū)擦除。如果要改變扇區(qū)中的某個(gè)字節(jié),保留其它字節(jié)內(nèi)容不變,必須先把其它字節(jié)讀出來保存,然后擦除整個(gè)扇區(qū),再把改動(dòng)的字節(jié)內(nèi)容和保存的其它字節(jié)內(nèi)容寫入扇區(qū)。
3、扇區(qū)讀寫的時(shí)間短,擦除的時(shí)間比較長,要注意扇區(qū)擦除函數(shù)的調(diào)用位置,比如最好不要放在定時(shí)中斷中。
4、每個(gè)扇區(qū)用的越少越方便。
以下是應(yīng)用函數(shù):
#include
#include
#defineISP_IAP_BYTE_READ0x1;//字節(jié)讀
#defineISP_IAP_BYTE_PROGRAM0x2;//字節(jié)編程,可以將1寫成0,要將1變成0,必須執(zhí)行字節(jié)編程
#defineISP_IAP_SECTOR_ERASE0x3;//扇區(qū)擦除,可以將0擦成1,要將0變成1,必須擦除整個(gè)扇區(qū)
//定義Flash操作等待時(shí)間及允許IAP/ISP/EEPROM操作的常數(shù)
#defineENABLE_ISP0x81;//系統(tǒng)工作時(shí)鐘<24MHz時(shí),對ISP_CONTR寄存器設(shè)置此值
#defineDATA_FLASH_START_ADDRESS0x2e00;//STC12C5410AD系列 單片機(jī) 的EEPROM測試起始地址
voidiap_dISAble(){
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0;//關(guān)閉IAP功能
ISP_CMD=0;//清命令寄存器,使命令寄存器無命令,此句可不用
ISP_TRIG=0;//清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
}
ucharbyte_read(uintaddress){
uchari;
ISP_ADDRL=address;//設(shè)置目標(biāo)單元地址
ISP_ADDRH=address>>8;
ISP_CONTR=ENABLE_ISP;//打開IAP功能,設(shè)置Flash操作等待時(shí)間
ISP_CMD=ISP_IAP_BYTE_READ;//設(shè)置為IAP/ISP/EEPROM字節(jié)讀模式命令
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP觸發(fā)寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被觸發(fā)起動(dòng)
for(i=0;i<30;i++);
//EA=1;
iap_disable();//;關(guān)閉IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài),一次連續(xù)的IAP操作完成之后建議關(guān)閉IAP功能,不需要每次都關(guān)
i=ISP_DATA;//讀出的數(shù)據(jù)在ISP_DATA單元中,送入累加器A
returni;
}
voidbyte_program(uintaddress,ucharwr_data){
uchari;
ISP_ADDRL=address;//設(shè)置目標(biāo)單元地址
ISP_ADDRH=address>>8;
ISP_DATA=wr_data;//要編程的數(shù)據(jù)先送進(jìn)ISP_DATA寄存器
ISP_CONTR=ENABLE_ISP;//打開IAP功能,設(shè)置Flash操作等待時(shí)間
ISP_CMD=ISP_IAP_BYTE_PROGRAM;//設(shè)置為IAP/ISP/EEPROM字節(jié)編程模式命令
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP觸發(fā)寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被觸發(fā)起動(dòng)
for(i=0;i<30;i++);
//EA=1;
iap_disable();//;關(guān)閉IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài)
}
voidsector_erase(uintaddress){
uchari;
ISP_ADDRL=address;//設(shè)置目標(biāo)單元地址
ISP_ADDRH=address>>8;
ISP_CONTR=ENABLE_ISP;//打開IAP功能,設(shè)置Flash操作等待時(shí)間
ISP_CMD=ISP_IAP_SECTOR_ERASE;//設(shè)置為IAP/ISP/EEPROM扇區(qū)擦除模式命令
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP觸發(fā)寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被觸發(fā)起動(dòng)
for(i=0;i<30;i++);
//EA=1;
iap_disable();
}