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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-01 10:39:15
已绑定手机

40

主题

371

回帖

839

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-01 10:39:15
已绑定手机

40

主题

371

回帖

839

积分

高级会员

积分
839
发表于 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;看看数据有没有保存进去
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-01 10:39:15
已绑定手机

40

主题

371

回帖

839

积分

高级会员

积分
839
发表于 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的操作
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-01 10:39:15
已绑定手机

40

主题

371

回帖

839

积分

高级会员

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

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

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-01 10:39:15
已绑定手机

40

主题

371

回帖

839

积分

高级会员

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

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:48 , Processed in 0.161568 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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