打印

请问掉电时RAM数据保存与恢复,C语言如何写

[复制链接]
2669|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hggen|  楼主 | 2011-1-8 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何掉电时保存RAM数据到类EEPROM,上电后根据情况重新写入RAM
本帖最后由 hggen 于 2011-1-8 13:32 编辑

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

当检测不到几个过零点后,判断出掉电,迅速把RAM数据保存在类EEPROM里
以下是部分程序,就是不知道这个保存和重新写回怎么操作,望高手解答

/*---------------------------------------------------------------------------
;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,怎么写
沙发
bananarer| | 2011-1-10 09:14 | 只看该作者
本帖最后由 bananarer 于 2011-1-11 08:46 编辑

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;                        //恢复中断

使用特权

评论回复
板凳
bananarer| | 2011-1-10 09:14 | 只看该作者
//恢复ram 到temp[6]
FLASHCON = 1;
for(i=0;i<6;i++)
{
     temp[ i ] = XBYTE[768+i]; //  在eeprom的 page3;
}
FLASHCON = 0;

使用特权

评论回复
地板
bananarer| | 2011-1-10 09:25 | 只看该作者
本帖最后由 bananarer 于 2011-1-10 09:34 编辑

由于你的程序里面有 擦除,写入指令,在极端情况下(强干扰或者手摸晶振)搞不好会程序跑飞掉,将code擦除,可以在程序内部增加一个判断寄存器,判断程序是否正常进入了烧写或者擦除子程序。并且最好将LVR打开。
例如附件的例子所示。
ssp.rar (571 Bytes)

使用特权

评论回复
5
hggen|  楼主 | 2011-1-10 20:34 | 只看该作者
谢谢楼上的朋友,程序我慢慢去看下,但是如果不是数组,是很多变量,把128byte的ram空间几乎用完了,怎么简单设置全部读取,保存呢

使用特权

评论回复
6
bananarer| | 2011-1-11 08:46 | 只看该作者
只能一个一个写入了,没有什么办法了。可以使用XDATA

使用特权

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

本版积分规则

0

主题

14

帖子

0

粉丝