梁工 发表于 2023-8-24 17:47:21

飞捷 发表于 2023-8-24 16:28
工程有用到很多中断 ,如PCA ,时间定时器,通讯等,如果程序在运行过程,操作工人想更改数据,为了不影响 ...

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

梁工 发表于 2023-8-24 17:58:01

飞捷 发表于 2023-8-24 16:30
可否在两条触发命令之后再启动中断,一边中断,一边处理EEPROM,这样可以吗?
...

可以,只是发触发命令时关一下全局中断。

飞捷 发表于 2023-8-25 13:53:06

梁工 发表于 2023-8-24 17:47
写入一个字节大约30~40us,写入1K字节大约40ms。EEPROM是不能频繁、经常写的,有寿命。 ...

以前用按键的形式,操作人员自已按一次保存一次。现在用触摸屏走MODBUS协议,检测有数据更改变保存一次,但是设备在运行中,中途在运行中再关中断,感觉影响非常大

飞捷 发表于 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;看看数据有没有保存进去

飞捷 发表于 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的操作、、、、   用的芯片是STC15F2K60S2LQPF32

我的程序里面每毫秒会中断一次,还有485通讯中断等,都不影响到EEPROM的操作

飞捷 发表于 2023-8-26 00:13:48

飞捷 发表于 2023-8-26 00:11
void IapIdle()
{
    IAP_CONTR = 0;                  //¹Ø±ÕIAP¹¦ÄÜ


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

梁工 发表于 2023-8-26 11:51:29

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

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

LAOXU 发表于 2023-9-26 03:55:50

飞捷 发表于 2023-8-26 00:11
void IapIdle()
{
    IAP_CONTR = 0;                  //¹Ø±ÕIAP¹¦ÄÜ


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

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

是否就是一个伪操作???

飞捷 发表于 2023-9-26 13:43:47

LAOXU 发表于 2023-9-26 03:55
这种操作, 都不影响EEPROM的写入

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


不是必须的。有些例程里面关了中断,是为了防止在中断跟主循环里同时调用EEPROM操作函数,产生自己嵌套自己的现象。我觉得三楼这种解释比较说得通。

神农鼎 发表于 2023-12-10 12:06:39



完整的系统设计参考原理图@STC8H8K64U, @STC32G12K128 - 电源/复位/省电模式/外部晶振/内部时钟/对外时钟输出/PLL-144MHz时钟 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)







页: 1 [2] 3 4 5 6
查看完整版本: EEPROM的使用 请 配合比较器做掉电检测