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保存的结果读出来。
请帮忙看一下,主要原因在哪里。
大部分芯片的ID号在烧录时STC-ISP程序会从芯片里读出来存放在Flash最后一个扇区的最后位置,你的EEPROM设置1K的话,芯片ID号就存放在EEPORM的0x03f9~0x03ff位置。所以直接写这块地址的数据会出错,擦除后再写应该就没有问题。
STC8G1K17是IAP类型芯片,每次烧录时固定会擦除整个Flash,取消“下次下载用户程序时擦除EEPROM区”勾选对旧版本IAP类型芯片无效,以下新版本固件的芯片才会有效:
乘风飞扬 发表于 2023-2-20 13:29
大部分芯片的ID号在烧录时STC-ISP程序会从芯片里读出来存放在Flash最后一个扇区的最后位置,你的EEPROM设置 ...
我先改版加个EEROM上去,毕竟I2C我也调试过,用起来方便。等以后需要修改的时候再换型号。
页:
[1]