0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何移植FatFs文件系統(tǒng)到SD卡內(nèi)

jf_pJlTbmA9 ? 來源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-09-19 09:11 ? 次閱讀

在前面章節(jié)中介紹了使用MM32F3270的SDIO外設(shè)驅(qū)動(dòng)SD卡,對(duì)SD卡識(shí)別和簡(jiǎn)單的數(shù)據(jù)讀寫驗(yàn)證,不過像這樣直接操作SD卡存儲(chǔ)單元,在實(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語言編寫,所以具有良好的硬件平臺(tái)獨(dú)立性??梢砸浦驳?051、PIC、AVR、SH、Z80、H8、ARM等系列單片機(jī)上而只需做簡(jiǎn)單的修改。它支持FATl2、FATl6和FAT32格式,支持多個(gè)存儲(chǔ)媒介,具有獨(dú)立的緩沖區(qū),可以對(duì)多個(gè)文件進(jìn)行讀/寫,并特別對(duì)8位單片機(jī)和16位單片機(jī)做了優(yōu)化。

本章節(jié)主要介紹移植FatFs文件系統(tǒng)到SD卡內(nèi)。

FatFs的特點(diǎn)

1)Windows兼容的FAT文件系統(tǒng)(支持FAT12/FAT16/FAT32)與平臺(tái)無關(guān),移植簡(jiǎn)單;

2)代碼量少、效率高;

3)多種配置選項(xiàng);

4)支持多卷(物理驅(qū)動(dòng)器或分區(qū),最多10個(gè)卷);

5)多個(gè)ANSI/OEM代碼頁包括DBCS;

6)支持長(zhǎng)文件名、 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ù)說明,函數(shù)調(diào)用實(shí)例等。

wKgZomUD8cuAFTkdAABYxqJX0kk900.png

官網(wǎng)有對(duì)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ū)動(dòng)的中間接口的實(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ù)制一份至該文件夾。

wKgZomUD8c2ADNhuAADOUabrU9k931.png
wKgaomUD8dGABXo4AAEGZ-eTmPc250.png

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

wKgZomUD8dKATkNKAAAgLjHjCCI835.png

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

wKgaomUD8dSAEbvbAAAboBlrwus858.png

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

wKgZomUD8dWAX8uKAABv34JCOG0549.png

此時(shí)進(jìn)行編譯,會(huì)發(fā)現(xiàn)提示錯(cuò)誤。

編寫FatFs接口函數(shù)

來看diskio.c文件,注釋前面的幾個(gè)頭文件,這里要加入自己的頭文件。下面的三個(gè)宏定義ATA、MMC、USB也可以改成想要的名稱,可以改成SD并定義為0。

wKgaomUD8deAWFxTAACDw6tcSZI972.png

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

wKgaomUD8diAIiwgAABUq_CQGUU473.png

更改如下:

wKgZomUD8dqAZh10AAA0HxfrY5s102.png

對(duì)disk_initialize、disk_read、disk_write幾個(gè)函數(shù)也這樣更改。

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

wKgaomUD8duAcqA-AAAb-EtjbKw659.png

然后進(jìn)行編譯,這時(shí)錯(cuò)誤就沒有了。

至此我們已經(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;
}

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    52

    文章

    8099

    瀏覽量

    145813
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • SD卡
    +關(guān)注

    關(guān)注

    2

    文章

    558

    瀏覽量

    63737
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    284

    瀏覽量

    19871
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于STM32完成FATFS文件系統(tǒng)移植與運(yùn)用

    這篇文章主要演示FATFS文件系統(tǒng)如何移植自己的工程,并完成文件的讀寫。 因?yàn)?b class='flag-5'>SD
    的頭像 發(fā)表于 03-08 09:17 ?5847次閱讀
    基于STM32完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>移植</b>與運(yùn)用

    FatFS文件系統(tǒng)在STM32F4上的移植和應(yīng)用

    在實(shí)現(xiàn)如U盤文件讀寫,SD文件讀寫等工作時(shí),我們往往需要一個(gè)文件系統(tǒng)來支持我們的工作。特別在一些MCU應(yīng)用中,
    的頭像 發(fā)表于 12-13 17:26 ?2460次閱讀
    <b class='flag-5'>FatFS</b><b class='flag-5'>文件系統(tǒng)</b>在STM32F4上的<b class='flag-5'>移植</b>和應(yīng)用

    STM32CubeMx入門教程(10):Fatfs文件系統(tǒng)的應(yīng)用

    導(dǎo)語"fatfs是一個(gè)小型的文件系統(tǒng),在小型的嵌入式系統(tǒng)中使用非常的廣泛,STM32CubeMx自帶該文件系統(tǒng),我們通過簡(jiǎn)單的配置就能夠使用,將前面的
    發(fā)表于 07-12 11:39 ?4859次閱讀
    STM32CubeMx入門教程(10):<b class='flag-5'>Fatfs</b><b class='flag-5'>文件系統(tǒng)</b>的應(yīng)用

    STM32+SD NAND(貼片SD)完成FATFS文件系統(tǒng)移植與測(cè)試

    這篇文章就手把手教大家,在STM32上完成FATFS文件系統(tǒng)移植;主控芯片采用STM32F103ZET6, 存儲(chǔ)芯片我這里采用(雷龍) CS創(chuàng)世 SD NAND 。
    的頭像 發(fā)表于 07-17 17:24 ?7297次閱讀
    STM32+<b class='flag-5'>SD</b> NAND(貼片<b class='flag-5'>SD</b><b class='flag-5'>卡</b>)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>移植</b>與測(cè)試

    轉(zhuǎn):基于KL26的SDFatfs文件系統(tǒng)移植

    本文主要講解如何一直FatFs文件系統(tǒng)KL26上,實(shí)現(xiàn)SD文件建立,讀寫等功能。[size
    發(fā)表于 06-04 14:41

    FATFS文件系統(tǒng)如何移植工程

    STM32F103ZET6系統(tǒng)板、一個(gè)SPI接口的SD槽模塊、一張SD工程完整源碼下載地址
    發(fā)表于 08-24 06:34

    介紹移植fatfs文件系統(tǒng)步驟

    前言嵌入式系統(tǒng)中我們常常對(duì)flash、SD、U盤等進(jìn)行操作,但我們操作一般是直接操作物理地址,使用起來相對(duì)來說比較繁瑣,也不能將我們自己寫的數(shù)據(jù)導(dǎo)出到我們的電腦中,這時(shí)大名鼎鼎的文件系統(tǒng)
    發(fā)表于 11-23 07:19

    FatFs文件系統(tǒng)的原理是什么?如何對(duì)FATFS進(jìn)行移植?

    FatFs文件系統(tǒng)的原理是什么?FatFs文件系統(tǒng)移植方法是什么?如何實(shí)現(xiàn)eMMC
    發(fā)表于 11-25 07:52

    靈動(dòng)微課堂 (第194講) | SDFatFs文件管理系統(tǒng)

    單片機(jī)做了優(yōu)化。本章節(jié)主要介紹移植FatFs文件系統(tǒng)SD
    發(fā)表于 01-10 11:31

    如何使用STM32CubeMX移植FATFS文件系統(tǒng)SD

    本篇詳細(xì)的記錄了如何使用STM32CubeMX移植FATFS文件系統(tǒng)SD上。1. 準(zhǔn)備工作硬
    發(fā)表于 03-01 07:45

    基于SDFATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉

    基于SDFATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉。
    發(fā)表于 04-14 16:46 ?40次下載

    STM32單片機(jī)移植SDFATFS文件系統(tǒng)

    最近看了32的sdFATFS文件系統(tǒng),現(xiàn)在就自己的理解總結(jié)一下。一、SD模塊
    發(fā)表于 11-15 16:51 ?6次下載
    STM32單片機(jī)<b class='flag-5'>移植</b><b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b>

    Fatfs文件系統(tǒng)移植

    Fatfs文件系統(tǒng)移植)一、文件系統(tǒng)介紹二、移植條件、說明1、FatFs模塊在可
    發(fā)表于 11-15 18:51 ?22次下載
    <b class='flag-5'>Fatfs</b>(<b class='flag-5'>文件系統(tǒng)</b>的<b class='flag-5'>移植</b>)

    文件系統(tǒng)FatFs文件系統(tǒng)在嵌入式芯片LPC18XX上的移植

    文件系統(tǒng)FatFs文件系統(tǒng)在嵌入式芯片LPC18XX上的移植
    發(fā)表于 12-04 10:51 ?12次下載
    【<b class='flag-5'>文件系統(tǒng)</b>】<b class='flag-5'>FatFs</b><b class='flag-5'>文件系統(tǒng)</b>在嵌入式芯片LPC18XX上的<b class='flag-5'>移植</b>

    基于STM32+CS創(chuàng)世 SD NAND(貼片SD)完成FATFS文件系統(tǒng)移植與測(cè)試(下篇)

    四、移植FATFS文件系統(tǒng)前面第3章,完成了SDNAND的驅(qū)動(dòng)代碼編寫,這一章節(jié)實(shí)現(xiàn)FATFS文件移植
    的頭像 發(fā)表于 03-03 13:52 ?1268次閱讀
    基于STM32+CS創(chuàng)世 <b class='flag-5'>SD</b> NAND(貼片<b class='flag-5'>SD</b><b class='flag-5'>卡</b>)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>移植</b>與測(cè)試(下篇)