越野疾驰 发表于 2025-12-25 15:42:57

使用STC32G12K128时擦除EEPROM遇到问题,向大神请教!

我在使用STC32G12K128时遇到问题,向大神请教!

我的理解,STC32G12K128的128KB Flash分为两个64KB块,
   IAP_ADDRE=0:      0:0000-0:FFFF (64KB)
   IAP_ADDRE=1:      1:0000-1:FFFF (64KB)

第一种情况:
下载程序时,我将EEPROM空间大小设置64KB,留出64KB空间给程序代码ROM,
这种情况下,读、写任意扇区、整体擦除64KB空间(每次擦除一个扇区)都正常。

第二种情况:
下载程序时,我将EEPROM空间大小设置96KB,留出32KB空间给程序代码ROM,
那么我理解的EEPROM的地址范围是:0:0000-1:7FFF
                           ROM地址范围是:1:8000-1:FFFF
这种情况下,读、写任意扇区都正常,但整体擦除96KB空间时(每次擦除一个扇区)就会死机,
出现程序代码也被擦除的现象,这是什么原因?求大神帮助!

附:扇区擦除代码:

void EEPROM_SectorErase(u32 EE_address)
{
    IAP_ENABLE();                     //设置等待时间,允许IAP操作,送一次就够
    IAP_ERASE();                         //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
                                                 //只有扇区擦除,没有字节擦除,512字节/扇区。

    //IAP_ADDRE = (u8)(EE_address >> 16); //送扇区地址高字节(地址需要改变时才需重新送地址)

    if (EE_address < 0x10000) {
            IAP_ADDRE = 0x00;        // 0x00000-0x0FFFF地址范围
      } else {
            IAP_ADDRE = 0x01;        // 0x10000-0x1FFFF地址范围
      }

    IAP_ADDRH = (u8)(EE_address >> 8);    //送扇区地址中字节(地址需要改变时才需重新送地址)
    IAP_ADDRL = (u8)EE_address;                 //送扇区地址低字节(地址需要改变时才需重新送地址)
    EEPROM_Trig();                                        //触发EEPROM操作
    DisableEEPROM();                                   //禁止EEPROM操作
}


乘风飞扬 发表于 2025-12-25 16:37:11

STC32G12K128的EEPROM分配是从FE:0000开始到FE:FFFF
超过64K后从FF:0000开始往后分配,这段空间跟程序空间重叠,需要软件进行保护
要使用96K EEPROM的话,烧录时EEPROM大小要设置128K
访问EEPROM时FF:0000~FF:7FFF(EEPROM地址1:0000~1:7FFF)空间不能进行擦写操作。

DebugLab 发表于 2025-12-25 18:27:01

看图直观一些:



页: [1]
查看完整版本: 使用STC32G12K128时擦除EEPROM遇到问题,向大神请教!