找回密码
 立即注册
查看: 971|回复: 2

STC8G1K17 flash做EEROM存储问题。

[复制链接]

该用户从未签到

2

主题

1

回帖

16

积分

新手上路

积分
16
发表于 2023-2-20 04:00:15 | 显示全部楼层 |阅读模式
本帖最后由 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[128];
        
        EEPROM_read_n(0x0200,Buff,128);
        for(i=0;i<4;i++)
        {
                Buff                =Global[0].uhex;
                Buff[i+4]        =Global[1].uhex;
               
                Buff[i+16]        =Zero_Dat[0].uhex;
                Buff[i+20]        =Zero_Dat[1].uhex;
        }
        EEPROM_SectorErase(0x0200);
        EEPROM_write_n(0x0200,Buff,128);
}
//===========================================================================================================================================================================
void Ram_Init(void)
{
        uint8 i;
        uint8 Buff[128];
        
        EEPROM_read_n(0x0200,Buff,128);
        
        for(i=0;i<4;i++)
        {
                Global[0].uhex        =Buff;
                Global[1].uhex        =Buff[i+4];
        }
        
        if(Zero_X_Flag)                 //Zero_X_Flag和Zero_Y_Flag在执行Write_SenPar()时被修改为1.#define        Zero_X_Flag                        Global[0].flag.b0,#define        Zero_Y_Flag                        Global[0].flag.b1
        {
                for(i=0;i<4;i++)
                        Zero_Dat[0].uhex        =Buff[i+16];
        }
        else
                Zero_Dat[0].Float        =0.0;
        
        if(Zero_Y_Flag)
        {
                for(i=0;i<4;i++)
                        Zero_Dat[1].uhex        =Buff[i+20];
        }
        else
                Zero_Dat[1].Float        =0.0;
        
}


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


//===========================================================================================================================================================================
void Zero_XY_Fun(void)
{
        Zero_Dat[0].Float        =Angle_Old[0];
        Zero_Dat[1].Float        =Angle_Old[1];
        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[0].Float和Zero_Dat[1].Float保存的结果读出来。

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

回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 123 天

    [LV.7]常住居民III

    26

    主题

    1252

    回帖

    3911

    积分

    论坛元老

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

    该用户从未签到

    2

    主题

    1

    回帖

    16

    积分

    新手上路

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

    我先改版加个EEROM上去,毕竟I2C我也调试过,用起来方便。等以后需要修改的时候再换型号。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-25 21:46 , Processed in 0.056307 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表