今回はMbedを使ってSDカードにアクセスしてみます。
投稿時の開発環境を記しておきます。
PC:Windows10 OS
IDE: STM32CubeIDE Version1.3.0
Board: STM32Nucleo-F401RE
お詫びと免責
改訂履歴にも書いていますが、こちらで扱っているMbedのバージョンは OS2 になります。
誤った記事を掲載したことについて、お詫び申し上げます。
OS5を扱いたい方にとっては有用な記事ではないかも知れないことをご了承ください。
OS2と5 の違いについては こちら をご覧になってください。
また、こちらの記事の内容は動作を保証するものではありませんのでお使いになる場合には、充分検証された上、自己責任でお願いします。
Mbed OS2のプロジェクトファイル
Mbed OS2 が使えるプロジェクトをダウンロードできるようにしました。
詳しくは STM32 Mbed OS2 が使える STM32CubeIDEプロジェクト の記事をご覧ください。
プロジェクトファイルをダウンロードすることで、Mbedを使うための環境構築は不要になります。
SDカードコネクタ等を準備する
今回は こちら のSDカードコネクタを使ってみました。
取り扱いについては こちら をご覧ください。
U1のレギュレーターは使用していません。
また電源電圧は 3.3V ですのでご注意ください。
SDカードとパソコンで読めるようにカードリーダーも準備しておいてください。
配線する
以下のように接続しました。
プルアップ抵抗はないと絶対に動かないかというと、そうでもないようですが動かないカードもあるようなのでつけておきました。
10k程度をつけておけば良いでしょう。
以下にNucleo-F401REのコネクタの情報も載せておきます。
SDFileSystemのダウンロード
Mbed OS2 で SDカードを扱うには SDFileSystem を使います。
ダウンロードするものは、いろいろあって迷うのですが、今回は こちら を選びました。
最近「デスクトップにエクスポート」の機能が使えないので、コンパイラにインポートして、コンパイラからエクスポートしました。
Mbedコンパイラのプログラムワークスペースで SDFileSystem_Test を右クリックして、プログラムのエクスポートを選択し、
Export Target: NUCLEO-F401RE
Export Toolchain: Sw4STM32
を選択し Export します。
プロジェクトにSDFileSystemをコピーする
ファイルを解凍し、これらをIDE上のプロジェクトにコピーします。
例えば以下の図は F401mbedBase プロジェクトに SDFileSystem を追加したものです。
ソースとファイルパスを追加する
Project – Properties – C/C++ General – Paths and Symbols – Includesタブで
SDFileSystem
SDFileSystem/FATFileSystem
SDFileSystem/FATFileSystem/ChanN
を Language C と C++ に追加します。
また、Project – Properties – C/C++ General – Paths and Symbols – Source Locationタブで
SDFileSystem フォルダを Add Folder で追加します。
ビルドしてみる
まずこれでビルドするとエラーが出ます。
FATFileSystemが改訂されているようなので、そちらをダウンロードしてきます。
こちら からコンパイラにインポートします。
こちらをエクスポートする際に Toolchainに Sw4STM32 を選択するとなぜかエラーが出るので ZIP を選択します。
Export Target: NUCLEO-F401RE
Export Toolchain: ZIP Archive (with repositories)
そしてダウンロードしたものを解凍し、IDEのプロジェクトツリーの FATFileSystem を入れ替えます。
これはウィンドウ エクスプローラーで作業すれば良いでしょう。
入れ替えた後は、IDEで File – Refresh を選択しファイル内容が入れ替わったことを IDE に伝えておきます。
コーディングする
#include "SDFileSystem.h"
int main(void)
{
/* USER CODE BEGIN 1 */
Serial s(SERIAL_TX, SERIAL_RX, "SERIAL1");
s.baud(9600);
s.format(8, SerialBase::None, 1);
SDFileSystem sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, "sd");
mkdir("/sd/mydir", 0777);
FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
if (fp == NULL)
{
s.printf("File open error!\r\n");
}
else
{
s.printf("File open success!\r\n");
fprintf(fp, "Hello fun SD Card World!");
}
fclose(fp);
コードの概略説明
printf出力するのに、Serialクラスを使っています。
このお相手はいつものように VCP を使って PC の Tera Term を使いました。
VCP がわからない方は こちら をご覧になってください。
SDFileSystemの構築(ピン配置)は SDFileSystem.h を参照してください。
SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS の定義は以下のヘッダファイルを確認してください。
接続に合うようにピンを決めています。
mbed-dev/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/PinNames.h
その他はサンプルコードとほぼ同じです。
mkdir()でディレクトリを作成し、ファイルオープンし成功したら “Hello fun SD Card World!” を書き込んでいます。
777の数値はパーミッションと呼ばれるアクセス権を決める数値です。
読み取り、書き込み、実行の許可を「所有ユーザー」、「所有グループ」、「その他のユーザー」に対して指示しています。
何でもありってことですね。
ビルド&実行する
こちらの環境では無事に書き込むことができました。
カードリーダーで SD を読み mydirディレクトリの中の sdtest.txtファイル に “Hello fun SD Card World!” が書き込まれていることを確認できました。
コメントを書く