spiflash w25X32 SPIFFS文件系統(tǒng)的使用

一、什么是SPIFFS?

spifs是專門為spi flash編寫的文件系統(tǒng),支持均勻摩擦算法。
SPIFFS不需要Heap堆內(nèi)存的能力,只需要一定的工作RAM緩沖區(qū)即可。
文件系統(tǒng)下載鏈接https://github.com/pellepl/spiffs

二、SPIFFS移植

1、下載SPIFS源代碼,把src他加入到自己的工程里,test文件夾可以刪除,default文件夾里面的配置文件拷貝到最外層目錄,最后文件結(jié)構(gòu)下圖

image.png

2、配置SPI FLASH的相關(guān)信息

此配置要根據(jù)自己的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)/*頁:寫數(shù)據(jù)的單位,都是256整數(shù)倍*/
#endif
#ifndef SPIFFS_CFG_LOG_BLOCK_SZ
#define SPIFFS_CFG_LOG_BLOCK_SZ(ignore)   (65536)/*塊大小,一般和擦除的大小相同*/
#endif

3、配置FLASH的讀寫接口函數(shù)

#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文件系統(tǒng)
 */
  void Mount_SPI_Flash_File_System(void) 
        {
        
    spiffs_config SPIFlashCfg;
    SPIFlashCfg.phys_size        = SPIFLASH_CFG_PHYS_SZ;         // SPI Flash的總?cè)萘?    SPIFlashCfg.phys_addr        = SPIFLASH_CFG_PHYS_ADDR;       // 起始地址

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

 // 塊的大小(W25X64每塊包含16個扇區(qū),每個扇區(qū)4K字節(jié),每塊的總?cè)萘繛椋?6X4=64K=65535字節(jié))
    SPIFlashCfg.log_block_size   = SPIFLASH_CFG_LOG_BLOCK_SZ;  
//  (W25X64每頁包含256個字節(jié),16個頁構(gòu)成一個扇區(qū))
    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;   //擦除  ,參數(shù)為地址,大小
    
        //掛載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文件系統(tǒng)初始化
    USART_Configuration(USART1,115200,EN_IT); //初始化USART1,開接收中斷
    
    
    //打開文件,如果文件不存在,自動創(chuàng)建
     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);
  
        //打印輸出文件內(nèi)容
    printf("%s\n", ReadBuf);
    
    while(1)
    {
      //Nothing to do..........
   }
    
}

4 :對回調(diào)函數(shù)的說明

   SPI_Flash_Read;    //讀  ,參數(shù)是地址,大小
    SPIFlashCfg.hal_write_f = SPI_Flash_Write;   //寫,頁對齊,不能超過256
    SPIFlashCfg.hal_erase_f = SPI_Flash_Erase;   //擦除  ,參數(shù)為地址,需要擦除的大小

5 參考項目鏈接鏈接:https://pan.baidu.com/s/1WxZwqEzLLLU16ZWVl_KrkQ 密碼:87ps

6可能存在的問題 :

是否s32_t SPI_Flash_Erase(u32_t Addr,u32_t Num) 函數(shù)接口有問題
應該改為 SPI_Flash_Erase2,希望有人可以驗證

/*************************************************************************************
*   擦除多個扇區(qū) (文件系統(tǒng)接口函數(shù))
*   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);      //發(fā)送扇區(qū)擦除指令 
    SPIx_ReadWriteByte((u8_t)((Addr)>>16));  //發(fā)送24bit地址    
    SPIx_ReadWriteByte((u8_t)((Addr)>>8));   
    SPIx_ReadWriteByte((u8_t)Addr);  
      SPI_FLASH_CS_HIGH();                        //取消片選              
    SPI_Flash_Wait_Busy();                              //等待擦除完成
        Addr+=4096; 
        }  
    return 0;
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 1、SPI總線: SPI(同步外設接口)是由摩托羅拉公司開發(fā)的全雙工同步串行總線,其接口由 MISO(...
    倦鳥歸時閱讀 3,844評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,538評論 19 139
  • 新年福袋增給我大學室友,剛好明天就是她的生日,也祝愿狗年本命年的我們福氣滿滿。 參考臨摹了公眾號驢大萌,不管像不像...
    野梅子閱讀 430評論 1 4
  • 開始新工作已經(jīng)半個月,現(xiàn)在抽時間寫一下,剛到公司所做的事情。先到總部去報到辦理入職手續(xù),然后坐車到分公司的辦公室,...
    faith3729閱讀 185評論 0 0
  • 很多時候我們需要借助CocoaPods管理第三方開源類庫,但是由于國內(nèi)開發(fā)者直接使用CocoaPods是經(jīng)常速度緩...
    petter102閱讀 11,303評論 0 0

友情鏈接更多精彩內(nèi)容