File System Auto Mountでの
SDカード抜き差し
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
File System のマウントに関して、MHCのデフォルトはAuto Mountになっていません。アプリケーションの作成はAuto Mountの方が簡単です。 SDカード抜き差し、ファイルオープン/クローズの簡単な例を紹介します。 |
<仕様> ・HarmonyのFile System Auto Mountに係るライブラリ関数を初期化の段階で組み込む。 ・File Systemがマウントされている場合は LEDを点灯し 非マウントの場合はLEDを消灯させる。 ・SDカードが挿入され、File Systemがマウントされたら、/mnt/myDrive1ドライブのルートディレクトリのファイル名"myTestData.txt"を書き込みモードで開く。 ファイルが存在しない場合は、新規作成する。 ・ファイルを開いた後には速やかに開いたファイルを閉じる。 ・ファイルを閉じた回数をカウントする。 ・ファイルを閉じたら、キャラクタ液晶に以下を表示する。 1行目: "FileOpen_w OK !! " 2行目: "Num0=XX" (注) XXはファイルを閉じた回数とする。 ・SDカードを抜き差しした場合 ➀ SDカードが挿入されるとLEDが点灯し ➁ SDカードを抜くとLEDが消灯すること。 尚、LEDの挿入はLEDが消灯を目視確認後行うこと。 ・SDカード挿入検出は使用しないこと。 |
<外観1> PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。 PIC32MZ評価評価ボードにmikro BUS評価ボード(→購入方法)が取り付けられています。 mikro BUS評価ボードには、本テーマと関係ない部品が多々実装されています。 mikro BUS評価ボードのmikro BUS コネクタCN5には、mikroElectronika(株)のmicro SD clickが実装されています。 |
<外観2> mikro BUS評価ボードのmikro BUSコネクタCN5にはmikro BUS 用 ユニバーサルキバン(→購入方法)に 秋月電子の マイクロSDカードスロット DIP化キット(通販コード K-05488)をハンダ付けしたキバンが実装されています。 |
<動作結果> ( → 動画:1080pのHD動画を見ることができます。)
キャラクタ液晶表示 | |
マイクロSDカードを 3回脱着した時 |
・スタンダードSDカードの場合は、カードスロットによってはマウントに失敗し、挿入が検出されない場合が時々あるなど不安定でした。(スタンダードSDはサポート外?) |
<解説>記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
(以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)
■ MHC設定
■ Options
■ Pin Settings
項目 | ⑦ポート設定 |
MHC | ![]() |
備考 | デフォルトからの変更要領: RC15/Function: GPIO_OUT (CS用出力ポート設定) RF13/Function: SDI6 (SPI6のSDI設定) RB15/Function: SDO6 (SPI6のSDO設定) RD15/Function: SCK6 (SPI6のSCK設定) RD0/Function: GPIO_OUT (LED用出力設定) |
■ キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
(詳細→ キャラクタ液晶表示方法 参照)
■ app.cに、青字部分を追加します。
①インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
あります。
#include "stdio.h"
② 所要の変数、遅延関数を宣言、定義します。
char Buf[32];
int delay_Clock = 200000000;
APP_DATA appData;
SYS_FS_HANDLE my_fileHandle; //ファイルハンドル
bool Flag_SdConnected;
int Num0; //SDカード脱着回数
void delay_us(volatile unsigned int usec) //1μsec遅延
{
volatile int count;
count = (int)(delay_Clock/20000000)*usec;
……
……
③ | APP_SYSFSEventHandler( )はSDカードのマウント有無を調べるコールバック関数です。ファイルシステムのマウントに係る イベントが発生するとこの関数が呼ばれます。,マウントイベントが発生したらどのメディアがマウントされたかチェックを実行します。 "/mnt/myDrive1"であればSDカードです。LEDを点灯します。 同様にアンマウントイベントが発生したらどのメディアがアンマウントされたかチェックします。"/mnt/myDrive1"であればSDカードです。LEDを消灯します。 |
void APP_SYSFSEventHandler(SYS_FS_EVENT event, void * eventData, uintptr_t context) //SDカードのマウント有無を調べるコールバック関数
{
switch(event)
{
/* If the event is mount then check which media has been mounted
*/
case SYS_FS_EVENT_MOUNT:
if(0 == strcmp((const char *)eventData,"/mnt/myDrive1"))
{
Flag_SdConnected = true;
LATDbits.LATD0 = 1;
}
break;
/* If the event is unmount then check which media has been unmount
*/
case SYS_FS_EVENT_UNMOUNT:
if(0 == strcmp((const char *)eventData,"/mnt/myDrive1"))
{
Flag_SdConnected = false;
LATDbits.LATD0 = 0;
}
break;
case SYS_FS_EVENT_ERROR:
break;
default:
break;
}
}
④App_SdMtCheck( )はSDカードのマウント有無を調べるコールバック関数をセットする関数です。
void APP_SdMtCheck(void)
{
/* Set the event handler*/
SYS_FS_EventHandlerSet(APP_SYSFSEventHandler, (uintptr_t)NULL); //SDカードのマウント有無を調べるコールバック関数をセット
}
⑤ | この関数はAPP_Tasks( )の中で実行されます。SDカードが接続されたらファイルをオープンし、すぐにファイルをクローズします。その後ファイルオープンの回数をインクリメントし、キャラクタ液晶に"FileOpen_w OK !! "とファイルオープン回数を表示します。 そしてアイドルステートに移行してSDカードが抜かれることを監視します。 |
void APP_SdTasks(void)
{
SYS_FS_RESULT result = SYS_FS_RES_FAILURE;
/* The application task state machine */
switch(appData.state)
{
case APP_OPEN_FILE:
/* Wait until MSD is mounted and file search is sucessful */
if(Flag_SdConnected == true)
{
// ファイルを書き込みモードでオープン 但しファイルがなければ新規ファイル作成
my_fileHandle = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_WRITE));
if(my_fileHandle == SYS_FS_HANDLE_INVALID)
{ //ファイルオープンエラーの場合
lcd_cmd(0x80); //1目の先頭へ
sprintf(Buf,"FileOpen_w failed ");//
lcd_str(Buf); //液晶表示
while(1);
}
else
{
SYS_FS_FileClose(my_fileHandle);
Num0++;
lcd_cmd(0x80); //1目の先頭へ
sprintf(Buf,"FileOpen_w OK !! "); //液晶に"W_ModeOpen
OK" を表示
lcd_str(Buf); //液晶表示
lcd_cmd(0xC0); //2行目の先頭へ
sprintf(Buf,"Num0=%d ", Num0); //ysNum:SDカード脱着回数
lcd_str(Buf); // 開始メッセージ2行目表示
appData.state = APP_IDLE;
}
}
break;
case APP_IDLE:
if(Flag_SdConnected == false) //SDカードを抜くと 挿入検出待ちモードに移行する。
{
appData.state = APP_OPEN_FILE;
}
else
{
}
break;
default:
break;
}
}
⑥APP_Tasks( )の中でメインタスクの前に APP_SdMtCheck( )関数でSDカードのチェック脱着チェックを実行します。
APP_SdMtCheck(); //SDカードのマウントチェック
APP_SdTasks(); //SDカードのメインタスク
以下、app.c