21.1 文件系統概述
21.1.1 簡介
FATFS是一個完全免費開源的FAT文件系統模塊,專門為小型的嵌入式系統而設計。它完全用標準C語言編寫,所以具有良好的硬件平臺獨立性,甚至可以移植到8位的單片機上而只需做簡單的修改。它支持FAT12、FAT16和FAT32,支持多個存儲媒介;有獨立的緩沖區,可以對多個文件進行讀/寫,并特別對8位單片機和16位單片機做了優化。
FATFS的特點有:
(1)Windows兼容的FAT文件系統(支持FAT12/FAT16/FAT32)
(2)與平臺無關,移植簡單
(3)代碼量少、效率高
(4)多種配置選項
(5)支持多卷(物理驅動器或分區,最多10個卷)
(6)多個ANSI/OEM代碼頁包括DBCS
(7)支持長文件名、ANSI/OEM或Unicode
(8)支持RTOS
(9)支持多種扇區大小
(10)只讀、最小化的API和I/O緩沖區等
FATFS的這些特點,加上免費、開源的原則,使得FATFS應用非常廣泛。FATFS模塊的層次結構如下圖所示。
最頂層是應用層,使用者無需理會FATFS的內部結構和復雜的FAT協議,只需要調用FATFS模塊提供給用戶的一系列應用接口函數,如f_open,f_read,f_write和f_close等,就可以像在PC上讀寫文件那樣簡單。
中間層FATFS模塊,實現了FAT文件讀寫協議。FATFS模塊提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用時將頭文件直接包含進去即可。
需要我們編寫移植代碼的是FATFS模塊提供的底層接口,它包括存儲媒介讀寫接口和供給文件創建修改時間的實時時鐘。FATFS的源代碼用戶可以通過官網:http://elm-chan.org/fsw/ff/00index_e.html下載到。目前最新的版本是R0.14,這里我們采用最新版本的FATFS為例來講解如何將文件系統移植到STM32中。
源代碼下載之后,進行解壓可以發現里面一共有兩個文件夾,doc和src,其中doc是對文件系統的描述,源碼都在src里面,其中,與平臺無關的是:
ffconf.h FATFS模塊配置文件
ff.h FATFS和應用模塊公用的包含文件
ff.c FATFS模塊
diskio.h FATFS和diskI/O模塊公用的包含文件
interger.h 數據類型定義
option 可選的外部功能(比如支持中文等)
與平臺相關的代碼是:
diskio.c FATFS和diskI/O模塊接口層文件
FATFS模塊在移植的時候,我們一般只需要修改2個文件,即ffconf.h和diskio.c。FATFS模塊的所有配置項都是存放在ffconf.h里面,我們可以通過配置里面的一些選項,來滿足自己的需求。接下來我們介紹幾個重要的配置選項。
21.1.2 文件系統配置
(1)_FS_TINY:這個選項在R0.07版本中開始出現,之前的版本都是以獨立的C文件出現(FATFS和TinyFATFS),有了這個選項之后,兩者整合在一起了,使用起來更方便。我們使用FATFS,所以把這個選項定義為0即可
(2)_FS_READONLY:這個用來配置是不是只讀,本章我們需要讀寫都用,所以這里設置為0即可
(3)_USE_STRFUNC:這個用來設置是否支持字符串類操作,比如f_putc,f_puts等,我們需要用到,故設置這里為1
(4)_USE_MKFS:這個用來定時是否使能格式化,本章需要用到,所以設置這里為1
(5)_USE_FASTSEEK:這個用來使能快速定位,我們設置為1,使能快速定位
(6)_USE_LABEL:這個用來設置是否支持磁盤盤符讀取與設置。設置為1,使能,就可以通過相關函數讀取或者設置磁盤的名字了
(7)_CODE_PAGE:這個用于設置語言類型,包括很多選項,我們這里設置為936,即簡體中文(GBK碼,需要c936.c文件支持,該文件在option文件夾)
(8)_USE_LFN:該選項用于設置是否支持長文件名,取值范圍為03。0,表示不支持長文件名,13是支持長文件名,但是存儲地方不一樣,這里使用3,通過ff_memalloc函數來動態分配長文件名的存儲區域
(9)_VOLUMES:用于設置FATFS支持的邏輯設備數目,我們設置為2,即支持2個設備
(10)_MAX_SS:扇區緩沖的最大值,一般設置為512
21.1.3 接口移植
(1)磁盤初始化
函數名稱 | disk_initialize |
---|---|
函數原型 | DSTATUS disk_initialize (BYTE pdrv) |
功能描述 | 初始化磁盤驅動器 |
函數參數 | pdrv:指定要初始化的邏輯驅動器編號,即盤符,取值范圍0~9 |
返回值 | 返回一個磁盤狀態作為結果 |
所在文件 | diskio.c |
備注 | 該函數用于初始化一個邏輯驅動器為讀寫數據做準備 |
(2)檢查磁盤狀態
函數名稱 | disk_status |
---|---|
函數原型 | DSTATUS disk_ status (BYTE pdrv) |
功能描述 | 查詢磁盤驅動器狀態 |
函數參數 | pdrv:指定要初始化的邏輯驅動器編號,即盤符,取值范圍0~9 |
返回值 | 返回下面標志的組合STA_NOINIT:表明磁盤沒有初始化STA_NODISK:表示驅動器中沒有設備STA_PROTECTED:表示設備被寫保護 |
所在文件 | diskio.c |
(3)磁盤讀數據
函數名稱 | disk_read |
---|---|
函數原型 | DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count) |
功能描述 | 從磁盤中讀取數據 |
函數參數 | pdrv:指定要初始化的邏輯驅動器編號,即盤符,取值范圍0 |
返回值 | RES_OK:成功RES_ERROR:讀操作期間產生了錯誤且無法恢復RES_PARERR:非法參數RES_NOTRDY:磁盤驅動器沒有初始化 |
所在文件 | diskio.c |
(4)磁盤寫數據
函數名稱 | disk_write |
---|---|
函數原型 | DRESULT disk_write(BYTE pdrv, BYTE* buff, LBA_t sector, UINT count) |
功能描述 | 從磁盤中寫入數據 |
函數參數 | pdrv:指定要初始化的邏輯驅動器編號,即盤符,取值范圍0 |
返回值 | RES_OK:成功RES_ERROR:讀操作期間產生了錯誤且無法恢復RES_WRPRT:媒體被寫保護RES_PARERR:非法參數RES_NOTRDY:磁盤驅動器沒有初始化 |
所在文件 | diskio.c |
(5)磁盤雜項功能
函數名稱 | disk_ioctl |
---|---|
函數原型 | DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff) |
功能描述 | 從磁盤中寫入數據 |
函數參數 | pdrv:指定要初始化的邏輯驅動器編號,即盤符,取值范圍0~9cmd:命令代碼*buff:指向參數緩沖區指針 |
返回值 | RES_OK:成功RES_ERROR:讀操作期間產生了錯誤且無法恢復RES_WRPRT:媒體被寫保護RES_PARERR:非法參數RES_NOTRDY:磁盤驅動器沒有初始化 |
所在文件 | diskio.c |
21.2 FATFS代碼移植
21.2.1 diskio.c文件修改
(1)修改宏定義如下圖所示。
將14,15行代碼修改為
#define SD_CARD //SD卡,卷標為0
#define EX_FLASH //外部flash,卷標為1
(2)修改disk_status函數如下所示。
DSTATUS disk_status( BYTE pdrv )
{
return RES_OK;
}
(3)修改disk_initialize函數如下所示。
DSTATUS disk_initialize( BYTE pdrv )
{
int res ;
switch( pdrv )
{
case SD_CARD : res = SD_Init() ; break; //初始化SD卡
case EX_FLASH : W25QXX_Init(); break;//初始化外部FLASH
case DEV_USB : break;
}
if( res )
return STA_NOINIT ;
else
return 0 ;
}
-
單片機
+關注
關注
6035文章
44554瀏覽量
634663 -
嵌入式系統
+關注
關注
41文章
3587瀏覽量
129436 -
FATFS
+關注
關注
0文章
44瀏覽量
18298
發布評論請先 登錄
相關推薦
評論