6932|21

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎样通过程序读写只读程序存储器 [复制链接]

cc2430芯片,里面有个51,有128K的闪存,低55K是一个16位的程序只读存储器,

我想存储十几字节的数据到这个程序存储器,为的是这些数据掉电不丢失,

我直接对低55K地址直接进行读写,发现只能读,不能写。

请问怎样通过程序的方法对这个程序存储器进行读写呢?

网上看到说,把这些数据定义成特殊的数据类型,这个类型的数据就是放在只读存储器上的,请问这个数据怎么定义呢?
cc2430支持这样的数据类型么?

最新回复

PUDN上应该有现成的程序,你去找找看看  详情 回复 发表于 2009-4-1 21:40
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的这十几字节的数据需要改变么? 如果固定不变,直接坐在程序里不就行了? 2430我没用过,不知道他内部的闪存是否支持在线擦写!
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这十几个字节的数据隔几天修改一次,不能每次修改都像烧程序那样.需要通过程序,直接对它进行修改
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
既然这55K是“只读存储器”,那你得看datasheet中有没有开放这部分的“写”接口方法。如果没有,就不支持写。

直接将数据写到55K之外的其余FLASH中去就行。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
只有这个地方,放数据掉电不丢失.
我也没有看到datasheet中有写的接口
还有其他办法么?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
flash中也是掉电不丢失的。RAM中才会丢失。也就是说128KB的闪存,都是能保存数据的。
你先详细了解一下RAM ROM FLASH这些存储器的差异,对你后续研发有好处。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
初略地看了一下datasheet,好像要先将FLASH映射为XDATA(仅限FLASH的最低56K),然后当作XDATA访问就可以了。你自己再仔细地读一下datasheet吧,应该说的很清楚。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

8
 
数据手册上写XDATA的低56字节是FLASH ,可是我是在 IAR环境下 用C写的,不知道怎么把数据放在指定的地址XDATA上
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

9
 
直接向你希望的地址进行操作就行
#define DATA1 ((volatile xdata*)0x0001)
#define DATA2 ((volatile xdata*)0x0010)

DATA1 = 0x3F; //向固定地址0x1上写入0x3F

char tmp = DATA2; //从固定地址0x10读出数据到tmp
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
哦,sorry刚才的#define里面都忘了加个*,才是取值。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
使用绝对地址指针啊
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 9 楼 shuiyan 的回复:
哦,sorry刚才的#define里面都忘了加个*,才是取值。


哪里需要加一个 * 呢?
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

13
 
我用的芯片是cc2430 运行环境是IAR

我用了 shuiyan  的方法:
定义 #define DATA1 ((volatile xdata*)0x0010) 没有报错,
但是给 DATA1 = 0X0F 赋值时,对这句话报有两个错误,一个警告,如下:
错误1:Error[Pe018]: expected a ")"
错误2:Error[Pe137]: expression must be a modifiable lvalue
警告1:Warning[Pe191]: type qualifier is meaningless on cast type

不知道是不是cc2430u不支持这样定义绝对地址

 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
DATA1 = 0X0F 赋值时,报错的原因找到了,必须在定义地址的时候就给这个地址赋值
#define DATA1 ((volatile xdata*)0x0010) = 0x0F

可是又出现了新的问题,赋值以后
我读DATA1 的值为0x0F,但读地址0x0010时,地址0x0010的值还是0x00

这个地址是cc2430里面闪存的地址,可是数据并没有真正写到程序寄存器,还是不见了。怎样让数据不丢失呢?
就是以后读这个地址,还是能读到以前放进去的数。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
你操作的是内部ROM区域,那就去掉xdata。随手写的,造成你的错误,sorry。

#define DATA1 (*(volatile char*)0x0001) //这里的char也可以用data和idata。
DATA1 = 0x0E; //写入
char value = DATA1; //读出

data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
呵呵,原来如此。

哥哥,既然人家名字叫只读存储器,你好歹尊重一下别人好不好。你随便用个赋值语句就可以往里头写东西,那还叫只读存储器啊?给你打个比喻吧,如果一个鸡叫RAM,你想怎么搞怎么搞;那如果遇到一个美女叫ROM,你就不能想怎么搞怎么搞了,得多想点办法,才能征服的。

这样的片上ROM区要写入的话必须调用写入接口函数,类似的writeflash(addr, pbuf, len).注意,这里头的数据一般是按页存储的,要先按页擦除,然后再写入。擦除之前要备份页内其它有用的数据。而且注意擦写是有时间的,要防止操作过程中掉电,造成数据区乱掉,程序中要有保护机制。

 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
又想要美女,又不肯想办法,天下哪有这么美的事情啊?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

18
 
呵呵,经过这两天的尝试,发现这个闪存是按页写的,先擦除页,再写数据.

数据是写进去了,可现在还没有读出来,这个闪存一个页上的一个地址写4个字节,

现在还不知道怎么把数据读出来,等我把数据读出来,再告诉大家.

谢谢各位了!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

19
 
网上找了个汇编,问题解决了
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

20
 
解决方法:找了个cc2430的样例程序,发现里面有个这方面的例子,修改修改就可以用了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表