Avid+ 发表于 2024-4-6 14:41:13

屠龙刀3,EEPROM读写的问题

unsigned long t1;
unsigned long t2;
unsigned long i;
unsigned long i2;
复制stc32G手册内容
void IapIdle()
{
      IAP_CONTR = 0;
      IAP_CMD = 0;
      IAP_TRIG = 0;
      IAP_ADDRE = 0x00;
      IAP_ADDRH = 0x00;
      IAP_ADDRL = 0x00;
}

char IapRead(unsigned long addr)
{
      char datt;
      
      IAP_CONTR = 0x80;
      IAP_TPS = 24;
      IAP_CMD = 1;
      IAP_ADDRL = addr;
      IAP_ADDRH = addr>>8;
      IAP_ADDRE = addr>>16;
      IAP_TRIG = 0x5a;
      IAP_TRIG = 0xa5;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      datt = IAP_DATA;
      IapIdle();
      
      return datt;
}

void IapProgram(unsigned long addr,char datt)
{
      IAP_CONTR = 0x80;
      IAP_TPS = 24;
      IAP_CMD = 2;
      IAP_ADDRL = addr;
      IAP_ADDRE = addr>>16;
      IAP_ADDRH = addr>>8;
      IAP_DATA = datt;
      IAP_TRIG = 0x5a;
      IAP_TRIG = 0xa5;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      datt = IAP_DATA;
      IapIdle();      
}

void IapErase(unsigned long addr)
{
      IAP_CONTR = 0x80;
      IAP_TPS = 24;
      IAP_CMD = 3;
      IAP_ADDRL = addr;
      IAP_ADDRE = addr>>16;
      IAP_ADDRH = addr>>8;
      IAP_TRIG = 0x5a;
      IAP_TRIG = 0xa5;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      IapIdle();      
}

void main(void)
{
      
i = 1;
i2 = 2;

IapErase(0x8000);
IapProgram(0x8000,i);
t1 = IapRead(0x8000);
      
IapErase(0x9000);
IapProgram(0x9000,i2);
t2 = IapRead(0x9000);
}
先写进EEPROM然后读出是对的。
void main(void)
{
t1 = IapRead(0x8000);
t2 = IapRead(0x9000);
}
然后改成这样再读t1,t2都是 0,是不是没写进去?
请问是什么原因呢?
我是自学新手,论坛的其它例子还不会转换。

Avid+ 发表于 2024-4-6 15:19:43

会不会这地址不是EEPROM的地址? 没断电读出是正确的,断电再读就是 0 了

21cnsound 发表于 2024-4-6 16:46:16

第二次的main是后来又重新下载了一次吧?STC-ISP下载hex到MCU时默认时清除EEPROM缓冲区的,第二次下载时取消清除EEPROM缓冲区就可以读出了。

Avid+ 发表于 2024-4-6 17:02:38

我试验了 STC-ISP设置用户EEPROM大小为8K以上就正常了。
页: [1]
查看完整版本: 屠龙刀3,EEPROM读写的问题