在线时间2 小时
UID3104940
注册时间2015-5-20
NXP金币0
该用户从未签到
新手上路
- 积分
- 22
- 最后登录
- 2021-1-22
|
(能够帮忙解决问题的或提供有价值思路的可以有偿感谢)
请教各位大神小弟目前遇到如下情况:
硬件描述:MC9S08DZ16的芯片1k的RAM,16k的flash,2*256byte的eeprom;采用CODE WARRIOR 6.3开发环境,仿真器P&E USB Multilink interface
这款芯片我们已经用了好几年了,前面我们仅仅使用了芯片的硬件资源,包括各种外设,没有什么问题,就在去年我们使用了这款芯片自带的EEPROM后,就出现了 产品在正常使用过程中死机了,东西拿回来仿真器连上去看,发现flash内容跟当初写进去的不一样了,例如
情况1.软件启动的FFFD开始的两个字节应该是BE 7B(跳转到_Startup),发生异常后的芯片这个地方被修改了;
情况2.还有BE 81这个地址存放main函数入口地址的数据也会被修改;
情况3.随机的flash某些位置,甚至是一片区域的内容被修改了;
(上述情况都是随机发生的,不是说同一块板子同时发生上述情况,上面提到的flash被修改不是说都改成ff,而是随机改,有的是FF有的则不是)
鉴于上述flash被修改,也没有找到什么原因查看手册后发现这款芯片有flash保护的功能做如下的修改:
KEYEN | FNORED | EPGMOD | 0 | 0 | 0 | SEC | const unsigned char NVFOPT @0xFFBF = 0x60;//初始默认值为FE,
const unsigned char NVPROT_INIT @0x0000FFBD = 0X34; //0XBE00~0XFFFF Flash Protection//初始默认值为FF,不保护
本以为做了这个修改应该能防止flash被修改,然而,后面发生的更加诡异这个两个地址(0XFFBF,0XFFBD)的内容都会被随机修改,
说明1:在正常使用过程中仅有对eeprom读的操作,并没有写的操作(原先怀疑是不是程序运行时操作eeprom的时候意外操作了flash);
说明2:上面描述的flash被意外修改的情况,我们在增加flash保护之前发现不停的断电上电很容易出现flash被修改的情况(几百次上电操作就会发生),后面我们增加了flash保护后几万次断电都没问题,但是现在又出现这个问题,怀疑这个情况还跟电压什么的有关系,在特定情况下上电可能发生flash被修改的问题;
说明3:我们在用的另外一款产品同样的芯片他的保护如下设置:
const NVPROT_INIT @0x0000FFBD = 0X34; //0XBE00~0XFFFF Flash Protection
const NVOPT_INIT @0x0000FFBF = 0X00;
这款产品就没出现过前面的问题,而且这款产品的使用量很大,我不知道他这个设置与前面的设置有什么区别(在保护flash方面)
而且这边还有个问题 const unsigned char NVFOPT @0xFFBF = 0;这样编译后的程序刷到板子里面不跑只有const NVOPT_INIT @0x0000FFBF = 0X00;这样才可以,不知道什么原因??
下面是我工程的.prm文件
/* This is a linker parameter file for the mc9s08dz16 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */
SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
Z_RAM = READ_WRITE 0x0080 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x047F;
ROM = READ_ONLY 0xBE00 TO 0xFFAD;
EEPROM = READ_ONLY 0x1700 TO 0x17FF;
/* INTVECTS = READ_ONLY 0xFFC0 TO 0xFFFF; Reserved for Interrupt Vectors */
END
PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
DEFAULT_RAM, /* non-zero page variables */
INTO RAM;
_PRESTART, /* startup code */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
DEFAULT_ROM,
COPY /* copy down information: how to initialize variables */
INTO ROM;
_DATA_ZEROPAGE, /* zero page variables */
MY_ZEROPAGE INTO Z_RAM;
END
STACKSIZE 0x80
VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
|
|