やまちゃんのオーディオブログ

真空管アンプ、最近は資金調達のためのFX,MetaTrader4ネタもやっています。

STM32F4 wavファイル再生

STM32F4 COIDE2.0プロジェクトの移植、作成4 ファイルの一覧表示、漢字表示1

投稿日:2016年5月22日 更新日:

ファイルの一覧表示、漢字表示1

ファイルの一覧表示をするには、stm32で提供されたものではなくて、
別途chaN氏のfatfsをダウンロードして、その中のscanfilesをコピーし、
scanfiles.c、scanfiles.hを作成する。
ファイル一覧を表示させてその中から再生するファイルを選択したいので、
最初にメイン関数でしようと思ったが、いろいろ試行錯誤したが、まったく動かなかった。dir_openができないのである。
メイン関数のUSBH_Processの永久ループでは、単にケース分けして処理を記述しているように見えるが、そうではなくて、状態遷移が記述されており、その状態遷移が完了しないと、USBの接続が確立できない。そのメインの永久ループはそれはそれで永久ループを回した状態である必要がある。
また、dir_openの中のdisk_read関数では、USBH_MSC_READ10と、USBH_MSC_Handle_BOTXferがそれぞれ状態遷移しながら、それが完了するまで、USBH_MSC_BUSYという状態を保ち永久ループに陥ってしまう。
初期化をしなければ、状態のケース分けのところで、状態の変数が無効になってしまったりして結構大変である。
そこで、結論として、scanfiles()は、割り込みで記述する。それもdir_openが成功したらという場合分けの部分で、実行させるのがよいと考えた。
そうしたら、wavplayer.cが呼び出され、つまり、赤いランプの点滅するレコーダーモードで、ボタンを押して、プレイモードに切り替わると、scanfiles()を実行することになる。dir_openは、wavplayer.cの中に記述され、確実に実行できているのだから、そこで記述する。
if (f_open(&fileR, WaveFileName , FA_READ) != FR_OK)
{
STM_EVAL_LEDOn(LED5);
Command_index = 1;
}
else
{ char buff0[_MAX_LFN+4];FRESULT res;
char str[4] = “0:/”;
res = f_mount(0,&fs0 );
if (res == FR_OK) {
strcpy(buff0, str);
printf(“%s\n”, buff0);
res = scan_files(buff0,0);

}

ここで、buff0はこちらで定義した文字の配列で、ここにファイル名が記録される。
この配列は、有限長にしておくのが好ましい。
256文字の長さとするなら、_MAX_LFN+4などとする。
わざわざstrcpyなどを使っているのは、ディレクトリ名の「0:/」を渡すと、文字数4の文字配列(ポインタ)を渡してしまうことになり、その文字配列buff0にファイル名が記録されるところ、4文字を超えると、オーバーフローになってしまうおそれがあるからである。
このようにして、ようやく前回「STM32F4 COIDE2.0プロジェクトの移植、作成3 ソースデバッグprintfできました!」のprintfと相まって、semihost欄に表示された。

ちなみに、メイン関数で、scanfiles()を設けていたのは訳があって、
STM32f4のソースデバッグで、
CoIDEのデバッグポイントを設定したのに、止まらんぞ?と思っていたからである。
割り込み呼び出しのルーチンに記述すれば、いつになればそこを実行するとも知れず、という意味です。
ところが、調べたところ、デバッグタブのところ、skip ALL Breakpointsにチェックが入っていました。
そのチェックを除去すると、きちんとブレークポイントで止まりました。、

話は戻って・・・
しかし、なぜか3つしか表示できないし、ファイルの文字数も5個のみ。しかも漢字部分が文字化けしている。
そこで、 buff0の配列の数を256としてみると、ファイルが11個まで表示された。
文字数も増加している。それでも、ファイル数がおかしい。
漢字表記で制御を誤っている恐れがあるかもしれない。それを直さないといけない。

次に、漢字表記について、ネットで調査した。
当方でstm32f4のデバッグに使っているCoiDEは、
デフォルトではソースがMS932(shift-JISを拡張したもの、CP932とほぼ同じ)、
ファイルの入出力がソースと同じ(という意味か?、プロパティ欄参照)、
コンパイラはGCC-ARMで、UTF-8、
ファイルの入出力は、FATなので、CP932となっている。

まず、CoIDEについては、「Syncton」というサイトの「CooCox CoIDE で STM32 の開発環境を作ってみた(その1) 」 の記事で「インストールフォルダー内の CoIDE.ini の最終行に以下の行を追加
-Dfile.encoding=UTF-8」とあるように、
-Dfile.encoding=UTF-8」を追加するなどすると、
ソースコード(.c,.hなど)の文字エンコーディングを変えられます。

また、一般的には、あくまで一般的には、gccのビルドオプションで、
–input-charset=CP932」とすると、
ソースコードは、shift-JIS(ウィンドウズ7)のファイルを入力できます?、
また、一般的には、あくまで一般的には、gccのビルドオプションで、
–exec-charset=cp932」とすると、実行ファイルがshift-JISを扱うことが出来るはずです。
ここで、ビルドオプションを調べる方法は、「組み込みの人。」というサイトの
マニュアルにないgccのコマンドラインオプションの調べ方」によると、
gccのbinフォルダに移動して、「gcc -v –help」とする。
また、ここで、上記STM32f4をデバッグするためのCoIDEで、ビルドオプションを加える方法を述べておきますと、VIEWのconfigurationを立ち上げ、Compileのadvance settingのところ、
Misc Controls:」という欄があるのでそれに加えると、下に表示されたコマンドオプションに加えて、さらに別途コマンドオプションを追加できます。
・・・・・・

しかし、しかしです。エラーが出て止まります。gcc-armの最新版に変えても同じでした。
「 cannot convert from cp932 to UTF-8」
「エラー(内容は忘れました)」

-STM32F4 wavファイル再生

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

STM32F4 COIDE2.0用playbackプロジェクトの移植、作成(パート2)

前申したプロジェクトの公開だけど、著作権侵害などが怖いので、とりあえず延期しました。 前回に引き続き、STM32のデバッグネタ。 前回の続きで、stm32のエラー修正ネタTIPS。 ちょっとだけエラー …

no image

STM32F4でwavファイル再生!COIDE2.0用playbackプロジェクトの移植、作成

STM32F4discoveryでwavファイルを再生できました!! マイコンが実用的に見えてきた初めての出来事で、私にとっては記念すべきことでした。 COIDEは、フリーで容量制限がない開発環境です …

no image

STM32F4 COIDE2.0プロジェクトの移植、作成3 ソースデバッグprintfできました!

STM32F4discovery COIDE2.0 ソースデバッグprintfもどきができました。 CoIDE上で、表示したい情報を表示できます。 COIDEを使えばだれでもできます。 コムポートも、 …

[最近の記事]
2016年5月
1234567
891011121314
15161718192021
22232425262728
293031