打印
[其它应用]

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

[复制链接]
1801|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2018-6-14 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何掉电时保存RAM数据到类EEPROM,上电后根据情况重新写入RAM
沙发
songqian17| | 2018-6-14 15:29 | 只看该作者

楼主可以详细说说

使用特权

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

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

使用特权

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

/*---------------------------------------------------------------------------
;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| | 2018-6-14 15:38 | 只看该作者

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| | 2018-6-14 15:41 | 只看该作者

//恢复ram 到temp[6]
FLASHCON = 1;
for(i=0;i<6;i++)
{
      temp[ i ] = XBYTE[768+i]; //  在eeprom的 page3;
}
FLASHCON = 0;

使用特权

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

使用特权

评论回复
8
huanghuac| | 2018-6-14 15:49 | 只看该作者
是的,并且最好将LVR打开。

使用特权

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

使用特权

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

使用特权

评论回复
11
bqyj| | 2018-6-14 15:58 | 只看该作者
用AD判断估计没几个MCU可以达到你的要求。

使用特权

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

使用特权

评论回复
13
tian111|  楼主 | 2018-6-14 16:09 | 只看该作者
搞定了,呵呵,犯了低级错误……结贴啦,多谢各位

使用特权

评论回复
14
songqian17| | 2018-6-14 16:12 | 只看该作者
//****************************************************************
//EEPROM读写操作
//****************************************************************
void Read_EEPROM(void)
{   //uchar i;
//step 1
        EA = 0;                                        //禁用中断
//step 2
    FLASHCON|= 0x01;        //选择类EEPROM
//step 3
        XPAGE          = 0x03;            //选择3扇区()
        IB_OFFSET= 0;                    //载入ROM地址00~256
//step 4
    SMG_Min[0]=IB_DATA;                        //载入数据
//step 5
        IB_CON1         = 0x6E;                //设置为编程操作
        IB_CON2         = 0x05;                //流程控制
        IB_CON3         = 0x0A;
        IB_CON4         = 0x09;
        IB_CON5         = 0x06;
//step 6
        _nop_();                                //稳定FLASH编程
        _nop_();
        _nop_();
        _nop_();
//step 7
    XPAGE    = 0x00;        //step 8,清零页寄存器
    FLASHCON &=0xFE;        //退出类EEPROM
    EA = 1;                 //恢复中断
  
}
//****************************************************************
//EEPROM读写操作
//****************************************************************
void Wr_EEPROM(void)
{   //uchar i;
//step 1
        EA = 0;                                        //禁用中断
//step 2
    FLASHCON|= 0x01;        //选择类EEPROM
//step 3
        XPAGE          = 0x03;            //选择3扇区()
        IB_OFFSET= 0;                    //载入ROM地址00~256
//step 4
        IB_DATA         = SMG_Min[0];                        //载入数据
//step 5
        IB_CON1         = 0x6E;                //设置为编程操作
        IB_CON2         = 0x05;                //流程控制
        IB_CON3         = 0x0A;
        IB_CON4         = 0x09;
        IB_CON5         = 0x06;
//step 6
        _nop_();                                //稳定FLASH编程
        _nop_();
        _nop_();
        _nop_();
//step 7
    XPAGE    = 0x00;        //step 8,清零页寄存器
    FLASHCON &=0xFE;        //退出类EEPROM
    EA = 1;                 //恢复中断
}
//*************************
按以上方式不行,不知那里错了,请前辈指导,多谢

使用特权

评论回复
15
kenan64286| | 2018-7-4 13:58 | 只看该作者
huwr 发表于 2018-6-14 15:46
你的程序里面有 擦除,写入指令,在极端情况下(强干扰或者手摸晶振)搞不好会程序跑飞掉,将code擦除,可 ...

你能详细说一下怎么增加判断寄存器吗?我现在程序就是会跑飞,导致FLASH里写入错误的数

使用特权

评论回复
16
那嗰杰| | 2019-9-3 17:04 | 只看该作者
楼主我也遇到这个问题,请问你能否发一份让我参考下

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝