FatFsをSTM32で使ってみる

出典: Wikimura

FatFsはChaN氏が開発したFATファイルシステムの実装です。他にもいろいろなところの実装があるのですが、FatFsは日本語資料が豊富、開発が継続している、STM32でもサンプルが存在する、などの理由から、利用しやすいと判断しました。

まずはソースをダウンロードし、資料を読んでみます。

FatFsを移植するのに必要なものは?

FatFsはアプリケーション側にFAT操作用の関数をいくつか提供してくれるそうです。これをターゲットのプラットフォームに移植するには、ハードウェアを操作するいくつかの関数を実装する必要があります。

オフィシャルの図にあるように、記憶媒体はHDD・SD・NAND、なんでも良いそうです。バックエンドの関数をしっかり作ってやれば、同じフロントエンドから使えるということだそうです。 そのために実装する必要のある関数は以下の6つだそうです。

  • disk_initialize - ディスク・ドライブの初期化
  • disk_status - ディスク・ドライブの状態取得
  • disk_read - ディスクからの読み込み
  • disk_write - ディスクへの書き込み
  • disk_ioctl - その他のドライブ制御
  • get_fattime - 日付・時刻の取得


これらのテンプレートは、[src/diskio.c]に書かれていました。 物理ドライブとしてATA、MMC、USBがつながっている場合の例が載っていました。 例といっても、具体的なコードのないスケルトンの状態です。 どうやら、ドライブ番号ごとに呼び出す関数を変えるようです。以下のように書かれていました。

DSTATUS disk_initialize ( BYTE drv)
{
    DSTATUS stat;
    int result;

    switch (drv) {
    case ATA :
        result = ATA_disk_initialize();
        return stat;
    case MMC :
        result = MMC_disk_initialize();
        return stat;
    case USB :
        result = USB_disk_initialize();
        return stat;
    }
    return STA_NOINIT;
}

移植するときは、[src/diskio.h]をインクルードして、バックエンドの関数を実装することが求められているようです。


バックエンドを実装するには?

STM32-P103ボードのSDカードを読み書きしたいので、以下を調べます。これについては「STM32でSPIを使ってみる」に書きます。

  • SPIペリフェラルの操作方法
  • SPIモードのSDカード操作方法