打印
[应用笔记]

分享一款EEPROM简易类文件的数据读写库

[复制链接]
2639|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
micoccd|  楼主 | 2023-10-18 13:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
虽然 EEPROM 相对 Flash 读写速度更慢,但 EEPROM 一些独有特性是 Flash 无法实现的,比如字节读写操作。
所以,EEPROM至今依然应用在很多电子设备上,而且市场还不小。
这里就给大家分享一款EEPROM轻量级的简易类文件的数据读写库:eepromfs关于eepromfs


eepromfs,基于EEPROM的简易类文件的数据读写库,方便做动态功能增减时参数管理。

增减参数块类似增减文件,不会对已有数据存储带来影响。EEPROM硬件资源充裕的情况下使用。

开源地址:https://gitee.com/wtau_zaozao/eepromfs
使用说明和软件架构
开源库使用说明:
基于 Arm 处理器,EEPROM存储,比如24C256、24c512之类的相对较大一点容量的EEPROM存储芯片。

软件架构:
EPPROM存储区开头存储eepromfs管理相关信息,采用链表方式串联每一个文件,每个文件建立的时候指定名称和大小,新增加的文件自动追加在链表末尾。

typedef struct deepromfs_s{
    eeprom_handle_t *handle;
   
    la_t startAddr1;
    efs_size_t size1;
   
    la_t startAddr2;
    efs_size_t size2;
}deepromfs_t;
static deepromfs_t deepromfs;

eepromfs_result_t deepromfs_init(eeprom_handle_t *handle,la_t startAddr,efs_size_t size)
{
    eepromfs_result_t eepromfs_result1;
    eepromfs_result_t eepromfs_result2;

    //初始化
    deepromfs.handle=handle;
    deepromfs.startAddr1=startAddr;
    deepromfs.size1=size/2;
    deepromfs.startAddr2=deepromfs.startAddr1+deepromfs.size1;
    deepromfs.size2=size/2;


    eepromfs_result1=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);
    eepromfs_result2=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);
    if((eepromfs_result1==EFR_OK)&&(eepromfs_result2==EFR_OK))
    {
        return EFR_OK;
    }
    else if((eepromfs_result1==EFR_OK)&&(eepromfs_result2!=EFR_OK))
    {
        //拷贝分区1数据到分区2
        eepromfs_copy(deepromfs.handle,deepromfs.startAddr2,deepromfs.startAddr1,deepromfs.size1);
        return EFR_OK;
    }
    else if((eepromfs_result1!=EFR_OK)&&(eepromfs_result2==EFR_OK))
    {
        //拷贝分区2数据到分区1
        eepromfs_copy(deepromfs.handle,deepromfs.startAddr1,deepromfs.startAddr2,deepromfs.size2);
        return EFR_OK;
    }
    else if((eepromfs_result1==EFR_CRC_INFO_ERR)&&(eepromfs_result2==EFR_CRC_INFO_ERR))
    {
        return EFR_CRC_INFO_ERR;
    }
    return EFR_ERR;
}
eepromfs_result_t deepromfs_format_quick(void)
{
    eepromfs_result_t eepromfs_result;
   
    eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);
    if(eepromfs_result!=EFR_OK)
    {
        return eepromfs_result;
    }
   
    if(eepromfs_format_quick()!=EFR_OK)
    {
        return eepromfs_result;
    }

    eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);
    if(eepromfs_result!=EFR_OK)
    {
        return eepromfs_result;
    }
   
    eepromfs_result=eepromfs_format_quick();
    if(eepromfs_result!=EFR_OK)
    {
        return eepromfs_result;
    }
   
    return EFR_OK;
}
提供各类格式化、读、写、删除的函数接口,方便用户直接调用:

eepromfs_result_t eepromfs_init(eeprom_handle_t *handle,la_t startAddr);
eepromfs_result_t eepromfs_format_quick(void);//格式化不改变大小
eepromfs_result_t eepromfs_format_full(la_t startAddr,efs_size_t size);//格式化并重新指定大小

eepromfs_result_t eepromfs_new(file_handle_t *fh,const char* filename,efs_size_t fileSize);
eepromfs_result_t eepromfs_open(file_handle_t *fh,const char* filename);
eepromfs_result_t eepromfs_close(file_handle_t* fh);
eepromfs_result_t eepromfs_write(file_handle_t* fh, const fdata_t* data, efs_size_t size);
eepromfs_result_t eepromfs_offsetWrite(file_handle_t* fh,la_t offSet,const fdata_t* data, efs_size_t size);
eepromfs_result_t eepromfs_read(file_handle_t* fh, fdata_t* buf,efs_size_t bufLen,efs_size_t *pFilesize);
eepromfs_result_t eepromfs_delete(const char* filename);
eepromfs_result_t eepromfs_copy(eeprom_handle_t *handle,la_t destAddr,la_t srcAddr,efs_size_t size);
总体而言,这个库相对比较轻量级,普通ARM 单片机运行完全没有压力,具体源码,可以参看:https://gitee.com/wtau_zaozao/eepromfs


使用特权

评论回复
沙发
tpgf| | 2024-3-4 17:07 | 只看该作者
小容量的存储芯片就米有必要这样操作了吧

使用特权

评论回复
板凳
晓伍| | 2024-3-6 18:08 | 只看该作者
这个库只能操作eeprom类型的存储器吗

使用特权

评论回复
地板
八层楼| | 2024-3-6 18:42 | 只看该作者
嵌入式arm使用,硬件需要带eeprom,建议采用24C256、24c512之类的大容量芯片

使用特权

评论回复
5
观海| | 2024-3-6 19:16 | 只看该作者
在读写这些数据的时候,需要屏蔽其他中断吗

使用特权

评论回复
6
guanjiaer| | 2024-3-6 19:50 | 只看该作者
在这种操作的过程中,供电电压最低需要保持在多少v以上?

使用特权

评论回复
7
heimaojingzhang| | 2024-3-6 20:24 | 只看该作者
这个简易的读写库可以在哪里下载到呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

549

帖子

1

粉丝