标题: C8051F的Flash操作及安全选项 [打印本页]
作者: 51黑黑黑 时间: 2016-2-13 00:25
标题: C8051F的Flash操作及安全选项
本帖最后由 51黑黑黑 于 2016-2-13 00:26 编辑
C8051F020的Flash可以实现IAP功能(InApplicationProgramming),即程序可对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型的。
保存在地址0xFDFE和0xFDFF中的安全锁定字节集可以保护 FLASH存储器,使得不能通过JTAG接口读取或修改其内容。安全锁定字节中的每一位保护一个8k字节的存储器块。将读锁定字节中的一位清0可防止通过JTAG接口读对应的FLASH存储器块将写/擦除锁定字节中的一位清0可防止通过JTAG接口写/擦除对应的存储器块。当所有其它扇区都被锁定后128字节的扇区才被锁定。

使用FLASH访问限制(FLACL)这一特殊功能寄存器来设置软件读限制。所希望的软件访问限制地址(设计者希望的软件访问保护的最高地址)的高字节被装入FLACL寄存器。该限制地址的低字节为0x00。如果FLACL寄存器被赋值为0x40,则软件访问限制地址为0x4000。所有位于地址0x0000到0x4000(包括0x4000)的存储区内的代码将不能被在该地址以上执行的软件访问。在FLACL边界之上执行的程序可以用跳转或调用指令进入到FLACL边界以下的保护存储区。软件读限制只对MOVX和MOVC操作起作用。为了防止对FLASH的访问,应使用FLASH安全字节保护0x4000以下的存储区或进行整体保护。
这里要提到一个软件Flash ProgrammingUtilities,在用Keil编译完成后生成hex文件,需要量产时,可以按下图操作
即下程序前擦出真个Flash,下完后对代码进行锁定,防止被读写;对于锁定了代码的MCU,需要在FlashErase选项卡中擦除,否则在下面第二个图显示的界面中是无法用连接上的
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |