spiflash w25X32 SPIFFS檔案系統的使用
一、什麼是SPIFFS?
spifs是專門為spi flash編寫的檔案系統,支援均勻摩擦演算法。
SPIFFS不需要Heap堆記憶體的能力,只需要一定的工作RAM緩衝區即可。
檔案系統下載連結https://github.com/pellepl/spiffs
二、SPIFFS移植
1、下載SPIFS原始碼,把src他加入到自己的工程裡,test資料夾可以刪除,default資料夾裡面的配置檔案拷貝到最外層目錄,最後檔案結構下圖
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;
}
相關文章
- 使用 /proc 檔案系統來控制系統(轉)
- 使用 /proc 檔案系統來控制系統 (zt)
- 使用cwRsync同步windows系統間的檔案Windows
- 使用 Fstransform 轉換檔案系統ORM
- 檔案和檔案系統
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- 【Solaris】Solaris檔案系統管理1 UFS檔案系統的建立
- 【Solaris】Solaris檔案系統管理3 ZFS檔案系統的建立
- UNIX根檔案系統和附加檔案系統
- Mac的檔案系統Mac
- 用Python寫一個FUSE(使用者態檔案系統)檔案系統Python
- 使用ramdisk啟動ubuntu檔案系統Ubuntu
- 檔案系統
- 細說GNU/Linux系統的檔案及檔案系統(轉)Linux
- 檔案系統(五):exFAT 檔案系統原理詳解
- windows下檔案系統支援的檔案大小Windows
- 分散式檔案系統之MogileFS的安裝使用分散式
- 在Linux系統環境下使用GFS檔案系統Linux
- win10系統icc配置檔案怎麼使用_win10系統icc配置檔案使用方法Win10
- linux的檔案系統Linux
- 如何在 Ubuntu 上使用 ZFS 檔案系統Ubuntu
- 加密檔案系統eCryptfs安裝與使用加密
- 使用RAM將檔案系統遷移到ASMASM
- Linux AS 使用記憶體檔案系統Linux記憶體
- ocfs2檔案系統使用詳解
- 提升 UNIX 中檔案系統使用效率(轉)
- Linux系統檔案系統及檔案基礎篇Linux
- 【檔案系統】嵌入式檔案系統Fatfs簡介
- 檔案系統(十):一文看懂 UBI 檔案系統
- 分散式檔案系統(HDFS)與 linux系統檔案系統 對比分散式Linux
- 檔案系統--fstab
- tmpfs檔案系統
- 系統配置檔案
- 檔案系統安全
- FUSE檔案系統
- spark直接讀取本地檔案系統的檔案Spark
- ASM與檔案系統之間copy資料檔案--檔案系統到ASMASM
- 使用者指南:Linux 檔案系統的連結Linux