Board logo

标题: 请教:关于JL8 数据段和flash 模拟eeprom的问题。 [打印本页]

作者: brave_infantry    时间: 2005-6-1 13:54     标题: 请教:关于JL8 数据段和flash 模拟eeprom的问题。

我用JL8做一个小项目。碰到了下面的问题:
我有三个数据表table1,table2,table3,需要存在指定的地址:
在prm文件我这样写的:

SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
  Z_RAM       = READ_WRITE 0x0060 TO 0x00EF;
  RAM         = READ_WRITE 0x00F0 TO 0x015F;
  ROM         = READ_ONLY  0xDC00 TO 0xFBCF;
  table1_rom    = READ_ONLY  0xFBC0 TO 0xFBCE;
  table2_rom        = READ_ONLY  0xFB80 TO 0xFB8E;               
  table3_rom  = READ_ONLY  0xFBF0 TO 0xFBFF;
  
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
  DEFAULT_ROM                   INTO ROM;
  DEFAULT_RAM                   INTO RAM;
  LEDSEGMENT                    INTO table3_rom;
  LIMIT                         INTO  table2_rom;
  KVALUE                        INTO table1_rom;       
  _DATA_ZEROPAGE, MY_ZEROPAGE   INTO Z_RAM;
END

STACKSIZE 0x30

VECTOR 0 _Startup /*



在主程序里这样写的:

#pragma CONST_SEG KVALUE                        //fb80
const unsigned int k[5]={5,5,5,5,5};
#pragma CONST_SEG DEFAULT

#pragma  CONST_SEG LIMIT                                        //fbc0
const unsigned char limit[6]={0x05,0x00,0x00,0x06,0x00,0x00};
#pragma CONST_SEG DEFAULT
                                                                                                               
#pragma CONST_SEG LEDSEGMENT           //fbf0
const unsigned char LEDArray[10] = {0xFC,0x60,0xD6,0xF2,0x6A,0xBA,0xBE,0xE0,0xFE,0xFA};
#pragma CONST_SEG DEFAULT


编译后发现只有table3_rom的数据是放在指定地址的,其他数不知道放到哪里去了。(3个table我在程序里都有引用的)。
奇怪.

另外,我看codewarrior 自带的例子时,发现它的prm文件有两个:p&e_FCS_linker.prm 和P&E_ICD_LINKER.PRM,但我的项目文件里只有其中一个:p&e_FCS_linker.prm。
不知道这两个文件是怎么回事。



还有,我调用jl8 rom中的读写flash的子程序,在main.c这样生命的:
#define EE_WRITE(var) {asm LDHX @var; (*(void(*)(void))0xFD3F)();}
#define EE_READ(var) {asm LDHX @var; (*(void(*)(void))0xFDD0)();}
  
然后调用EE_WRITE(),调试时可以往flash里面写数据。但每次写的时候都是在写在上次的地址之后,不知道它内部是怎么处理的。如果我要读出我写的数据,不知道该这么调用?是不是需要自己来计算地址呢?

举个例子,比如我要设置一个产品温度超过25度就报警,我把25设为报警默认值,用户用了几天,想把它改成20度报警,用户按了设置按键之后,我的程序调用EE_WRITE(),把flash的数改成20度了。客户关机然后再开机,报警值应该还是20度。
应该到哪里去找这个新的值呢?如何调用ee_read(),才能返回新的值?


请各位大虾指教。

感谢感谢。。。。。
作者: aMonster    时间: 2005-6-1 14:52

关注...
JL8的FLASH可以当EEPROM用吗?
作者: joshuali    时间: 2005-6-6 10:33

这是Freescale为了提高Flash的读写次数而采用的技术,这是正确现象,如果读会读出最近一次写入的数据,ee_read()会读出最近一次写入的值。
作者: 8808beter    时间: 2005-6-6 17:01

大家都回的什么贴呀,真让人不懂。

1楼的要注意你有没有把这些常量声明成全局的extern呢?如果是的话,
定义的#pragma CONST_SEG KVALUE 要与 声明成全局extern的#pragma CONST_SEG KVALUE 相同,否则编译器也许会将这些内外不符合的定义都分配到DEFAULT中去。
p&e_FCS_linker.prm 和P&E_ICD_LINKER.PRM 都是你新建项目时产生的,应该是你的项目现在并没有选择ICD(硬件)模式。这句话我也说不清楚,就是如果你是用WIZARD生成的项目,那么好象是倒数第二的菜单上要多勾选第二项,即“P&E ....”和“...”,正好是第一和第二。
至于写,那是连续的向下一个地址写的,要想写在同一个地址必须先擦后写,否则写就是连续的。
作者: aMonster    时间: 2005-6-8 09:49

继续关注中...
作者: stevenqian    时间: 2005-7-4 12:24

请问brave_infantry,jl8的ram区是怎么存放的?var怎么定义的?
作者: brave_infantry    时间: 2005-7-6 10:29

自问自答吧。。。。hehe。。。

关于模拟eeprom的问题.
1.先申明,把jl8 rom里固化的函数声明出来,以便引用:
(注意:并不是所有的freescale mcu rom里面都有这个函数的,gp/gt系列的就没有,lj/lk系列好像有)

#define EE_WRITE(var) {asm LDHX @var; (*(void(*)(void))0xFD3F)();}
#define EE_READ(var) {asm LDHX @var; (*(void(*)(void))0xFDD0)();}


这样就可以直接调用EE_WRITE()和 EE_READ()了.
EE_WRITE() 的功能是对相应地址的flash进行擦写;
EE_READ()的功能是读出上次擦写后的内容(reset后也有效)。

怎么引用呢?

比如我要在FB00的地址上写3个数:1,2,3;
这样 起始地址是: FB00
        数据长度是:3
       编译器还需要知道总线频率,用一个整数来表示,这个数等与总线频率的4倍,比如总线频率是2.4M,那么这个数就是4*2.4 = 10

接下来第二步
定义一个结构类型:
struct ee {
  byte bus_speed;
  byte data_length;
  byte hi_address;
  byte low_address;
  byte data0;
  byte data1;
  byte data2;
      
  };     


这样,就定义好了一个名叫ee的结构类型

第三步,定义一个ee类型的变量:
struct ee ee1;
这样,ee1就是一个ee类型的变量

第四步,给ee1赋值
ee1.bus_speed=10;       //速度
  ee1.data_length=3;     // 数据长度
  ee1.hi_address=0xFB;   //起始地址
  ee1.low_address=0x00;
  ee1.data0=1;     //数据
  ee1.data1=2;
  ee1.data2=3;
  
最后一步,调用EE_WRITE()
EE_WRITE(ee1);
万事大吉,在fb00的起始地址上,写下了1,2,3几个数。
要注意: 调用EE_WRITE()后,中断被自动关掉了!必须手动重新打开!

如何把我写的数读出来呢?
非常方便,直接调用EE_READ()就可以了!
步骤是这样的:
再定义一个ee类型的变量ee2:
struct ee ee2

然后给ee2赋值:
ee2.bus_speed=10;
  ee2.data_length=3;
  ee2.hi_address=0xFB;
  ee2.low_address=0x00;

最后调用EE_READ()
EE_READ(ee2);
这样 ee2.data0,ee2.data1,ee2,data2分别就变成了1,2,3;
我们先前写的数就读出来了。
作者: qianwei920    时间: 2005-7-6 21:06

感谢brave_infantry的回复。
作者: hbicecream    时间: 2005-7-8 10:56

什么地方有介绍这些的资料,我也在用JL8,已经晕头转向了
作者: 流浪远方百合    时间: 2005-7-8 11:28

jb8的datasheet里面有的,用户手册也有介绍.
作者: hbicecream    时间: 2005-7-12 11:21

上传图片总不成功,124K哦
作者: hbicecream    时间: 2005-7-12 11:35

11.2k也不行




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0