C8051F310在系统编程Flash
用单片机,有些数据设置后需要掉电不丢失,一般首先想到的是使用eeprom,比如AVR中的Atmega系列有内部eeprom,也可以外接AT24C01之类的eeprom。这里介绍另外一种参数保存方法,Silicon Laboratories的C8051F系列,其内部程序存储区Flash可以在系统编程,功能类似于eeprom,掉电不丢失。
C8051F310内部有16K的在系统可编程Flash,地址从0x0000到0x3dff,以512字节作为一个扇区,这意味着每次擦除的时候,是对整个扇区擦除(置1),它不是面向单字节操作的,这点与eeprom不同。
读Flash:
unsigned char code TestStrings[] = “Hello,eeworld!”;
使用code定义的常量,Keil将其保存到Flash里,我们读Flash里的内容,同样地,其地址指向的数据类型应该是unsigned char code,所以,我们读Flash的某地址的内容,可以通过以下方式来读:
DataGet = (*((unsigned char code*)DataAddr));
读取DataAddr地址里的Flash常量到DataGet,其实,这个常量并非就一定是常量,它是可以修改的,即写Flash,待会介绍如何写Flash,说是Flash数据可能准确点。
先说说上面右边的定义吧,
DataAddr是一个地址,最后面那个*说明它是一个指针,unsigned char code说明它指向的数据类型,第一个*是指向,相当于读出该地址的数据,最后赋值给DataGet。
汇编中读取用MOVC指令来读取Flash数据。
读取指定长度的Flash数据:
void Flash_Read(unsigned int DataAddr,unsigned int DataLength,unsigned char *pData)
{
bit SaveEA;
SaveEA = EA;
EA = 0;
while(DataLength--)
{
(*(pData++)) = (*((unsigned char code*)(DataAddr++)));
}
EA = SaveEA;
}
擦除Flash:
Flash的位一旦被写0了,必须通过擦除,才能让它回到1,直接1是不行的。所以,如果需要重新写数据到Flash某地址,须先擦除掉,擦除操作将会使所在的整个扇区的512字节全部变成0xff。写Flash数据时,其数据类型是unsigned char xdata,汇编使用MOVX指令,请注意,MOVX同样用XRAM写,所以,最后PSWE 位应被清‘0’,以使 MOVX 指令不再指向程序存储器。MOVX读指令总是指向 XRAM。
擦除步骤:
1.禁止中断(建议这样做)。
2.置‘1’程序存储器擦除允许位(PSCTL中的PSEE),以允许 FLASH 扇区擦除。
3.置‘1’程序存储器写允许位(PSCTL中的PSWE),以允许 FLASH 写入。
4.向 FLKEY写第一个关键码:0xA5。
5.向 FLKEY写第二个关键码:0xF1。
6.用 MOVX 指令向待擦除页内的任何一个地址写入一个数据字节。
void Flash_Eraser(unsigned int DataAddr)
{ //只擦除DataAddr所在扇区的数据,实际应当根据用的数据量来擦除需要的扇区。
bit SaveEA;
SaveEA = EA;
EA = 0;
PSCTL = 0x03;//写允许、擦出允许
FLKEY = 0xa5;//写关键字
FLKEY = 0xf1;
//写入任意数据,flash将擦除该页512字节
(*((unsigned char xdata*) DataAddr)) = 0xff;
PSCTL = 0x00;//禁止写和擦除
}
写Flash:
数据类型是unsigned char xdata。写Flash一般步骤:
1. 禁止中断(建议这样做)。
2. 擦除包含目标地址的FLASH页(见上节的说明)。
3. 置‘1’PSCTL 中的 PSWE 位。
4. 清除 PSCTL 中的PSEE位。
5. 向 FLKEY写第一个关键码:0xA5。
6. 向 FLKEY写第二个关键码:0xF1。
7. 用 MOVX 指令向扇区内的目标地址写入一个数据字节。
重复步骤 5-7,直到写完每个字节。在完成了对 FLASH 的数据写入后,PSWE 位应被清‘0’,以使 MOVX 指令不再指向程序存储器。
void Flash_Write(unsigned int DataAddr,unsigned int DataLength,unsigned char *pData)
{
bit SaveEA;
SaveEA = EA;
EA = 0;
PSCTL = 0x01;//写允许
while(DataLength--)
{
FLKEY = 0xa5;//写关键字
FLKEY = 0xf1;
(*((unsigned char xdata*)(DataAddr++))) = (*(pData++));
}
PSCTL = 0x00;//禁止写和擦除
EA = SaveEA;
}
注意:
1.Flash擦除是整块擦除,所以,写数据的时候,应先读出该扇区有用的数据,擦除后,重新写入Flash。否则全部置位0xff。
2.Flash是512字节作为一个扇区的,写入大量数据的时候,要选好地址,要知道自己用了哪几个扇区,擦除的时候,用到的扇区都应该擦除。少量数据的话,尽量把数据都放在同一个扇区,方便改写,也节省时间。
3.一些参数:
David Lee
GDUT
2010年9月28日
校验截图:
C8051F310在系统编程Flash.rar
(1.77 MB, 下载次数: 409)
[
本帖最后由 David_Lee 于 2010-9-28 14:07 编辑 ]