找回密码
 立即注册
楼主: 神***

EEPROM的使用 请 配合比较器做掉电检测

[复制链接]

该用户从未签到

46

主题

2927

回帖

6583

积分

超级版主

积分
6583
发表于 2023-8-24 17:47:21 | 显示全部楼层
飞捷 发表于 2023-8-24 16:28
工程有用到很多中断 ,如PCA ,时间定时器,通讯等,如果程序在运行过程,操作工人想更改数据,为了不影响 ...

写入一个字节大约30~40us,写入1K字节大约40ms。EEPROM是不能频繁、经常写的,有寿命。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2927

回帖

6583

积分

超级版主

积分
6583
发表于 2023-8-24 17:58:01 | 显示全部楼层
飞捷 发表于 2023-8-24 16:30
可否在两条触发命令之后再启动中断,一边中断,一边处理EEPROM,这样可以吗?
...

可以,只是发触发命令时关一下全局中断。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    589

    积分

    高级会员

    积分
    589
    发表于 2023-8-25 13:53:06 | 显示全部楼层
    梁工 发表于 2023-8-24 17:47
    写入一个字节大约30~40us,写入1K字节大约40ms。EEPROM是不能频繁、经常写的,有寿命。 ...

    以前用按键的形式,操作人员自已按一次保存一次。现在用触摸屏走MODBUS协议,检测有数据更改变保存一次,但是设备在运行中,中途在运行中再关中断,感觉影响非常大
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    589

    积分

    高级会员

    积分
    589
    发表于 2023-8-25 14:13:42 | 显示全部楼层
    梁工 发表于 2023-8-24 17:43
    EA=0;
    _nop_();
    _nop_();

    我今晚做个实验, ISP_TRIG = 0x5A;_nop_();_nop_();_nop_();_nop_();ISP_TRIG = 0xA5;看看数据有没有保存进去
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    589

    积分

    高级会员

    积分
    589
    发表于 2023-8-26 00:11:58 | 显示全部楼层
    梁工 发表于 2023-6-26 15:13
    最好关一下总中断EA=0;因为触发命令要连续执行:
    ISP_TRIG = 0x5A;
    ISP_TRIG = 0xA5;

    void IapIdle()
    {
        IAP_CONTR = 0;                  //¹Ø±ÕIAP¹¦ÄÜ
        IAP_CMD = 0;                    //Çå³ýÃüÁî¼Ä´æÆ÷
        IAP_TRIG = 0;                   //Çå³ý´¥·¢¼Ä´æÆ÷
        IAP_ADDRH = 0x80;               //½«µØÖ·ÉèÖõ½·ÇIAPÇøÓò
        IAP_ADDRL = 0;
    }

    /*----------------------------
    ´ÓISP/IAP/EEPROMÇøÓò¶ÁÈ¡Ò»×Ö½Ú
    ----------------------------*/
    unsigned char IapReadByte(unsigned int addr)
    {
        unsigned char dat;                       //Êý¾Ý»º³åÇø

        IAP_CONTR = ENABLE_IAP;         //ʹÄÜIAP
        IAP_CMD = CMD_READ;             //ÉèÖÃIAPÃüÁî
        IAP_ADDRL = addr;               //ÉèÖÃIAPµÍµØÖ·
        IAP_ADDRH = addr >> 8;          //ÉèÖÃIAP¸ßµØÖ·
        IAP_TRIG = 0x5a;                //д´¥·¢ÃüÁî(0x5a)
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();
    _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
        IAP_TRIG = 0xa5;                //д´¥·¢ÃüÁî(0xa5)
        _nop_();                        //µÈ´ýISP/IAP/EEPROM²Ù×÷Íê³É
        dat = IAP_DATA;                 //¶ÁISP/IAP/EEPROMÊý¾Ý
        IapIdle();                      //¹Ø±ÕIAP¹¦ÄÜ

        return dat;                     //·µ»Ø
    }

    /*----------------------------
    дһ×Ö½ÚÊý¾Ýµ½ISP/IAP/EEPROMÇøÓò
    ----------------------------*/
    void IapProgramByte(unsigned int addr,unsigned char dat)
    {
        IAP_CONTR = ENABLE_IAP;         //ʹÄÜIAP
        IAP_CMD = CMD_PROGRAM;          //ÉèÖÃIAPÃüÁî
        IAP_ADDRL = addr;               //ÉèÖÃIAPµÍµØÖ·
        IAP_ADDRH = addr >> 8;          //ÉèÖÃIAP¸ßµØÖ·
        IAP_DATA = dat;                 //дISP/IAP/EEPROMÊý¾Ý
        IAP_TRIG = 0x5a;                //д´¥·¢ÃüÁî(0x5a)
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();
    _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();
    _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();     
        IAP_TRIG = 0xa5;                //д´¥·¢ÃüÁî(0xa5)
        _nop_();                        //µÈ´ýISP/IAP/EEPROM²Ù×÷Íê³É
        IapIdle();
    }

    /*----------------------------
    ÉÈÇø²Á³ý
    ----------------------------*/
    void IapEraseSector(unsigned int addr)
    {
        IAP_CONTR = ENABLE_IAP;         //ʹÄÜIAP
        IAP_CMD = CMD_ERASE;            //ÉèÖÃIAPÃüÁî
        IAP_ADDRL = addr;               //ÉèÖÃIAPµÍµØÖ·
        IAP_ADDRH = addr >> 8;          //ÉèÖÃIAP¸ßµØÖ·
        IAP_TRIG = 0x5a;                //д´¥·¢ÃüÁî(0x5a)
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();
    _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
        IAP_TRIG = 0xa5;                //д´¥·¢ÃüÁî(0xa5)
        _nop_();                        //µÈ´ýISP/IAP/EEPROM²Ù×÷Íê³É
        IapIdle();
    }



    我在中间放了15个空指令,结果不影响EEPROM的操作、、、、   用的芯片是STC15F2K60S2  LQPF32

    我的程序里面每毫秒会中断一次,还有485通讯中断等,都不影响到EEPROM的操作
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    589

    积分

    高级会员

    积分
    589
    发表于 2023-8-26 00:13:48 | 显示全部楼层
    飞捷 发表于 2023-8-26 00:11
    void IapIdle()
    {
        IAP_CONTR = 0;                  //¹Ø±ÕIAP¹¦ÄÜ

    所以麻烦STC官方得再次测试一下,这对我很重要,因为一些逻辑性问题,无法每操作一个字节都得关一次中断,这样非常麻烦。

    点评

    为了可靠,官方一直要求是连续发的触发命令。 关一下中断并不会对程序运行显著增加影响的,因为写入、擦除一旦启动,不管你是否禁止中断,PC都会停止执行程序,不能响应任何中断,直到操作完成,自动恢复运行程序和  详情 回复 发表于 2023-8-26 11:51
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2927

    回帖

    6583

    积分

    超级版主

    积分
    6583
    发表于 2023-8-26 11:51:29 | 显示全部楼层
    飞捷 发表于 2023-8-26 00:13
    所以麻烦STC官方得再次测试一下,这对我很重要,因为一些逻辑性问题,无法每操作一个字节都得关一次中断 ...

    为了可靠,官方一直要求是连续发的触发命令。
    关一下中断并不会对程序运行显著增加影响的,因为写入、擦除一旦启动,不管你是否禁止中断,PC都会停止执行程序,不能响应任何中断,直到操作完成,自动恢复运行程序和响应中断。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    16 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
    发表于 2023-9-26 03:55:50 | 显示全部楼层
    飞捷 发表于 2023-8-26 00:11
    void IapIdle()
    {
        IAP_CONTR = 0;                  //¹Ø±ÕIAP¹¦ÄÜ

    这种操作, 都不影响EEPROM的写入

    估计 STC 官方一直要求是连续发的触发命令。

    是否就是一个伪操作???
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    589

    积分

    高级会员

    积分
    589
    发表于 2023-9-26 13:43:47 | 显示全部楼层
    LAOXU 发表于 2023-9-26 03:55
    这种操作, 都不影响EEPROM的写入

    估计 STC 官方一直要求是连续发的触发命令。

    不是必须的。有些例程里面关了中断,是为了防止在中断跟主循环里同时调用EEPROM操作函数,产生自己嵌套自己的现象。  我觉得三楼这种解释比较说得通。
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
     楼主| 发表于 2023-12-10 12:06:39 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 22:48 , Processed in 0.073673 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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