10687|12

2751

帖子

0

TA的资源

裸片初长成(初级)

楼主
 

C8051F310在系统编程Flash [复制链接]

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 编辑 ]
此帖出自单片机论坛

最新回复

感谢楼主哈哈哈哈,终于找到问题了   详情 回复 发表于 2024-9-27 10:00
点赞 关注
 

回复
举报

2751

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
最近弄点小东西,发现C8051F这个功能挺好的,不用外扩eeprom就可以掉电保留参数,在程序中就可以读写flash,好像有些公司的某些芯片也可以这样,比如飞思卡尔。我是第一次用,记录一下,哈哈。记得不要擦写到程序用到的flash内容啊,不然跑飞了都不知道怎么回事。
此帖出自单片机论坛
 
 

回复

978

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
不错,你很则劲的
此帖出自单片机论坛
 
 
 

回复

2万

帖子

71

TA的资源

管理员

4
 

回复 沙发 David_Lee 的帖子

此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

826

帖子

3

TA的资源

五彩晶圆(初级)

5
 
k不错。。支持LZ
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 

很好

无私的版主,非常感谢,大家要向你学习,互相贡献知识!
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 

谢谢

谢谢分享,
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
很感谢 我做的 只有支持
此帖出自单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

9
 

写得不错,顶!!!

写得不错,顶!!!
此帖出自单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

10
 

弱弱问下

C8051f310的集成开发环境是啥呀keil么?
此帖出自单片机论坛

点评

貌似不是吧!好像是IDE唉!  详情 回复 发表于 2014-9-10 10:53
 
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

11
 

原帖由 liulixhao 于 2011-9-26 22:55 发表 C8051f310的集成开发环境是啥呀keil么?

 

Keil是支持的C8051F的

也可以用SiLabs IDE

此帖出自单片机论坛
 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(中级)

12
 
liulixhao 发表于 2011-9-26 22:55
C8051f310的集成开发环境是啥呀keil么?

貌似不是吧!好像是IDE唉!
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 

感谢楼主哈哈哈哈,终于找到问题了

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表