找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1279|回复: 3
收起左侧

关于STC单片机EEPROM读写操作误区

[复制链接]
ID:408539 发表于 2023-1-10 03:45 | 显示全部楼层 |阅读模式
最近在使用STC EEPROM时 踩了个坑   
写入的数据  取出来 值不一样  查看STC手册时才发现
EEPROM 只能1写成0 不能0 写成1

1

1


正常需要写数据到EEPROM需要 先擦除数据整扇区512字节
再写入 数据才是正常的
那么扇区内的其他数据不是也同时被擦除拉
要保留扇区内其他数据  只能线读出来 修改好后再写入整个扇区
STC 官方提供的例程 只有 读 N个字节,写N个字节 , 擦除 三个基本操作
所以只能自己写一个功能函数了
下面的就是根据官网的读写例程 凑合写的
已经测通过试过
希望可以给大家借鉴,如果有更高效的写法 可以分享出来一起探讨

/*描述:读出原有EEPROM数据  修改其中数据  重新写入EEPROM
函数: EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
参数: EE_address:  要写入的EEPROM的首地址.
      DataAddress: 要写入数据的指针.
      len:               要写入的长度
-----------------------------------------------------------------------------------------------------------*/
void EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
{      u16 j;        
        u8  i;
        u8  H[255];//扇区高位缓存
        u8  L[255];//扇区高位缓存
        u8  sq;     //操作扇区缓存
        //先读出EEPROM原有扇区数据
        j=EE_address;
        sq=j/512;                                      //转换成扇区
        EEPROM_read_n(sq<<9,L,255);       //读出扇区低位
        EEPROM_read_n((sq<<9)+256,H,255); //读出扇区高位
        for(i=0;i<len;i++){               //循环修改 长度
    if((j/256)%2)                     //判断地址高位还是低位 修改取出来的数值
             H[j%256+i]=*(DataAddress+i);
        else
             L[j%256+i]=*(DataAddress+i);        
    }        
        EEPROM_SectorErase(sq*512);       //擦除所在扇区
        EEPROM_write_n(sq<<9,L,255);      //写入新的扇区低位数据
        EEPROM_write_n((sq<<9)+256,H,255);//写入新的扇区低位数据
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1060328 发表于 2023-1-10 15:57 | 显示全部楼层
EEPROM每个字节默认是FFH,所以只能写0将1改成0,擦除是按扇区(512B)
回复

使用道具 举报

ID:1034262 发表于 2023-1-13 16:33 | 显示全部楼层
STC的EEPROM是FLASH结构,所有的FLASH都是扇区擦除的,擦除后全部是FF,写只能将1写成0,不能写成1.
多个字节的操作,先全部读出来(最多是一个扇区512字节),修改,擦除,写入。

FLASH是一种浮栅结构的FET(U盘、SD卡、TF卡、固态硬盘都是),一个FET一个bit,擦除就是将栅极放电,则FET截止,输出1,写入就是给栅极充电,则FET导通,输出0。停电后,栅极电压保持,一般能保持20年以上。
回复

使用道具 举报

ID:1057978 发表于 2023-1-14 18:23 | 显示全部楼层
coody_sz 发表于 2023-1-13 16:33
STC的EEPROM是FLASH结构,所有的FLASH都是扇区擦除的,擦除后全部是FF,写只能将1写成0,不能写成1.
多个 ...

老哥专业,学习了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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