cloudy 发表于 2024-7-18 16:43:10

烧录时EEPROM 设置


用STC8G2K64S4, 我的这个HEX文件50K,那EEPROM还能怎么设置?我设置过很多选项,存储后的数据都变了

DebugLab 发表于 2024-7-18 16:57:17

absacc.h是个好东西
没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些
读EEPROM
IAP寄存器访问的是相对地址,首地址为0
MOVC访问的是绝对地址,EEPROM从后向前规划,首地址由STCISP决定(可自定义EEPROM大小的型号)


#include <absacc.h>

#define                IAP_OFFSET      0x2000      //EEPROM首地址(STC8G1K08A)


void Iap_Idle(void)
{
      IAP_CONTR&=~IAPEN;
      IAP_CMD=IAP_IDL;
      IAP_TRIG=0x00;
      IAP_ADDRH=0x80;
      IAP_ADDRL=0x00;
}

unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
{
      return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
}

//unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
//{
//      unsigned char dat;
//      unsigned int add;
//      add=sector*0x0200+addr;
//      IAP_CONTR|=IAPEN;
//      IAP_TPS=IAP_TPS_;
//      IAP_CMD=IAP_READ;
//      IAP_ADDRL=add;
//      IAP_ADDRH=add>>8;
//      IAP_TRIG=0x5A;
//      IAP_TRIG=0xA5;
//      _nop_();
//      dat=IAP_DATA;
//      Iap_Idle();
//      return dat;
//}

void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
{
      unsigned int add;
      add=sector*0x0200+addr;
      IAP_CONTR|=IAPEN;
      IAP_TPS=IAP_TPS_;
      IAP_CMD=IAP_WRITE;
      IAP_ADDRL=add;
      IAP_ADDRH=add>>8;
      IAP_DATA=dat;
      IAP_TRIG=0x5A;
      IAP_TRIG=0xA5;
      _nop_();
      Iap_Idle();
}

void Iap_Erase_Sector(unsigned char sector)
{
      unsigned int add;
      add=sector*0x0200;
      IAP_CONTR|=IAPEN;
      IAP_TPS=IAP_TPS_;
      IAP_CMD=IAP_ERASE;
      IAP_ADDRL=add;
      IAP_ADDRH=add>>8;
      IAP_TRIG=0x5A;
      IAP_TRIG=0xA5;
      _nop_();
      Iap_Idle();
}

yao眼的光 发表于 2024-7-18 17:14:44


程序空间和EEPROM空间划分可以在下载软件上选你要的分配方式

页: [1]
查看完整版本: 烧录时EEPROM 设置