在前面章節(jié)中介紹了使用MM32F3270的SDIO外設(shè)驅(qū)動SD卡,對SD卡識別和簡單的數(shù)據(jù)讀寫驗(yàn)證,不過像這樣直接操作SD卡存儲單元,在實(shí)際應(yīng)用中是不現(xiàn)實(shí)的。SD卡一般用來存放文件,所以都需要加載文件系統(tǒng)到里面。
FatFs 是一個(gè)通用的文件系統(tǒng)(FAT/exFAT)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng)。完全用標(biāo)準(zhǔn)C語言編寫,所以具有良好的硬件平臺獨(dú)立性??梢砸浦驳?051、PIC、AVR、SH、Z80、H8、ARM等系列單片機(jī)上而只需做簡單的修改。它支持FATl2、FATl6和FAT32格式,支持多個(gè)存儲媒介,具有獨(dú)立的緩沖區(qū),可以對多個(gè)文件進(jìn)行讀/寫,并特別對8位單片機(jī)和16位單片機(jī)做了優(yōu)化。
本章節(jié)主要介紹移植FatFs文件系統(tǒng)到SD卡內(nèi)。
FatFs的特點(diǎn)
1)Windows兼容的FAT文件系統(tǒng)(支持FAT12/FAT16/FAT32)與平臺無關(guān),移植簡單;
2)代碼量少、效率高;
3)多種配置選項(xiàng);
4)支持多卷(物理驅(qū)動器或分區(qū),最多10個(gè)卷);
5)多個(gè)ANSI/OEM代碼頁包括DBCS;
6)支持長文件名、 ANSI/OEM 或Unicode;
7)支持RTOS;
8)支持多種扇區(qū)大??;
9)只讀、最小化的API和I/O緩沖區(qū)等。
FatFs源碼獲取
FatFs文件系統(tǒng)的源碼可以從FatFs官網(wǎng)下載:
http://elm-chan.org/fsw/ff/00index_e.html
此地址不僅僅包含資料包下載,還包括文件系統(tǒng)一些知識,包括函數(shù)說明,函數(shù)調(diào)用實(shí)例等。

官網(wǎng)有對FatFs做詳細(xì)的介紹,感興趣可以多了解一些。所有版本的FatFs源碼的移植步驟都是類似的,我們選擇選擇其中一個(gè)版本下載即可。
FatFs文件結(jié)構(gòu)
解壓之后可看到里面有 doc 和src 這兩個(gè)文件。
其中doc文件夾里面是一些使用幫助文檔,src是FatFs文件系統(tǒng)的源碼。
FatFs的源代碼主要包含幾個(gè)文件:
diskio.c、 diskio.h、 ff.c、 ff.h、 integer.h文件。
其中diskio.c 這個(gè)文件是文件系統(tǒng)底層和SD驅(qū)動的中間接口的實(shí)現(xiàn)代碼,移植的時(shí)候需要改寫在diskio.h中聲明的那幾個(gè)函數(shù),代碼在ff.c中被調(diào)用;diskio.h定義了FatFs用到的宏;ff.c是一般FatFs的代碼文件;ff.h是一般FatFs包含的頭文件;integer.h是內(nèi)部基本類型的定義。
option文件夾下是一些可選的外部c文件,包含了多語言支持需要用到的文件和轉(zhuǎn)換函數(shù)。
00readme.txt 說明了當(dāng)前目錄下 diskio.c 、 diskio.h、 ff.c、 ff.h、 integer.h 的功能。
FatFs移植步驟
在工程目錄下新建FatFs文件夾,并將src文件夾下的文件復(fù)制一份至該文件夾。


使用KEIL打開工程文件并添加FatFs組件,并將src文件夾下的ff.c、 diskio.c 和 cc936.c 三個(gè)文件加入FatFs組件中。

加入cc936.c文件可以支持簡體中文,同時(shí)需要把 ffconf.h 中的 _CODE_PAGE 的宏改成 936。

接著添加FatFs路徑到工程選項(xiàng)。

此時(shí)進(jìn)行編譯,會發(fā)現(xiàn)提示錯誤。
編寫FatFs接口函數(shù)
來看diskio.c文件,注釋前面的幾個(gè)頭文件,這里要加入自己的頭文件。下面的三個(gè)宏定義ATA、MMC、USB也可以改成想要的名稱,可以改成SD并定義為0。

然后將函數(shù)disk_status、disk_initialize、disk_read、disk_write里面執(zhí)行的代碼注釋或者刪除,這里需要添加自己的代碼。由于上面改了宏定義,這里switch-case也要做一些修改。

更改如下:

對disk_initialize、disk_read、disk_write幾個(gè)函數(shù)也這樣更改。
再次編譯,發(fā)現(xiàn)提示一個(gè)關(guān)于get_fattime的錯誤,get_fattime用來獲取當(dāng)前時(shí)間,如果不需要,在ffconf.h中的宏定義#define _FS_NORTC改為1關(guān)閉,如果需要這個(gè)功能,需要在diskio.c里面,實(shí)現(xiàn)get_fattime函數(shù),加入如下代碼即可。

然后進(jìn)行編譯,這時(shí)錯誤就沒有了。
至此我們已經(jīng)完成FatFs文件管理系統(tǒng)的移植,不過功能還沒有實(shí)現(xiàn),需要在disk_status、disk_initialize、disk_read、disk_writ、disk_ioctl函數(shù)中加入執(zhí)行代碼:
設(shè)備狀態(tài)獲取
DSTATUS disk_status (
BYTE pdrv /* Physical drive number to identify the drive */
)
{
DSTATUS stat;
stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]);
return stat;
}
設(shè)備初始化
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat = RES_OK;
if(disk.is_initialized[pdrv] == 0) {
disk.is_initialized[pdrv] = 1;
stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
}
return stat;
}
讀取扇區(qū)
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE* buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
)
{
DRESULT res;
res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
return res;
}
扇區(qū)寫入
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE* buff, /* Data to be written */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to write */
)
{
DRESULT res;
res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count);
return res;
}
其他
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void* buff /* Buffer to send/receive control data */
)
{
DRESULT res;
res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff);
return res;
}
審核編輯:彭菁
-
驅(qū)動器
+關(guān)注
關(guān)注
54文章
9082瀏覽量
155498 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7335瀏覽量
94757 -
SD卡
+關(guān)注
關(guān)注
2文章
589瀏覽量
68691 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
302瀏覽量
20976
發(fā)布評論請先 登錄
基于STM32完成FATFS文件系統(tǒng)移植與運(yùn)用
FatFS文件系統(tǒng)在STM32F4上的移植和應(yīng)用
STM32CubeMx入門教程(10):Fatfs文件系統(tǒng)的應(yīng)用
STM32+SD NAND(貼片SD卡)完成FATFS文件系統(tǒng)移植與測試
轉(zhuǎn):基于KL26的SD卡Fatfs文件系統(tǒng)移植
FATFS文件系統(tǒng)如何移植工程
介紹移植fatfs文件系統(tǒng)步驟
FatFs文件系統(tǒng)的原理是什么?如何對FATFS進(jìn)行移植?
靈動微課堂 (第194講) | SD卡的FatFs文件管理系統(tǒng)
如何使用STM32CubeMX移植FATFS文件系統(tǒng)到SD卡上
基于SD卡的FATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉
STM32單片機(jī)移植SD卡FATFS文件系統(tǒng)
Fatfs(文件系統(tǒng)的移植)
【文件系統(tǒng)】FatFs文件系統(tǒng)在嵌入式芯片LPC18XX上的移植
基于STM32+CS創(chuàng)世 SD NAND(貼片SD卡)完成FATFS文件系統(tǒng)移植與測試(下篇)
如何移植FatFs文件系統(tǒng)到SD卡內(nèi)
評論