1. 程式人生 > >FATFS檔案系統移植

FATFS檔案系統移植

先說下我做的專案實現功能吧!語音播放器,類似一個小MP3那種,只是儲存用的SD卡、TF卡。檔案系統採用了開源的FATFS.

FATFS模組的層次結構圖

1、底層介面,包括儲存媒介讀/寫介面(disk I/O)和供給檔案建立修改時間的實時時鐘,需要我們根據平臺和儲存介質編寫移植程式碼。

2、中間層FATFS模組,實現了FAT 檔案讀/寫協議。FATFS模組提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用時將標頭檔案直接包含進去即可。

3、最頂層是應用層,使用者無需理會FATFS的內部結構和複雜的FAT 協議,只需要呼叫FATFS模組提供給使用者的一系列應用介面函式,如f_open,f_read,f_write 和f_close等,就可以像在PC 上讀/寫檔案那樣簡單。

FATFS檔案系統包:下載地址:http://elm-chan.org/fsw/ff/00index_e.html  

此地址不僅僅包含資料包下載,還包括檔案系統一些知 識,包括函式說明,函式呼叫例項等。

FATFS檔案系統包結構

FATFS檔案系統包結構

檔名

功能

說明

ffconf.h

FATFS模組配置檔案

 需要根據需求來配置引數。

ff.h

FATFS和應用模組公用的包含檔案

 不需要修改

ff.c

FATFS模組原始碼

 不需要修改

diskio.h

FATFS和disk I/O模組公用的包含檔案

 不需要修改

 

diskio.c

FATFS和disk I/O模組介面層檔案

與平臺相關的程式碼,需要使用者根據儲存介質來編寫函式。

interger.h

資料型別定義

與編譯器有關。

option資料夾

可選的外部功能(比如支援中文等)

漢字實驗把字型檔放到SPI FLASH需要修改

ffconf.h : FATFS關鍵配置檔案

_FS_TINY。這個選項在R0.07版本中開始出現,之前的版本都是以獨立的C檔案出現(FATFS和Tiny FATFS),有了這個選項之後,兩者整合在一起了,使用起來更方便。我們使用FATFS,所以把這個選項定義為0即可。

_FS_READONLY。這個用來配置是不是隻讀,本章我們需要讀寫都用,所以這裡設定為0即可。

_USE_STRFUNC。這個用來設定是否支援字串類操作,比如f_putc,f_puts等,本章我們需要用到,故設定這裡為1。

_USE_MKFS。這個用來定時是否使能格式化,本章需     要用到,所以設     置這裡為1。

_USE_FASTSEEK。這個用來使能快速定位,我們設定     為1,使能快速定位。

_USE_LABEL。這個用來設定是否支援磁碟碟符(磁碟名字)讀取與設定。我們設定為1,使能,就可以通過相關函式來讀取和設定磁碟的名字了。

_CODE_PAGE。這個用於設定語言型別,包括很多選項(見FATFS官網說明),我們這裡設定為936,即簡體中文(GBK碼,需要c936.c檔案支援,該檔案在option資料夾)。

_USE_LFN。該選項用於設定是否支援長檔名(還需要_CODE_PAGE支援),取值範圍為0~3。0,表示不支援長檔名,1~3是支援長檔名,但是儲存地方不一樣,我們選擇使用3,通過ff_memalloc函式來動態分配長檔名的儲存區域。

_VOLUMES。用於設定FATFS支援的邏輯裝置數目,我們設定為3的話,即支援3個裝置(磁碟)。

_MAX_SS。扇區緩衝的最大值,一般設定為512。

FATFS移植步驟

資料型別:在integer.h 裡面去定義好資料的型別。這裡需要了解你用的編譯器的資料型別,並根據編譯器定義好資料型別。

配置:通過ffconf.h配置FATFS的相關功能,以滿足你的需要。

函式編寫:開啟diskio.c,進行底層驅動編寫,一般需要編寫6 個介面函式

FATFS開放函式

f_mount - 註冊/登出一個工作區域(Work Area)

f_open - 開啟/建立一個檔案

f_close - 關閉一個檔案

f_read - 讀檔案

f_write - 寫檔案

f_lseek - 移動檔案讀/寫指標

f_truncate -截斷檔案

f_sync -  沖洗緩衝資料 Flush Cached Data

f_forward - 直接轉移檔案資料到一個數據流

f_stat - 獲取檔案狀態

f_opendir - 開啟一個目錄

f_closedir -關閉一個已經開啟的目錄

f_readdir - 讀取目錄條目

f_mkdir - 建立一個目錄

f_unlink -刪除一個檔案或目錄

f_chmod -  改變屬性(Attribute)

f_utime -改變時間戳(Timestamp)

f_rename - 重新命名/移動一個檔案或資料夾

f_chdir - 改變當前目錄

f_chdrive - 改變當前驅動器

f_getcwd -  獲取當前工作目錄

f_getfree - 獲取空閒簇 Get Free Clusters

f_getlabel - Get volume label

f_setlabel - Set volume label f_mkfs - 在驅動器上建立一個檔案系統

f_fdisk - Divide a physical drive

f_gets - 讀一個字串

f_putc - 寫一個字元

f_puts - 寫一個字串

f_printf - 寫一個格式化的字串

f_tell - 獲取當前讀/寫指標

f_eof - 測試檔案結束

f_size - 獲取檔案大小

f_error - 測試檔案上的錯誤

本來想自己總結的,但是找圖的時候發現原子哥的PPT寫的挺好,哈哈哈哈我就直接整理過來了。