C8051F020的Flash能够完成IAP功用(In Application Programming),即程序可对Flash存储区进行编程,也就是说Flash除了能够寄存程序代码,还能够在剩余的空间内存储数据,即起到EEPROM的功用,下图是C8051F020的存储安排结构图
能够看到它的结构是64K+128字节的方式,0xfe00~0xffff为工厂保存区,不能进行操作,当64K的Flash用作存储数据时,先确认程序代码的方位,避免掩盖程序导致犯错,还有操作Flash前有必要制止中止,不然可能会呈现无法预知的过错,下面是我写的驱动,经测验没问题:
void Flash_area_Erase(bit type,uint addr)
{//flash擦除,type为0代表128字节储存区,为1代表64K存储区(512字节/扇区)
bit EA_S;
EA_S=EA;
EA=0;
if(!type) PSCTL=0x07;
else PSCTL=0x03;
FLSCL=0x01;//答应写
*(uchar xdata *)addr=0xff;
PSCTL=0;
FLSCL=0;
EA=EA_S;
}
uchar Flash_area_Read(bit type,uint addr)
{//flash读取,type为0代表128字节储存区,为1代表64K存储区(512字节/扇区)
uchar dat;
bit EA_S;
EA_S=EA;
EA=0;
if(!type) PSCTL=0x04;
else PSCTL=0;
dat=*(uchar code *)addr;
PSCTL=0;
EA=EA_S;
return(dat);
}
void Flash_area_Write(bit type,uint addr,uchar dat)
{//flash写入,type为0代表128字节储存区,为1代表64K存储区(512字节/扇区)
bit EA_S;
EA_S=EA;
EA=0;
if(!type) PSCTL=0x05;
else PSCTL=0x01;
FLSCL=0x01;
*(uchar xdata *)addr=dat;
PSCTL=0;
FLSCL=0;
EA=EA_S;
}
这儿要指出的是,在*(uchar code *)addr中,addr转化为指向ROM的uchar型变量的指针,即它指向的数是uchar型的,但其自身作为一个地址是uint型的。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/260368.html