FYP0303 发表于 2023-2-20 04:00:15

STC8G1K17 flash做EEROM存储问题。

本帖最后由 FYP0303 于 2023-2-20 05:10 编辑

在使用该芯片时,采用官方例程“10-通过串口1发送命令读写EEPROM测试程序”测试,烧录时选择的是分配1K的空间作为EEpROM,读写都是正常的。发送“W 0x0000 0123456789”“R 0x0000 10”指令读写正常,甚至将地址改成0x01f0读写也正常,当地址是0x03f0(“W 0x03f0 0123456789” )读写也正常。测试当地址是0x03fa时出错,推测此时是地址超出刚才分配的1K空间的原因。


之后,将eeprom.c和eeprom.h加载到项目中,并增加如下程序。


//===========================================================================================================================================================================
void Write_SenPar(void)
{
      uint8 i;
      uint8 Buff;
      
      EEPROM_read_n(0x0200,Buff,128);
      for(i=0;i<4;i++)
      {
                Buff                =Global.uhex;
                Buff      =Global.uhex;
               
                Buff      =Zero_Dat.uhex;
                Buff      =Zero_Dat.uhex;
      }
      EEPROM_SectorErase(0x0200);
      EEPROM_write_n(0x0200,Buff,128);
}
//===========================================================================================================================================================================
void Ram_Init(void)
{
      uint8 i;
      uint8 Buff;
      
      EEPROM_read_n(0x0200,Buff,128);
      
      for(i=0;i<4;i++)
      {
                Global.uhex      =Buff;
                Global.uhex      =Buff;
      }
      
      if(Zero_X_Flag)               //Zero_X_Flag和Zero_Y_Flag在执行Write_SenPar()时被修改为1.#define      Zero_X_Flag                        Global.flag.b0,#define      Zero_Y_Flag                        Global.flag.b1
      {
                for(i=0;i<4;i++)
                        Zero_Dat.uhex      =Buff;
      }
      else
                Zero_Dat.Float      =0.0;
      
      if(Zero_Y_Flag)
      {
                for(i=0;i<4;i++)
                        Zero_Dat.uhex      =Buff;
      }
      else
                Zero_Dat.Float      =0.0;
      
}


在main函数一开始就进行了Ram_Init(),在另一处函数中写入参数。


//===========================================================================================================================================================================
void Zero_XY_Fun(void)
{
      Zero_Dat.Float      =Angle_Old;
      Zero_Dat.Float      =Angle_Old;
      Zero_X_Flag      =1;
      Zero_Y_Flag      =1;
      Write_SenPar();
}

另外,注意到,每次烧录程序的时候,之前保存在用户eeprom中的数据会被清除掉,即使我取消勾选“下次下载用户程序时擦出用户EEPROM区”,甚至我同时取消勾选“清除EEPROM缓冲区”,结果都会擦除掉。

再咨询一下,主频一样的情况下,STC8G2K48S2的功耗和STC8G1K17(4mA左右)是否差不多?二者的代码是否能兼容?主要使用一下功能:2路CCP捕获功能计算占空比,串口输出,EEPROM,1路ADC,2路定时器。如果二者兼容或者是代码改动很小,考虑换STC8G2K48S2.

执行完Zero_XY_Fun后,显示是预期的操作结果。重新上电后,Ram_Init()的初始化并没有将Zero_Dat.Float和Zero_Dat.Float保存的结果读出来。

请帮忙看一下,主要原因在哪里。

乘风飞扬 发表于 2023-2-20 13:29:27

大部分芯片的ID号在烧录时STC-ISP程序会从芯片里读出来存放在Flash最后一个扇区的最后位置,你的EEPROM设置1K的话,芯片ID号就存放在EEPORM的0x03f9~0x03ff位置。所以直接写这块地址的数据会出错,擦除后再写应该就没有问题。
STC8G1K17是IAP类型芯片,每次烧录时固定会擦除整个Flash,取消“下次下载用户程序时擦除EEPROM区”勾选对旧版本IAP类型芯片无效,以下新版本固件的芯片才会有效:

FYP0303 发表于 2023-2-20 16:12:03

乘风飞扬 发表于 2023-2-20 13:29
大部分芯片的ID号在烧录时STC-ISP程序会从芯片里读出来存放在Flash最后一个扇区的最后位置,你的EEPROM设置 ...

我先改版加个EEROM上去,毕竟I2C我也调试过,用起来方便。等以后需要修改的时候再换型号。
页: [1]
查看完整版本: STC8G1K17 flash做EEROM存储问题。