SPIFFS文件系统STM32移植工程分享

2019-12-17 21:28发布

本人刚进入嵌入式行业,技术上来说菜鸟一枚。以前在论坛问了很多技术方面的问题,得到了很多热心坛友的帮助,也经常在论坛下点有用的技术资料。。。。。。
人不能只顾索取而不付出,无奈本人技术水平有限,实在拿不出什么像样的技术活给大家分享。。。。。。。。
今天闲着没事,把我之前移植好的SPI FLASH文件系统分享出来,有需要的可以拿去,您能用上,本人倍感高兴;不需要的,您来凑个热闹,本人表示欢迎。。。。。
好了,闲话少说。。。。。。下面切入正题。。。。。。

一、什么是SPIFS?
如果你问我这个问题,我也无法全面的回答,我就知道它是一种文件系统。因为之前我也没听说过SPIFS,直到有一天,有个哥们在我的帖子里提到了它http://www.amobbs.com/forum.php? ... =5610774&extra=
我迫不及待的顺着那哥们指引的方向去看了看:https://github.com/pellepl/spiffs  。我大致看了下文档,感觉还不错,貌似是我想要的。。。。。于是花了点时间把它移植到了设备系统里。
现在说说个人的使用感受。我们设备使用的SPI FLASH存储器是W25X64,使用SPIFS文件系统读写600多组电压数据,500多组内阻数据,300多条告警信息,使用半年多时间,没有出现任何问题,设备经常开关机,也没有出现文件
系统崩溃的问题。最后我要感谢那位在我贴纸里为我指路的哥们,当然感谢SPIFS的作者(虽然我没看SPIFS是谁写的)

二、SPIFS移植
打字太累,我就截图说明吧。。。。。。。后面会给大家完整的移植工程。。。
1、下载SPIFS源代码,把他加入到自己的工程里(这句貌似废话。。。。请无视)
    源码里有些是例程,有兴趣可以看看,没兴趣直接删掉,真正有用的是这些文件:
Message.png (16.71 KB, 下载次数: 0) 下载附件 Message 2015-8-2 16:17 上传

5、补充说明
SPIFS文件系统在创建文件或目录的时候只支持Flat(平坦)模式,也就是说它不支持建立多级目录,我不知道SPIFS版本有木有更新,反正我用的这个版本是不支持的,
如果那个坛友发现新版本改进了,请告知。。。。。。

STM32_SPIFS移植工程.rar (355.12 KB, 下载次数: 695) 2015-8-2 16:26 上传 点击文件名下载附件
SPIFFS移植工程


编译环境说明:
MDK5.15  
开启C99
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
JJKwong
1楼-- · 2019-12-26 23:28
wbq_88 发表于 2016-8-17 09:27
兄弟  spiffs在文件追加数据内容 怎么实现的  我试了就是不行

JJKwong 发表于 2015-10-15 13:57
LZ怎么样在文件内容后面追加数据内容的啊,怎么我这样总是不行的呢

解决了,还是sizeof与printf的问题,改为strlen ok ,还是基础不够扎实

看我上面的例子,我之前是因为sizeof 与 strlen的问题
wbq_88
2楼-- · 2019-12-27 00:18
JJKwong 发表于 2016-8-17 11:00
JJKwong 发表于 2015-10-15 13:57
LZ怎么样在文件内容后面追加数据内容的啊,怎么我这样总是不行的呢

//打开文件,如果文件不存在,自动创建
    fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
    SPIFFS_close(&SPIFlashFS, fd);
    //写文件
    res = SPIFFS_stat(&SPIFlashFS, "my_file", &s);
    DBGOUT("s.size = %d ",s.size);
    fd = SPIFFS_open(&SPIFlashFS, "my_file",  SPIFFS_RDWR, 0);
    SPIFFS_lseek(&SPIFlashFS, fd,s.size,SPIFFS_SEEK_CUR);
    if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf, sizeof(WriteBuf)) < 0)
    DBGOUT("errno %i ", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd);

    //读文件
    fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDWR, 0);
    if (SPIFFS_read(&SPIFlashFS, fd, ReadBuf, sizeof(ReadBuf)) < 0)
    DBGOUT("errno %i ", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd);
    //打印输出文件内容
    DBGOUT("%s ", ReadBuf);


这是我写的,可追加就是不行
wbq_88
3楼-- · 2019-12-27 04:48
JJKwong 发表于 2016-8-17 11:00
JJKwong 发表于 2015-10-15 13:57
LZ怎么样在文件内容后面追加数据内容的啊,怎么我这样总是不行的呢

//打开文件,如果文件不存在,自动创建
    fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
    SPIFFS_close(&SPIFlashFS, fd);
    //写文件
    res = SPIFFS_stat(&SPIFlashFS, "my_file", &s);
    DBGOUT("s.size = %d ",s.size);
    fd = SPIFFS_open(&SPIFlashFS, "my_file",  SPIFFS_RDWR, 0);
    SPIFFS_lseek(&SPIFlashFS, fd,s.size,SPIFFS_SEEK_CUR);
    if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf, sizeof(WriteBuf)) < 0)
    DBGOUT("errno %i ", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd);

    //读文件
    fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDWR, 0);
    if (SPIFFS_read(&SPIFlashFS, fd, ReadBuf, sizeof(ReadBuf)) < 0)
    DBGOUT("errno %i ", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd);
    //打印输出文件内容
    DBGOUT("%s ", ReadBuf);


这是我写的,可追加就是不行
wbq_88
4楼-- · 2019-12-27 07:05
 精彩回答 2  元偷偷看……
wanghui0574
5楼-- · 2019-12-27 11:23
mark, 正需要
JJKwong
6楼-- · 2019-12-27 14:16
wbq_88 发表于 2016-8-17 21:58
你是把所有的sizof的地方都改为strlen?
  1. //????,???????,????
  2.         spiffs_file fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
  3.         printf("%d,%d  ",sizeof(WriteBuf),strlen(WriteBuf));
  4.           //???
  5.     if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf, strlen(WriteBuf)) < 0)
  6.                 printf("errno %i ", SPIFFS_errno(&SPIFlashFS));
  7.         if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf1, strlen(WriteBuf1)) < 0)
  8.                 printf("errno %i ", SPIFFS_errno(&SPIFlashFS));
  9.     SPIFFS_close(&SPIFlashFS, fd);
  10.   
  11.                 //???
  12.     fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDONLY, 0);
  13.     if (SPIFFS_read(&SPIFlashFS, fd, ReadBuf, sizeof(ReadBuf)) < 0)
  14.                 printf("errno %i ", SPIFFS_errno(&SPIFlashFS));
  15.         //SPIFFS_fstat查询文件大小要在open情况下
  16.         res = SPIFFS_fstat(&SPIFlashFS, fd, &s);
  17.         printf("%d ",s.size);
  18.     SPIFFS_close(&SPIFlashFS, fd);
  19.   
  20.                 //????????
  21.     printf("%s ", ReadBuf);

  22.         /////////////////////////////////////
  23.         res = SPIFFS_stat(&SPIFlashFS, "my_file", &s);
  24.         printf("%d ",s.size);
  25.         ////////////////////////////////////////////////////////////

  26.         fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDWR, 0);
  27.         SPIFFS_lseek(&SPIFlashFS, fd, s.size, SPIFFS_SEEK_CUR);
  28.         if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf2, strlen(WriteBuf2)) < 0)
  29.                 printf("errno %i ", SPIFFS_errno(&SPIFlashFS));
  30.     SPIFFS_close(&SPIFlashFS, fd);
  31.        
  32.         fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDONLY, 0);
  33.     if (SPIFFS_read(&SPIFlashFS, fd, ReadBuf, sizeof(ReadBuf)) < 0)
  34.                 printf("errno %i ", SPIFFS_errno(&SPIFlashFS));
  35.     SPIFFS_close(&SPIFlashFS, fd);

  36.          printf("%s ", ReadBuf);
复制代码

一周热门 更多>