新聞中心

EEPW首頁 > 嵌入式系統(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指令完成后,地址是否會自動(dòng)” 加1”或“減1”?
不會
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存儲寄存器
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

評論


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

關(guān)閉