關(guān)于STC單片機(jī)EEPROM的應(yīng)用總結(jié)
大建議:
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指令完成后,地址是否會(huì)自動(dòng)” 加1”或“減1”?
不會(huì)
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存儲(chǔ)寄存器
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
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論