spiflash w25X32 SPIFFS文件系统的使用

一、什么是SPIFFS?

spifs是专门为spi flash编写的文件系统,支持均匀摩擦算法。
SPIFFS不需要Heap堆内存的能力,只需要一定的工作RAM缓冲区即可。
文件系统下载链接https://github.com/pellepl/spiffs

二、SPIFFS移植

1、下载SPIFS源代码,把src他加入到自己的工程里,test文件夹可以删除,default文件夹里面的配置文件拷贝到最外层目录,最后文件结构下图

image.png

2、配置SPI FLASH的相关信息

此配置要根据自己的SPI FLASH硬件信息做相应的修改,下面是我的配置

#ifndef SPIFFS_CFG_PHYS_SZ
#define SPIFFS_CFG_PHYS_SZ(ignore)        (1024*1024*4) /*flash容量*/
#endif
#ifndef SPIFFS_CFG_PHYS_ERASE_SZ
#define SPIFFS_CFG_PHYS_ERASE_SZ(ignore)  (65536) /*擦除单位,我使用的可以配置4k,或者64k,这里配置的64k*/
#endif
#ifndef SPIFFS_CFG_PHYS_ADDR
#define SPIFFS_CFG_PHYS_ADDR(ignore)      (0)/* 开始地址*/
#endif
#ifndef SPIFFS_CFG_LOG_PAGE_SZ
#define SPIFFS_CFG_LOG_PAGE_SZ(ignore)    (256)/*页:写数据的单位,都是256整数倍*/
#endif
#ifndef SPIFFS_CFG_LOG_BLOCK_SZ
#define SPIFFS_CFG_LOG_BLOCK_SZ(ignore)   (65536)/*块大小,一般和擦除的大小相同*/
#endif

3、配置FLASH的读写接口函数

#include "stm32f10x.h"      
#include "stdio.h"      
#include "spi_flash.h"
#include "usart.h"

 spiffs SPIFlashFS;
 static u8_t FS_Work_Buf[SPIFLASH_CFG_LOG_PAGE_SZ*2];
 static u8_t FS_FDS[32*4];
 static u8_t FS_Cache_Buf[(SPIFLASH_CFG_LOG_PAGE_SZ+32)*4];
 
 
 /***********************************************
 *   加载SPI FLASH文件系统
 */
  void Mount_SPI_Flash_File_System(void) 
        {
        
    spiffs_config SPIFlashCfg;
    SPIFlashCfg.phys_size        = SPIFLASH_CFG_PHYS_SZ;         // SPI Flash的总容量
    SPIFlashCfg.phys_addr        = SPIFLASH_CFG_PHYS_ADDR;       // 起始地址

 // FLASH最大可擦除的块大小(W25X64可以按扇区擦除(4K)或者按块擦除(64K))
    SPIFlashCfg.phys_erase_block = SPIFLASH_CFG_PHYS_ERASE_SZ;  

 // 块的大小(W25X64每块包含16个扇区,每个扇区4K字节,每块的总容量为:16X4=64K=65535字节)
    SPIFlashCfg.log_block_size   = SPIFLASH_CFG_LOG_BLOCK_SZ;  
//  (W25X64每页包含256个字节,16个页构成一个扇区)
    SPIFlashCfg.log_page_size    = SPIFLASH_CFG_LOG_PAGE_SZ;    
    
    SPIFlashCfg.hal_read_f =  SPI_Flash_Read;    //读
    SPIFlashCfg.hal_write_f = SPI_Flash_Write;   //写
    SPIFlashCfg.hal_erase_f = SPI_Flash_Erase;   //擦除  ,参数为地址,大小
    
        //挂载SPIFS   
    int res = SPIFFS_mount(&SPIFlashFS,
                           &SPIFlashCfg,
                           FS_Work_Buf,
                           FS_FDS,
                           sizeof(FS_FDS),
                           FS_Cache_Buf,
                           sizeof(FS_Cache_Buf),
                           0);
 
  }

4、测试程序

    
char WriteBuf[]={"Hi,Budy! if you get this Message......Congratulations!You have succeeded!!"};
char ReadBuf[80];   

int main(void)
{   
    
  SPI_FLASH_Init();   //FLASH存储器初始化
  Mount_SPI_Flash_File_System( );//spi flash文件系统初始化
    USART_Configuration(USART1,115200,EN_IT); //初始化USART1,开接收中断
    
    
    //打开文件,如果文件不存在,自动创建
     spiffs_file fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
    
      //写文件
    if (SPIFFS_write(&SPIFlashFS, fd, WriteBuf, sizeof(WriteBuf)) < 0)
        printf("errno %i\n", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd); 
  
        //读文件
    fd = SPIFFS_open(&SPIFlashFS, "my_file", SPIFFS_RDWR, 0);
    if (SPIFFS_read(&SPIFlashFS, fd, ReadBuf, sizeof(WriteBuf)) < 0)
        printf("errno %i\n", SPIFFS_errno(&SPIFlashFS));
    SPIFFS_close(&SPIFlashFS, fd);
  
        //打印输出文件内容
    printf("%s\n", ReadBuf);
    
    while(1)
    {
      //Nothing to do..........
   }
    
}

4 :对回调函数的说明

   SPI_Flash_Read;    //读  ,参数是地址,大小
    SPIFlashCfg.hal_write_f = SPI_Flash_Write;   //写,页对齐,不能超过256
    SPIFlashCfg.hal_erase_f = SPI_Flash_Erase;   //擦除  ,参数为地址,需要擦除的大小

5 参考项目链接链接:https://pan.baidu.com/s/1WxZwqEzLLLU16ZWVl_KrkQ 密码:87ps

6可能存在的问题 :

是否s32_t SPI_Flash_Erase(u32_t Addr,u32_t Num) 函数接口有问题
应该改为 SPI_Flash_Erase2,希望有人可以验证

/*************************************************************************************
*   擦除多个扇区 (文件系统接口函数)
*   Addr :擦除起始地址  
*   size: 要擦除的空间大小
*/
s32_t SPI_Flash_Erase2(u32_t Addr,u32_t size)   
{  
      u32_t i,Num;
      Num=size/4096;
      for(i=0;i<Num;i++) {
      SPI_FLASH_Write_Enable();                  //SET WEL   
    SPI_Flash_Wait_Busy();   
    SPI_FLASH_CS_LOW();                        //使能器件   
    SPIx_ReadWriteByte(W25X_SectorErase);      //发送扇区擦除指令 
    SPIx_ReadWriteByte((u8_t)((Addr)>>16));  //发送24bit地址    
    SPIx_ReadWriteByte((u8_t)((Addr)>>8));   
    SPIx_ReadWriteByte((u8_t)Addr);  
      SPI_FLASH_CS_HIGH();                        //取消片选              
    SPI_Flash_Wait_Busy();                              //等待擦除完成
        Addr+=4096; 
        }  
    return 0;
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 转载 1、SPI总线: SPI(同步外设接口)是由摩托罗拉公司开发的全双工同步串行总线,其接口由 MISO(...
    倦鸟归时阅读 3,602评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 新年福袋增给我大学室友,刚好明天就是她的生日,也祝愿狗年本命年的我们福气满满。 参考临摹了公众号驴大萌,不管像不像...
    野梅子阅读 395评论 1 4
  • 开始新工作已经半个月,现在抽时间写一下,刚到公司所做的事情。先到总部去报到办理入职手续,然后坐车到分公司的办公室,...
    faith3729阅读 134评论 0 0
  • 很多时候我们需要借助CocoaPods管理第三方开源类库,但是由于国内开发者直接使用CocoaPods是经常速度缓...
    petter102阅读 11,133评论 0 0