梁工
发表于 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)