0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STM32F407にファイルシステムとファイルブラウザを実装する

0
Last updated at Posted at 2026-05-14

背景

今までもSTM32マイコンにFatFsは搭載していました。
CubeMXのミドルウェアにFatFsがあり、簡単に組み込めます。
ドライブも

  • USBメモリ
  • SDカード

から選べますし、両方使うこともできます。

今まではC言語でFatFsをラッピングして使いやすいように実装していましたが、C++への移行を機にファイルシステムもC++でラッピングします。

それと、ファイルシステムがあるなら、やはりファイルブラウザも欲しいです。
これもC言語からC++へ移行し、ファイルシステムのラッピングに統合します。

これでFatFsを組み込み、さらにラッピングしたC++のクラスを組み込めば、ファイルのリードライトだけでなく、ファイルのブラウズもできるようになります。

CubeMXでのFatFs設定

ファイルシステムとして使うだけであれば、CubeMXの初期設定のままでいいです。

今回、ファイルブラウザとして使うにあたって、必須の機能としてディレクトリの移動があなります。

また、現在のディレクトリパスの取得も必要なので、このための設定を変更します。
スクリーンショット 2026-05-14 10.48.03.png
FA_RPATH(Relative Path)をEnabled with f_getcwdに変更します。
相対パスを使う必要があるのと、f_getcwdで現在のパスを取得する必要があるからです。

コードジェネレートすれば、簡単にFatFsをプロジェクトに組み込めます。
ほんと、CubeMXってすごいと思います。

ファイルブラウザの機能

FatFsの機能をうまく使えば、ファイルブラウザも用意に実現できます。
最低限の機能を実装してみました。

現在のディレクトリ内にあるファイル一覧

まずはなんといってもファイルの一覧ですよね!
UNIXライクにlsコマンドで表示します。

ファイルの場合はそのサイズを、ディレクトリの場合はDIRと表示します。

ファイル内容の表示

あまり使うことはないかも知れませんが、ファイルのリード操作の確認に便利です。
同じくUNIXライクにcatコマンドを使います。

リストにあるHELLO.TXTを表示しました。
ファイルのサイズは13バイトと小さなもので、ファイルの内容はこんな感じです。
ちゃんと表示できてますね。

サイズの大きなファイルももちろん表示できます。
英文ニュースの記事をコピペしたNEWS.TXTというテキストファイルを表示します。

テキストファイルなら問題なく表示できます。
バイナリファイルはターミナルによってはおかしな動作になりますが、その辺はそれなりに...という感じです。

ディレクトリの移動

STM32F407に接続しているUSBメモリの中身は、Macで確認するとこんなふうになっています。

スクリーンショット 2026-05-14 9.28.16.png
ちょっと階層が深めのCCM/CCMDIR/testdir/へ移動してみましょう。

スクリーンショット 2026-05-14 11.05.23.png

Macで確認した通り、CCM/CCMDIR/TESTDIRの中にCCM-001.BINというファイルが入っていますね。

こんな感じでディレクトリが移動できるのに加えて、現在のディレクトリの位置をプロンプトで表示しています。
この現在のディレクトリのプロンプトはf_getcwdで取得しています。

UNIXと同じように、「..」で一つ前のディレクトリに戻れます。
これは相対パスを利用できるようにしたので利用できる機能です。

ファイルシステムのクラス

スクリーンショット 2026-05-14 11.16.02.png
コードを記載しても仕方ないかなぁ...と思い、こんな感じにクラスにしてますよという画像です。
よく使われるであろう機能をC++のメンバー関数として実装しています。
メンバー関数の中ではFatFsの関数を使っています。

ファイルシステムとしての機能、ファイルブラウザとしての機能の両方を実装してあります。

なので、プロジェクトが変わっても

  • CubeMXでFatFsを組み込む
  • ファイルシステムのクラスを組み込む

だけで簡単に利用できます。
この簡単さはC++だからできるものです。
C言語の時は処理を共通化してはいましたが、そこそこ手間はかかったものです。

最後に

C言語でやっていたときも、共通処理として共有できるようにはしていました。
でも、クラス化することでメソッドの追加も簡単ですし、使い回しもしやすいです。

ファイルシステム以外でも、いろんなものをクラスかすると便利です。
ちなみに、今回のファイルブラウザはUSB CDCへ文字列を出力しており、もちろんUSB CDCもクラスです。
CubeMXでのドライバ・ミドルウェアの提供はC言語ですが、ちゃんとC++でも使えますよ。

一部「#define __cplusplus」や「extern "C"」が必要ですが、C言語と共存するには避けられません。
この辺は慣れちゃえばいいですね。

そうそう、私のFatFsの教科書はこちらです。
長年お世話になっています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?