找回密码
 立即注册
楼主: vb2002

请教下这位老哥说的,可以减少eeprom的磨损.

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 00:19:51 | 显示全部楼层
本帖最后由 vb2002 于 2024-8-3 00:22 编辑
Debu*** 发表于 2024-8-3 00:17
写只能把1变0,擦除是整个扇区变成1,一位一位写就可以一位一位的变0,一个扇区就可以当成4096bit的计数 ...

意思是 FF 只能写成 01 10 11 00是吗?
如果我要写 238  那就是需要1110 0110  8个FF
这样我理解的是
擦除了写可以是16进制
直接写只能是2进制?
是这样吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 02:32:58 来自手机 | 显示全部楼层
DebugLab 发表于 2024-8-3 00:17
写只能把1变0,擦除是整个扇区变成1,一位一位写就可以一位一位的变0,一个扇区就可以当成4096bit的计数 ...

一字节里面
ff是 255
那我把一个字节里面写01 02 03 04 应该没问题啊, 就是 0000 0001 ,0000 0010,0000 0011

点评

1111 1111 1111 1110 1111 1100 1111 1000 1111 0000 这样  详情 回复 发表于 2024-8-3 09:33
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-8-3 09:33:40 | 显示全部楼层
vb2*** 发表于 2024-8-3 02:32
一字节里面
ff是 255
那我把一个字节里面写01 02 03 04 应该没问题啊, 就是 0000 0001 ,0000 0010,000 ...

1111 1111
1111 1110
1111 1100
1111 1000
1111 0000
这样
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 11:22:42 | 显示全部楼层
wnag*** 发表于 2024-8-3 07:36
擦除后EEPROM中值为0XFF,想写入什么值都行,但是只能写一次,第二次写入的话,已经置零的位不会变为1 ...


你这个程序我调不通!

eeprom.c  eeprom.h  我用的 布丁橘长的那个模块
主函数里面我改了一下.
结果led不亮. 串口打印也没反应

main.c (3.62 KB, 下载次数: 57) EEPROM.c (1.65 KB, 下载次数: 57) EEPROM.h (1.07 KB, 下载次数: 56)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 12:36:53

15

主题

57

回帖

2097

积分

金牌会员

积分
2097
发表于 2024-8-3 11:55:25 | 显示全部楼层
本帖最后由 wjhhhhh 于 2024-8-3 11:57 编辑

发文字.rar (1.29 KB, 下载次数: 59) 可以参考一下。
/**把关机时的台 写二个字节到第二个扇区  前一字节的前四位是波段 后四位和后一字节的八位是调谐频道****/
/** 写入二个字节到第二个扇区***提前到开机时就找到这个地址 关机时写入到这个地址节省时间*/
void EEP_Ws2(u8 RW_zj1,u8 RW_zj2)//前四位波段少于15   写入二个字节是因为单个数据会出现0xFF
{EZtmp[0]=RW_zj1; EZtmp[1]=RW_zj2;
        //guan_ji_hao =ik<<8 & (ik-1);//这次断电时存入的地址
        //提前到开机时就找到这个地址 关机时节省时间
EEPROM_read(512,RWtmp,512);//第二扇区(地址512 0x0200)起 512字节全读出来511~1023
   for(ik=0;ik<512;ik++)
    {if((RWtmp[ik]==0xFF)&&(RWtmp[ik+1]==0xFF))//有二个连续字节FF 没有写过
      {EEPROM_write(ik+512,EZtmp,2);           //追加 写入收到的2个
             break;                                  //跳出ik 0~511循环
      }                                                                         //0~511循环到此                   电烙铁
     if(ik>=510)                                                                 //循环到510仍然没有连续的两个FF
            {SectorErase(512);                   //没有了连续的2个FF 擦除第二扇区                  
             RWtmp[0]=EZtmp[0];RWtmp[1]=EZtmp[1];//新的二个数据填进地址0和1 这个笨写法编译后code比循环写法少了23个字节!
             EEPROM_write(512,RWtmp,2);          //512是第二扇区起始
            }
    }
}

/*** 开机读出上次关机前的"台"****************************** */
void kai_ji_R() //读二个字节是因为第二个数据会出现0xFF  
{EEPROM_read(512,RWtmp,512);//从地址512(第二扇区起始)开始把512个(512~1023)全读出来
for(ik=0;ik<512;ik++)   //找连续的2个FF 读出的RWtmp[x]是序号
  {if((RWtmp[0]==0xFF)&&(RWtmp[1]==0xFF))//有过擦除操作后或新的芯片第一次运行RWtmp[0]RWtmp[1]全是FF
    {PWM_7(0x001A);        //开机就调频  F  缺省频段 调频  第一次开机遇全FF会出错?
     PWM_8(0x01F0); //开机缺省频点 陕西交通 89.6 MHz
           break;                                //跳出ik循环        
    }                        
   if((RWtmp[ik]==0xFF)&&(RWtmp[ik-1]==0xFF)) //这里RWtmp[ik]是第二扇区的 两个FF是存入(写过)和没写过的分界
    {xu_hao=(ik-3);      //RWtmp[]第二扇区存储的台的序号 RWtmp[x]是序号
           EEPROM_read(512,RWtmp,512);  //从地址512(第二扇区首)把512个全读出来 RWtmp[x]是波段、调谐数据
           bo_duan =(RWtmp[xu_hao]&0xF0)>>4; //波段0000 xxxx  xxxx <=15
           tiao_xie=((RWtmp[xu_hao]&0x0F)<<8) | (RWtmp[xu_hao+1]);
     if(bo_duan>=2){Q1_EN=1;}//遇到了短波 发高电平给短波高放当电源                 
      else{Q1_EN=0;}          //发低电平 没了短波高放电源
                 guan_ji_hao=(ik-1) <<8 & ik;//这次断电时存入的地址 高位在前  
                 break;   //跳出ik 0~511循环else
    }
  }         // ik 0~511循环到此
}        
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 12:01:33 | 显示全部楼层
wjhh*** 发表于 2024-8-3 11:55
可以参考一下。
/**把关机时的台 写二个字节到第二个扇区  前一字节的前四位是波段 后四位和后一字节的八位 ...

你这个代码我就更久看不懂了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 12:13:32 | 显示全部楼层
wnag*** 发表于 2024-8-3 11:31
STC8H1K08我用过,成功了的

程序里面看着挺简单的, 就是调不通.
.h文件里面的见到还要调用 main.h  
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 12:36:53

15

主题

57

回帖

2097

积分

金牌会员

积分
2097
发表于 2024-8-3 12:24:40 | 显示全部楼层
本帖最后由 wjhhhhh 于 2024-8-3 12:29 编辑
vb2*** 发表于 2024-8-3 12:01
你这个代码我就更久看不懂了

大致的思路是 写入二个字节新数据(第一个的高四位小于15)前  找到连续的两个0xFF  在这两个的位置写入新数据 直到扇区末尾没有了连续的两个0xFF 就擦除  又从头开始写。在写入的数据里尽量找持续不变的特征作为标记  判断连续的0xFF没有写的地址位置  实在没有特征就给它加一个。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 12:28:01 | 显示全部楼层
wnag*** 发表于 2024-8-3 11:31
STC8H1K08我用过,成功了的

我编译出来,很多很多错误.
看的眼都花了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 13:02:33 | 显示全部楼层
wnag*** 发表于 2024-8-3 12:53
不好意思,忘记了,main.h里主要是变量大小的定义(u8 u16 u32)等

那我再试试 把main.c 里面的u8 u16移动一下
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-2 04:03 , Processed in 0.176257 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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