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