微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C8051F020的Flash操作

C8051F020的Flash操作

时间:11-24 来源:互联网 点击:
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型的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top