打印
[其它应用]

保存RAM数据到类EEPROM

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

使用特权

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

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

使用特权

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

/*---------------------------------------------------------------------------
;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
chenho| | 2015-6-1 20:11 | 只看该作者
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
gongche| | 2015-6-1 20:11 | 只看该作者
//恢复ram 到temp[6]
FLASHCON = 1;
for(i=0;i<6;i++)
{
      temp[ i ] = XBYTE[768+i]; //  在eeprom的 page3;
}
FLASHCON = 0;

使用特权

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

使用特权

评论回复
8
huanghuac| | 2015-6-1 20:12 | 只看该作者
是的,并且最好将LVR打开。

使用特权

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

使用特权

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

使用特权

评论回复
11
冰清玉洁| | 2015-6-1 20:12 | 只看该作者
用AD判断估计没几个MCU可以达到你的要求。

使用特权

评论回复
12
wenfen| | 2015-6-1 20:13 | 只看该作者
这个判断寄存器是程序里面自带的,还是自己再程序里面加的?能说清楚点吗?现在正在做这个?

使用特权

评论回复
13
tian111|  楼主 | 2015-6-1 20:13 | 只看该作者

多谢各位,明白了

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝