|
本帖最后由 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保存的结果读出来。
请帮忙看一下,主要原因在哪里。
|
|