Matrix
发表于 2025-1-26 08:15:47
vb2002 发表于 2025-1-24 11:23
不好意思
我以为是代码连接
你可以拍照用照片转文字转一下
这是个好办法
vb2002
发表于 2025-1-26 11:45:26
Matrix 发表于 2025-1-26 08:15
这是个好办法
你也在弄 按字节写入,均衡磨损eeprom吗
有研究出代码吗?
我也在弄, 遍历后老是出错
vxfklthz
发表于 2025-2-28 16:58:24
测试方法不对。手册上说了每个BIT的1->0算写入,0->1算擦除。所以你先写一次1,第二次写2,你以为你写了两次,实际上Bit0和Bit1都只有一次变化,其他的数字也是以此类推。你要测就得全写0,才是正确的寿命
asachild
发表于 2025-9-12 14:30:19
充放一次电,才算一次写入。纯粹加1写入,除非一直写在同一地址才行,而且只有最低位达到了最大执行次数。
Matrix
发表于 2025-10-8 15:35:35
vb2002 发表于 2025-1-26 11:45
你也在弄 按字节写入,均衡磨损eeprom吗
有研究出代码吗?
我也在弄, 遍历后老是出错
我的想法是根据实际设置够大的EERPOM存储数据,每次存储数据都逐渐加在末尾,直到所有的页写满,擦除后再写,这样动态的改变,本来一个地址要写几十次,分开就只写一次,重复多个地址就可以了,避免写坏一个地址,还充分利用存储区。每次一个新的数据,序号增加1。
Matrix
发表于 2025-10-8 15:41:21
图片代码看着很好,不能直接用,识别出来贴一下:
staticvolatileunsignedintSum_Ms=0;
staticvolatileunsigned char Sum_Flag=0;
void Sum_Reset(void)
Sum_Ms=0;
Sum_Flag=0;
//1ms定时器中断里面运行
测试就直接Sum_Ms>=1让eeprom直存数了
void Sum_Timer_Process(void)
Sum_Ms++;
if(Sum_Ms>=
1
Sum_Ms=0;
Sum_Flag=1;
void APp_Sum_Process(unsignedint *p_timer_delay_ms)
if(1==Sum_Flag)
Sum_Flag=0;
Measured_Sum_Value +=1;
Mdata_Write_Long(APp_Section,MEM_SUM_VAL,Measured_Sum_Value);
if(Measured_Sum_Value 1=Mdata_Read_Long(APP_Section,MEM_SUM_VAL,0,99999999,θ))
Measured_Sum_Value-=1;
ERR_State=1;//报错
//APP_Section=2;MEM_SUM_VAL=0;
void Mdata_Write_Long(unsigned char section,unsigned int addr,signed long dat)
unsignedinti;
for(i=0;i<EEPROM_BUF_LENGTH;i++)EEPROM_BUF=EEPROM_Read(seCtion,i);
EEPROM_BUF=dat>>16;
EEPROM_BUF=dat&0Xe00OFFFFL;
IapErase(512UL*section);//擦除第N片区
for(i=O;i<EEPROM_BUF_LENGTH;i++)EEPROM_Write(SeCtion,i,EEPROM_BUF);
signed long Mdata_Read_Long(unsigned char section,unsigned int addr,signed long min,signed long max,signed long def)
signed longdat;
dat=EEPROM_Read(section,addr);
dat<<=16;
dat|=(EEPROM_Read(section,addr+1)&eXOO0OFFFFL);
if(dat>max1|dat<min)dat=def;
return dat;
signed int EEPROM_Read(unsigned int section,unsigned intaddr)
signed int dat;
addr=section*512+addr*2;
dat=IapRead(addr);
dat<<=8;
dat=dat|(IapRead(addr+1)&ex00FF);
returndat;
void EEPROM_Write(unsigned int section,unsigned int addr,signed int dat)
IapProgram(section *512+addr*2,(unsigned char)(dat>>8));
IapProgram(section*512+addr*2+1,(unsignedchar)(dat&oxeoFF));
unsigned char EEPRoM_Test(unsigned char section)
unsigned int i;
unsigned char dat;
IapErase(512UL*section);//除第N片区
for(i=0;i<512;i++)
dat=IapRead(512UL*section+i);
if(θxFFI=dat)return 1;
for(i=0;i<512;i++
IapProgram(512UL*section+i,0x00);
for(i=0;i<512;i++)
dat=IapRead(512UL*section+i);
if(exeeI=dat)return 1;
return0;
vb2002
发表于 2025-10-8 17:26:16
Matrix 发表于 2025-10-8 15:35
我的想法是根据实际设置够大的EERPOM存储数据,每次存储数据都逐渐加在末尾,直到所有的页写满,擦除后再 ...
我的已经弄好了. 挺好用的, 每次按照自己实际需要的来写,写完自己定的目标就擦除,然后从头开始写
Matrix
发表于 7 天前
vb2002 发表于 2025-10-8 17:26
我的已经弄好了. 挺好用的, 每次按照自己实际需要的来写,写完自己定的目标就擦除,然后从头开始写 ...
昨天刚完成读写操作,今天有待进一步测试,再完善功能。
页:
1
2
3
4
5
6
7
8
9
10
[11]