首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教:关于JL8 数据段和flash 模拟eeprom的问题。

请教:关于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(),才能返回新的值?


请各位大虾指教。

感谢感谢。。。。。
关注...
JL8的FLASH可以当EEPROM用吗?
热爱电子技术,愿交天下好友
这是Freescale为了提高Flash的读写次数而采用的技术,这是正确现象,如果读会读出最近一次写入的数据,ee_read()会读出最近一次写入的值。
大家都回的什么贴呀,真让人不懂。

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 ....”和“...”,正好是第一和第二。
至于写,那是连续的向下一个地址写的,要想写在同一个地址必须先擦后写,否则写就是连续的。
学后而问
继续关注中...
热爱电子技术,愿交天下好友
请问brave_infantry,jl8的ram区是怎么存放的?var怎么定义的?
自问自答吧。。。。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;
我们先前写的数就读出来了。
感谢brave_infantry的回复。
我为人人,人人为我。
什么地方有介绍这些的资料,我也在用JL8,已经晕头转向了
jb8的datasheet里面有的,用户手册也有介绍.
不断学习,摸索中进步!
上传图片总不成功,124K哦
11.2k也不行
返回列表