查看: 1912|回复: 0

MC9S08DZ16正常运行时FLASH意外丢失

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
22
最后登录
2021-1-22
发表于 2021-1-22 15:18:52 | 显示全部楼层 |阅读模式
(能够帮忙解决问题的或提供有价值思路的可以有偿感谢)
请教各位大神小弟目前遇到如下情况:
硬件描述: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. */




回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-20 06:23 , Processed in 0.109586 second(s), 18 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表