SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 COM ポート : 非同期シリアル通信 ) を使用して SD カードのアクセスを試験することができます 目次 1. 概要... 2 2. SD カードの接続... 2 3. STM32F4 Discovery 基板と PC との接続... 3 4. SDC_SDIO_STM32F4 プログラムの書き込み... 4 5. SD カードアクセス試験... 5 5.1. SD カードの書き込み... 5 5.2. SD カードの読み込み... 5 5.3. SD カードアクセス試験のためのモジュール... 6 6. 飛石伝ひアプリケーション の使い方... 10 6.1. RTC への時刻の設定... 10 6.2. RTC の時刻の読み込み... 12 6.3. SD カードの容量の取得... 14 6.4. フォルダ一覧... 16 6.5. ファイル一覧... 18 6.6. ファイル読み込み... 20 7. 試験用の受信コマンド処理をビルドからはずす... 23 1
1. 概要 SDC_SDIO_STM32F4 は STM32F4 Discovery 基板用の SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです VCP(USB 仮想 COM ポート : 非同期シリアル通信 ) を使用して SD カードのアクセスを試験することができます 飛石伝ひアプリケーション を使用します なお 本プロジェクトは プログラムサイズが大きいため Build Setting が Debug では制限の 32Kbyte を超えてしまうためビルドできません Build Setting を Release で使用してください 2. SD カードの接続 STM32F4 Discovery 基板と SD カードとの信号の接続は以下の通りです Micro SD カードのソケットの一例です Pin SD カード信号名 CPU 信号名 CPU 機能名 基板コネクタピン番号 備考 1 DAT2 PC10 SDIO_D2 P2-37 2 DAT3 PC11 SDIO_D3 P2-38 3 CMD PD2 SDIO_CMD P2-34 4 VDD ----- +3.3V 5 CLK PC12 SDIO_CK P2-35 6 VSS ----- GND 7 DAT0 PC8 SDIO_D0 P2-46 8 DAT1 PC9 SDIO_D1 P2-47 9 B( ソケットの信号 ) PE14 I/O P1-32 カード検出 (Detect SDC) 10 A( ソケットの信号 ) GND カード検出 (GND) 基板のコネクタと SD カードとの配線はできる限り短くしてください また 直列にダンピング抵抗 22Ω を入れるとより安定して動作します 飛石伝ひ CPU 基板 のページの回路図を参考にしてください 2
3. STM32F4 Discovery 基板と PC との接続 STM32F4 Discovery 基板と PC とは USB ケーブルで以下のように接続します USB ケーブル : 電源供給またはプログラム書き込みのため Mini B PC A USB ポート A STM32F4 Discovery SD カード Micro B 図 3. USB ケーブル : VCP( 仮想 COM ポート : 非同期シリアル通信 ) のため 3
4. SDC_SDIO_STM32F4 プログラムの書き込み Work space に Work_SDC_SDIO_STM32F4 を選択してプロジェクトを開くと以下の画面になります Build Setting が Release であることを確認してください プロジェクトの開き方や設定については ホームページの Atollic TrueSTUDIO for ARM Lite のプロジェクトサンプルの利用方法 の中の 4. プロジェクトサンプルを開く方法 をご覧ください PC と STM32F4 Discovery の Mini USB コネクタ CN1 を USB ケーブルで接続した状態で この虫のアイコンをクリックします マウスポインタをアイコンの上に重ねると Debug SDC_SDIO_STM32F4.elf と表示されます 書き込みが終了すると 以下の画面になります Build Setting が Release なので デバッグ情報がないため No source available と表示されています 赤い四角のアイコンをクリックすると エディタ画面にもどり プログラムが実行されます 4
No source available と書かれた画面が残ったままになっているので タブの x をクリックして閉じておきましょう プログラムが動作していれば 基板上の LED LD5( 緑 ) が 1 秒点灯 2 秒消灯を繰り返し点滅します 5. SD カードアクセス試験 5.1. SD カードの書き込み User スイッチを一回押すと CPU の RTC に設定された時刻が ファイルに書き込まれます TRI_S という名称のディレクトリが作成されて そのディレクトリの中に RTC という名前のディレクトリを作成して その中にファイル RTC_D.TXT が作成されます パスは TRI_S\RTC\RTC_D.TXT となります 時刻データはファイルに追加書き込みされます RTC の時刻の設定は 飛石伝ひアプリケーション で行うことができます 5.2. SD カードの読み込み 飛石伝ひアプリケーション を使用して SD カードの読み込みを行うことができます 容量の取得 フォルダの参照 ファイル名の参照 ファイルデータの読み込みを行うことができます 飛石伝ひアプリケーション の使い方については [ 6. 飛石伝ひアプリケーション の使い方 ] で説明します 5
5.3. SD カードアクセス試験のためのモジュール SD カードアクセス試験のために作成したモジュールについて説明します 作成したモジュールは全て 内部で FatFs のモジュールを呼び出して SD カードにアクセスしています 1) 容量取得 SD カードの全容量と空き容量を取得します //-------------------------------------------------------------------- //SD Card 容量取得 //-------------------------------------------------------------------- // 引数 //uint32_t *ulngtotal : SD カードの全容量をセットする変数のポインタ //uint32_t *ulngfree : SD カードの空き容量をセットする変数のポインタ // 戻り値 : // 0 : OK // 1 : NG //-------------------------------------------------------------------- int16_t GetSpaceSDC(uint32_t *ulngtotal, uint32_t *ulngfree); 2) ディレクトリ Open 指定したパスのディレクトリを Open して内部のディレクトリ名またはファイル名を取得します //Read Directory First SD Card // ディレクトリを OPEN して 最初のファイル名またはディレクトリ名を読み込む // 引数 : //char *chrpath : パス名がセットされている Buffer のポインタ //char *chrfilename : 読み込んだファイル名またはディレクトリ名をセットする Buffer のポインタ // 読み込んだものがディレクトリ名の場合 D. ディレクトリ名 // ファイル名の場合 F. ファイル名をセットします // 戻り値 : ファイルのサイズ uint32_t ReadDirectoryFirstSDC(char *chrpath, char *chrfilename); 6
3) ディレクトリ内部の項目取得ディレクトリ内部の項目 ( ディレクトリ名またはファイル名 ) を順次取得します //Read Directory Next SD Card : ディレクトリ内の項目を順次読みだす // 引数 : //char *chrfilename : 項目名を返す Buffer のポインタ // 戻り値 : ファイルサイズ uint32_t ReadDirectoryNextSDC(char *chrfilename); 4) ディレクトリ内部の項目取得の終了 f_mount(0, defnull); を呼び出して Work エリアの削除を行います //Read Directory End SD Card : ディレクトリ読み込み処理終了 // 引数 : なし // 戻り値 : 0 固定 int16_t ReadDirectoryEndSDC(void); 5) File Open データを読み込むファイルを Open します //Open File SD Card : ファイルの OPEN // 引数 : //char *chrpath : パス名が入っている Buffer のポインタ // 戻り値 : // 0 : OK // 1 : NG int16_t OpenFileSDC(char *chrpath); 7
6) ファイルデータの読み込み Open したファイルのデータを読み込みます //Read File SD Card : ファイルのデータ読み込み // 引数 : //char *chrbuffer : ファイルから読み込んだデータをセットする Buffer のポインタ //unsigned int uintlength : 読み込む byte 数 //unsigned long ulngposition : ファイルの読み込み位置 // 戻り値 : // NGのとき : -1 // OKのとき : 読み込み byte 数 int16_t ReadFileSDC(char *chrbuffer, unsigned int uintlength, unsigned long ulngposition); 7) ファイルの Close ファイルの Close を行い 使用していた Work エリアの削除を行います //Close File SD Card // 引数 : なし // 戻り値 : // -1 : NG // 0 : OK int16_t CloseFileSDC(void); 8) ファイルのポインタの移動ファイルのポインタを指定の位置にする //seek : ファイルのポインタを指定した位置にする // 引数 : //uint32_t ulngposition : ファイルの指定位置 // 戻り値 : // -1 : NG // 0 : OK int16_t SeekFile(uint32_t ulngposition) 8
9) ディレクトリ作成指定したパスにディレクトリを作成する // ディレクトリ作成 // 引数 : //uint8_t *uchrdirectory : パス名が入った Buffer のポインタ // 戻り値 : // 0 : OK // 1 : NG int16_t MakeDirectorySDC(uint8_t *uchrdirectory) 10) ファイル削除指定したファイルを削除する //Delete File in SDC : 指定したパス名のファイルまたはディレクトリを削除する // 引数 : //char *chrpath : パス名が入った Buffer のポインタ // 戻り値 : // 0 : OK // 1 : NG int16_t DeleteFileSDC(char *chrpath); 11) ファイル書き込み試験 User スイッチが押されたときファイルに時刻データを追加書き込みする //SD カード書き込み試験 : User スイッチが押されたときファイルに時刻データを書き込む // 引数 : なし // 戻り値 : // -1 : 処理なし // 0 : OK // 1 : NG int16_t DebugWriteSDC(void); 9
6. 飛石伝ひアプリケーション の使い方 飛石伝ひアプリケーション のインストールについては 飛石伝ひ のホームページの インストール のページをご覧ください STM32F4 Discovery 基板に電源が供給されている状態で 基板の Micro USB コネクタ CN5 と PC とを USB ケーブルで接続して 飛石伝ひアプリケーション を使用します COM ポートの選択についてはホームページ上の STM32F4 Discovery 基板と PC との接続方法 をご覧ください 6.1. RTC への時刻の設定 SD カードにファイルを書き込むとき CPU の RTC の時刻を参照してファイルのタイムスタンプを付けます そのため RTC に時刻を設定する必要があります ここでは 飛石伝いアプリケーション を利用して RTC の時刻設定を行います 時刻設定を実行すると PC の時刻が RTC に設定されます SDC_SDIO_STM32F4 のプログラムでは CPU の内部 RTC クロックを使用して RTC を動作させています 電源投入時 時刻は 2000/01/01 00:00:00 に設定されます 時刻設定 メニューの { 基板 } -> { 時刻 } -> { 時刻設定 } をクリックすると 次のメッセージが表示されます 10
[ はい (Y)] ボタンをクリックすると CPU の RTC に PC の時刻が設定されます 時刻を設定しました とメッセージが表示されます 11
6.2. RTC の時刻の読み込み メニューの { 基板 } -> { 時刻 } -> { 時刻取得 } をクリックすると CPU の RTC の時刻を取得して次ページのように表示します 12
日付時刻 : 2013/08/27 13:27:38 が表示されています 13
6.3. SD カードの容量の取得 メニューの { 基板 } -> {SD カード } -> { 容量取得 } をクリックします 14
SD カードの容量が取得されて表示されます 15
6.4. フォルダ一覧 メニューの { 基板 } -> {SD カード } -> { フォルダ一覧 } をクリックします 16
フォルダがある場合 フォルダ名が表示されます 飛石伝ひアプリケーション では ルートディレクトリにある TRI_S という名前のディレクトリの中身を参照するようになっています TRI_S というディレクトリがないと フォルダがありません と表示されます 17
6.5. ファイル一覧 フォルダを一個選択した状態で メニューの { 基板 } -> {SD カード } -> { ファイル一覧 } をクリックします 18
ファイルが存在する場合 ファイル名が表示されます 19
6.6. ファイル読み込み ファイルを一個選択した状態で メニューの { 基板 } -> {SD カード } -> { ファイルデータ読み込み } -> { 開始 } をクリックします このメッセージが表示されます [ はい (Y)] ボタンをクリックします 20
ファイルから読み込んだデータをセーブするフォルダの選択画面が表示されます フォルダを選択して [OK] ボタンをクリックします ファイルデータの読み込みが開始され 読み込みが終了すると次のメッセージが表示されます [OK] ボタンをクリックします 次ページに続く 21
選択したフォルダを見てみると 選択したファイル名の後ろに読み込みを実行した時刻を付加したファイルができています このファイルに読み込んだファイルデータがセーブされています 22
7. 試験用の受信コマンド処理をビルドからはずす以下は ソースフォルダ src の中の stm32f4xx_conf.h を表示した画面です //-------------------------------------------------------------------- //SD カード読み書き試験 : VCP(USB 仮想 COM ポート ) を使用して SD カードにアクセスします // また User スイッチを押したとき RTC の時刻をファイルに書き込みます //-------------------------------------------------------------------- // コメントアウトしてビルドすると VCP の受信コマンド処理と User スイッチの処理部分はなくなります //-------------------------------------------------------------------- #define defdebugsdc //-------------------------------------------------------------------- 試験用の受信コマンド処理が必要ない場合は 上記の #define defdebugsdc の部分を //#define defdebugsdc のようにコメントアウトしてビルドしてください 23