1.概述
STC12C5A60S2单片机可以使用ISP/IAP技术可将内部Data Flash作为EEPROM使用,EEPROM可以分为多个扇区,每个扇区包含512字节,STC12C5A60S2包含两个扇区。
2.IAP寄存器介绍
IAP_DATA:
数据寄存器,从Flash读出与写入数据都使用此寄存器。
IAP_ADDRH:
地址寄存器,高八位。
IAP_ADDRL:
地址寄存器,低八位。
IAP_CMD:
命令寄存器,指定对Flash区进行读/写/擦除操作
IAP_TRIG:
命令触发寄存器,操作命令时用于触发寄存器,对此寄存器先写入5Ah,再写入A5h,IAP命令才会生效。
IAP_CONTR
控制寄存器,使能IAP读写操作。
3.写EEPROM
void IapProgramByte(unsigned int addr, unsigned char dat){
IAP_CONTR = ENABLE_IAP; // 打开IAP方法
IAP_CMD = CMD_PROGRAM; // 设置写命令
IAP_ADDRL = addr; // 设置低八位地址
IAP_ADDRH = addr >> 8; // 设置高八位地址
IAP_DATA = dat; // 写数据
IAP_TRIG = 0x5A; // 设置触发命令
IAP_TRIG = 0xa5; // 设置触发命令
_nop_();
IapIdle(); // 关闭方法
}
4.读EEPROM
unsigned char IapReadByte(unsigned int addr){
unsigned int dat;
IAP_CONTR = ENABLE_IAP; // 打开IAP方法
IAP_CMD = CMD_READ; // 设置读命令
IAP_ADDRL = addr; // 设置低八位地址
IAP_ADDRH = addr >> 8; // 设置高八位地址
IAP_TRIG = 0x5A; // 设置触发命令
IAP_TRIG = 0xa5; // 设置触发命令
_nop_();
dat = IAP_DATA; // 读取数据
IapIdle(); // 关闭方法
return dat;
}
5.擦除EEPROM扇区
void IapEraseSector(unsigned int addr){
IAP_CONTR = ENABLE_IAP; // 打开IAP方法
IAP_CMD = CMD_ERASE; // 设置写擦除令
IAP_ADDRL = addr; // 设置低八位地址
IAP_ADDRH = addr >> 8; // 设置高八位地址
IAP_TRIG = 0x5A; // 设置触发命令
IAP_TRIG = 0xa5; // 设置触发命令
_nop_();
IapIdle(); // 关闭方法
}
由于STC12C5A60S2使用的是Flash,所以进行写操作的时候只能将0置为1,无法将1置为0,所以在更新数据的时候,先要进行擦除操作,才可以进行写操作。
由于擦除操作是对整个扇区进行擦除的,所以在进行写数据的时候,需要对整个扇区的数据进行缓存,在擦除完成之后进行整个扇区写数据。