2018年8月15日水曜日

マイコンのFlashでMSCが動いた




 マイコンのFlashでMSCが動くようになりました。
 結局、ISRからでもFlashの書き込みは可能でした。なんで駄目だったかというと、書き込み単位を8byteにしていたからです。
 リファレンスマニュアルによると、8byte単位で書き込むには外部電源(高電圧)が必要なようです。ちゃんとマニュアル読んどけって話ですね。。。。

 130560バイトのFlash領域を使っていますが、108032バイトのメモリとして認識されています。22528バイトがどっかに行ってますが、FATに使われてるのでしょう。

 テキストファイルを投げて、マイコンの電源を切っても、ちゃんとファイルは残っています。
 とりあえず簡単に実装するために、バンク間の転送(重複の除去とイレース)は実装していません。Flashのイレースはそれなりに時間がかかるので、頻繁にこれが発生するとネックになりそうです。
 Trimコマンドは不要になったセクタを使用しないことにより、結果的にバンク間の転送を減らし、ひいてはイレースの回数をへらすのが目的です。なるほど、効果がありそうです。


 あと、イレースはHAL_FLASHx_Erase関数で行いますが、前後にFLASH_UnlockとFLASH_Lockが必要です。が、UnlockしなくてもErase関数からはOKが帰ります。そのかわりEraseでブロックされる時間がほぼゼロですが。
 Unlock/Lockは忘れないようにしましょう。
 不用意にErase関数を呼んでしまわないように(or呼ばれても大丈夫なように)Flashにはロックが掛かっています。それを解除するのがUnlockです。絶対に必要です。


 もう少し頑張ればちゃんとUSBメモリとして使えそうです。


 複数バンクを使う方法も考えてみましたが、結構面倒な感じです。複数バンクにセクタが重複して作成されるので、その前後関係をどうやって認識するかが問題ですね。
 いろいろ方法が考えられますが、とりあえず100KiB程度でも足りるはずなので、しばらくはシングルバンクで試してみます。

 あとは、FatFsをReadOnlyで組めば、マイコン自身からファイルを読み出すことができます。マイコンからの書き込みは排他制御が面倒ですね。mbedだとマイコンが書き込もうとした後はMSCが切断される、という感じの実装になっていたはずです。
 スクリプトの実行だけならReadOnlyでも問題ないので、しばらくはそのようにします。
 CubeMXのコードでもUSBメモリを取り外すような機能があるっぽいので、どうにでもなると思いますが。
 ただ、mbedはメインのチップの他にUSB接続周りのチップが有って、マイコンがリセット状態でもMSCとして認識できます。この場合、マイコンが起動した直後からファイル書き込みを行うようなプログラムが有っても、マイコンをリセットしておけばPCからMSCにアクセスできますが、マイコンワンチップでMSCも作ると、そのような挙動が作れません。方法としては、マイコンリセット直後にスイッチを監視して、スイッチが押されていればFatFsのwriteはエラーで終わる、みたいな感じでしょうか。でも唯一の押しボタンはBOOTモードに使ってるので、スイッチを増設する必要がありそうです。

 ということで、まだまだやることもいろいろありますが、もう少しがんばります。

0 件のコメント:

コメントを投稿