打印
[其它应用]

如何掉电时保存RAM数据到类EEPROM上电后根据情况重新写入RAM

[复制链接]
2028|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanglli|  楼主 | 2013-12-1 12:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何掉电时保存RAM数据到类EEPROM,上电后根据情况重新写入RAM
沙发
lium| | 2013-12-1 12:04 | 只看该作者
楼主可以详细说说

使用特权

评论回复
板凳
zhanglli|  楼主 | 2013-12-1 12:06 | 只看该作者
设计一款外贸产品,本来是用166芯片掉电模式,但是由于该芯片功耗较大,只能支持15秒左右,外贸产品,对掉电时间有要求,需要7分钟以上,于是外置了电容电路,根据重新上电电容残留电量检测AD值判断掉电时间,当在掉电时间内,重新恢复到原先状态

当检测不到几个过零点后,判断出掉电,迅速把RAM数据保存在类EEPROM里

使用特权

评论回复
地板
zhanglli|  楼主 | 2013-12-1 12:08 | 只看该作者
以下是部分程序,就是不知道这个保存和重新写回怎么操作,望高手解答

/*---------------------------------------------------------------------------
;EraseFlash
;erase the whole sector of Flash ROM
;--------------------------------------------------------------------------*/
         EA = 0;                //step 1 ,关闭中断
         FLASHCON |=0x01;         //选择类EEPROM

        XPAGE          = 0x03;        //step 2 ,设置擦除的扇区3
         
         IB_CON1         = 0xE6;        //step 3,设置擦除操作
         IB_CON2         = 0x05;        //时序的要求,固定不变
         IB_CON3         = 0x0A;        //时序的要求,固定不变
         IB_CON4         = 0x09;        //时序的要求,固定不变
         IB_CON5         = 0x06;        //时序的要求,固定不变

        _nop_();                //step 4,进入擦除状态
         _nop_();
         _nop_();
         _nop_();
         //---------------------------------------

        XPAGE          = 0x00;        //step 7,清零页寄存器
         FLASHCON &=0xFE;        //退出类EEPROM
         EA = 1;                        //恢复中断
/*---------------------------------------------------------------------
;write EEPROM
;----------------------------------------------------------------------*/
         EA = 0;                        //step 1 ,关闭中断
         FLASHCON |=0x01;         //选择类EEPROM

        XPAGE          = 0x03;        //step 2 ,设置写的扇区3
         IB_OFFSET= 0x00;        //设置写的地址,范围00-255

        // IB_DATA         = 0x88;        //step 3,设置写的数据
         
           这里要写RAM到EEPROM 请问怎么写
         
                 IB_CON1         = 0x6E;        //step 4,设置写操作
         IB_CON2         = 0x05;        //时序的要求,固定不变
         IB_CON3         = 0x0A;        //时序的要求,固定不变
         IB_CON4         = 0x09;        //时序的要求,固定不变
         IB_CON5         = 0x06;        //时序的要求,固定不变

        _nop_();                //step 5,进入写状态
         _nop_();
         _nop_();
         _nop_();        
         //---------------------------------------

        XPAGE          = 0x00;        //step 8,清零页寄存器
         FLASHCON &=0xFE;        //退出类EEPROM
         EA = 1;                        //恢复中断


/*---------------------------------------------------------------
;read EEPROM mode1 读类EEPROM方法
;-----------------------------------------------------------------*/
这里要恢复RAM,怎么写

使用特权

评论回复
5
hanwe| | 2013-12-1 12:10 | 只看该作者
unsigned char i;
         XPAGE          = 0x03;        //step 2 ,设置写的扇区3
         IB_OFFSET= 0x00;        //设置写的地址,范围00-255
          //假设你的ram是一个数组,temp[6]
         for(i=0;i<6;i++)
     {
           IB_DATA = temp[ i ];//
         // IB_DATA         = 0x88;        //step 3,设置写的数据
      
          // 这里要写RAM到EEPROM 请问怎么写

                IB_CON1         = 0x6E;        //step 4,设置写操作
         IB_CON2         = 0x05;        //时序的要求,固定不变
         IB_CON3         = 0x0A;        //时序的要求,固定不变
         IB_CON4         = 0x09;        //时序的要求,固定不变
         IB_CON5         = 0x06;        //时序的要求,固定不变

        _nop_();                //step 5,进入写状态
         _nop_();
         _nop_();
         _nop_();      
         //---------------------------------------
        IB_OFFSET++;
        }
         XPAGE          = 0x00;        //step 8,清零页寄存器
         FLASHCON &=0xFE;        //退出类EEPROM
         EA = 1;                        //恢复中断

使用特权

评论回复
6
llia| | 2013-12-1 12:11 | 只看该作者
//恢复ram 到temp[6]
FLASHCON = 1;
for(i=0;i<6;i++)
{
      temp[ i ] = XBYTE[768+i]; //  在eeprom的 page3;
}
FLASHCON = 0;

使用特权

评论回复
7
wangpe| | 2013-12-1 12:12 | 只看该作者
你的程序里面有 擦除,写入指令,在极端情况下(强干扰或者手摸晶振)搞不好会程序跑飞掉,将code擦除,可以在程序内部增加一个判断寄存器,判断程序是否正常进入了烧写或者擦除子程序。

使用特权

评论回复
8
langgq| | 2013-12-1 12:14 | 只看该作者
是的,并且最好将LVR打开。

使用特权

评论回复
9
zhanglli|  楼主 | 2013-12-1 12:16 | 只看该作者
多谢,但是如果不是数组,是很多变量,把128byte的ram空间几乎用完了,怎么简单设置全部读取,保存呢

使用特权

评论回复
10
wangzsa| | 2013-12-1 12:18 | 只看该作者
只能一个一个写入了,没有什么办法了。可以使用XDATA

使用特权

评论回复
11
zhuww| | 2013-12-1 12:19 | 只看该作者
用AD判断估计没几个MCU可以达到你的要求。

使用特权

评论回复
12
zhanglli|  楼主 | 2013-12-1 12:21 | 只看该作者
多谢各位,明白了

使用特权

评论回复
13
unmwq| | 2014-3-28 16:44 | 只看该作者
路过

使用特权

评论回复
14
加油吧小鱼儿| | 2014-4-1 23:43 | 只看该作者
不懂,没看明白什么意思,觉得跟我原来做的不一样

使用特权

评论回复
15
id472897568| | 2014-4-3 17:27 | 只看该作者
wangpe 发表于 2013-12-1 12:12
你的程序里面有 擦除,写入指令,在极端情况下(强干扰或者手摸晶振)搞不好会程序跑飞掉,将code擦除,可 ...

这个判断寄存器是程序里面自带的,还是自己再程序里面加的?能说清楚点吗?现在正在做这个?

使用特权

评论回复
16
id472897568| | 2014-4-3 17:28 | 只看该作者
wangpe 发表于 2013-12-1 12:12
你的程序里面有 擦除,写入指令,在极端情况下(强干扰或者手摸晶振)搞不好会程序跑飞掉,将code擦除,可 ...

是不是可以做一个备份呢?谢谢了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1016

主题

9386

帖子

1

粉丝