请教:关于JL8 数据段和flash 模拟eeprom的问题。
- UID
- 112003
- 性别
- 男
|
请教:关于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(),才能返回新的值?
请各位大虾指教。
感谢感谢。。。。。 |
|
|
|
|
|
- UID
- 109942
- 性别
- 男
|
关注...
JL8的FLASH可以当EEPROM用吗? |
|
|
|
|
|
- UID
- 105100
- 性别
- 男
|
这是Freescale为了提高Flash的读写次数而采用的技术,这是正确现象,如果读会读出最近一次写入的数据,ee_read()会读出最近一次写入的值。 |
|
|
|
|
|
- UID
- 106342
- 性别
- 男
|
大家都回的什么贴呀,真让人不懂。
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 ....”和“...”,正好是第一和第二。
至于写,那是连续的向下一个地址写的,要想写在同一个地址必须先擦后写,否则写就是连续的。 |
|
|
|
|
|
- UID
- 109942
- 性别
- 男
|
|
|
|
|
|
- UID
- 116173
- 性别
- 男
|
请问brave_infantry,jl8的ram区是怎么存放的?var怎么定义的? |
|
|
|
|
|
- UID
- 112003
- 性别
- 男
|
自问自答吧。。。。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;
我们先前写的数就读出来了。 |
|
|
|
|
|
- UID
- 117213
- 性别
- 男
|
|
|
|
|
|
- UID
- 113374
- 性别
- 男
|
什么地方有介绍这些的资料,我也在用JL8,已经晕头转向了 |
|
|
|
|
|
- UID
- 104734
- 性别
- 女
|
jb8的datasheet里面有的,用户手册也有介绍. |
|
|
|
|
|
- UID
- 113374
- 性别
- 男
|
|
|
|
|
|
- UID
- 113374
- 性别
- 男
|
|
|
|
|
|