[ARM入门] 分享一款EEPROM简易类文件的数据读写库

[复制链接]
 楼主| 呐咯密密 发表于 2023-9-27 10:49 | 显示全部楼层 |阅读模式
虽然 EEPROM 相对 Flash 读写速度更慢,但 EEPROM 一些独有特性是 Flash 无法实现的,比如字节读写操作。
所以,EEPROM至今依然应用在很多电子设备上,而且市场还不小。
这里就给大家分享一款EEPROM轻量级的简易类文件的数据读写库:eepromfs
eepromfs,基于EEPROM的简易类文件的数据读写库,方便做动态功能增减时参数管理。

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

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

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

  1. typedef struct deepromfs_s{
  2.     eeprom_handle_t *handle;
  3.    
  4.     la_t startAddr1;
  5.     efs_size_t size1;
  6.    
  7.     la_t startAddr2;
  8.     efs_size_t size2;
  9. }deepromfs_t;
  10. static deepromfs_t deepromfs;

  1. eepromfs_result_t deepromfs_init(eeprom_handle_t *handle,la_t startAddr,efs_size_t size)
  2. {
  3.     eepromfs_result_t eepromfs_result1;
  4.     eepromfs_result_t eepromfs_result2;

  5.     //初始化
  6.     deepromfs.handle=handle;
  7.     deepromfs.startAddr1=startAddr;
  8.     deepromfs.size1=size/2;
  9.     deepromfs.startAddr2=deepromfs.startAddr1+deepromfs.size1;
  10.     deepromfs.size2=size/2;


  11.     eepromfs_result1=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);
  12.     eepromfs_result2=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);
  13.     if((eepromfs_result1==EFR_OK)&&(eepromfs_result2==EFR_OK))
  14.     {
  15.         return EFR_OK;
  16.     }
  17.     else if((eepromfs_result1==EFR_OK)&&(eepromfs_result2!=EFR_OK))
  18.     {
  19.         //拷贝分区1数据到分区2
  20.         eepromfs_copy(deepromfs.handle,deepromfs.startAddr2,deepromfs.startAddr1,deepromfs.size1);
  21.         return EFR_OK;
  22.     }
  23.     else if((eepromfs_result1!=EFR_OK)&&(eepromfs_result2==EFR_OK))
  24.     {
  25.         //拷贝分区2数据到分区1
  26.         eepromfs_copy(deepromfs.handle,deepromfs.startAddr1,deepromfs.startAddr2,deepromfs.size2);
  27.         return EFR_OK;
  28.     }
  29.     else if((eepromfs_result1==EFR_CRC_INFO_ERR)&&(eepromfs_result2==EFR_CRC_INFO_ERR))
  30.     {
  31.         return EFR_CRC_INFO_ERR;
  32.     }
  33.     return EFR_ERR;
  34. }
  35. eepromfs_result_t deepromfs_format_quick(void)
  36. {
  37.     eepromfs_result_t eepromfs_result;
  38.    
  39.     eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);
  40.     if(eepromfs_result!=EFR_OK)
  41.     {
  42.         return eepromfs_result;
  43.     }
  44.    
  45.     if(eepromfs_format_quick()!=EFR_OK)
  46.     {
  47.         return eepromfs_result;
  48.     }

  49.     eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);
  50.     if(eepromfs_result!=EFR_OK)
  51.     {
  52.         return eepromfs_result;
  53.     }
  54.    
  55.     eepromfs_result=eepromfs_format_quick();
  56.     if(eepromfs_result!=EFR_OK)
  57.     {
  58.         return eepromfs_result;
  59.     }
  60.    
  61.     return EFR_OK;
  62. }
提供各类格式化、读、写、删除的函数接口,方便用户直接调用:

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

  4. eepromfs_result_t eepromfs_new(file_handle_t *fh,const char* filename,efs_size_t fileSize);
  5. eepromfs_result_t eepromfs_open(file_handle_t *fh,const char* filename);
  6. eepromfs_result_t eepromfs_close(file_handle_t* fh);
  7. eepromfs_result_t eepromfs_write(file_handle_t* fh, const fdata_t* data, efs_size_t size);
  8. eepromfs_result_t eepromfs_offsetWrite(file_handle_t* fh,la_t offSet,const fdata_t* data, efs_size_t size);
  9. eepromfs_result_t eepromfs_read(file_handle_t* fh, fdata_t* buf,efs_size_t bufLen,efs_size_t *pFilesize);
  10. eepromfs_result_t eepromfs_delete(const char* filename);
  11. eepromfs_result_t eepromfs_copy(eeprom_handle_t *handle,la_t destAddr,la_t srcAddr,efs_size_t size);


yangjiaxu 发表于 2023-10-31 10:27 | 显示全部楼层
EEPROM 相对 Flash 读写速度更慢,这是正常的,但是EEPROM的性价比和存储方式确实也是很不错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部