鳥なき里のマイコン屋(62) DfuSeとST-LINK Utility

先日からST社のツールを使わせていただいておりますが、よく資料も読まずに作業していたので、ここに来てちゃんと資料を読もうと思いいたりました。マイコンツールの基本中の基本に、作成したプログラムを実機のプログラムメモリに書き込むときに使うオブジェクトファイルフォーマットというものあり、古くから、

  • インテルHEXフォーマット
  • モトローラSフォーマット

などというものが使われております。当然、WindowsやLinuxでもオブジェクトファイルフォーマットは存在し、PEとかELFとかが使われます。マイコン用とパソコン用の違いを簡単に述べれば、以下のような感じでしょうか。

  • パソコン用のフォーマットではOSがロードするときに番地を操作して実行可能な状態にする。相対番地で、かつ動的に実行時にリンクされる部分がある。
  • マイコン用のフォーマットでは絶対番地で静的にリンク済で即実行可能な状態である(ことが多い)。

実際には、ELFフォーマットのような相対番地のフォーマットでコンパイル、リンクまで済ませた後、バイナリツールを使って絶対番地のマイコンに転送できるHEXフォーマットに変換し、書き込みツールでマイコンに書き込む、といったことが行われます。

ST社においても、この手の操作は必須なだけに当然ツール類がサポートされています。

ちゃんと調べて置かないとと考えたのは、

MicroPython

のダウンロードページへ行ってみたためでした。手元で使っているNUCLEOボードでもMicroPythonが実行できそうだったので、ダウンロードしておこうと思い立ったためです。行ってみれば、1行引用すると

These boards are not officially supported but should be fully functional:

という扱いながら、その中に

NUCLEO-F401REボード

が入っていました。しかも、頻繁にアップデートされている模様。何と最新版のファームウエアの日付は本日2019年6月9日。しかし、

この見慣れぬ拡張子、” .dfu ” というのは何じゃらほい? 古くからSTのマイコンで仕事をしていた人なら常識なんだと思いますが、ごく最近、Mbedで使い始めたものにはサッパリです(Mbedは 究極にシンプルで “.bin” 素のバイナリファイルを書き込むというスタイルだった)。dfu調べてみました。ファイルフォーマットもちゃんと文書化されて公開されています。

UM0391 DfuSe File Format Specification

これを見ると、DFUフォーマット自体は「マルチベンダ」なフォーマットで、ST社は自社独自に拡張して使っている、というスタンスのようです。なぜこのDFUフォーマットを使うかというと

  • 単なるバイナリやHEXでは、プログラムとデータしか含まれない
  • DFUは、製品ID、バージョンその他の情報なども含めることができる

ということみたいです。適切に書き込みソフトウエアが構成されていれば、不適合なバージョンで上書きするような「事故」は防げそうです。また、複数のロケーションに分かれたオブジェクトを1本のファイルにまとめることもできます。なかなか便利。「もしかすると、NUCLEOのマスストレージモードにDFU書き込んだらちゃんと配置してくれないか?」などと思って「実験」してみましたが、駄目でした。STM32CubeIDEからは、今のところdebugger経由でファイルをダウンロードしているので、これとも違う。調べている内に、2つのツールを見つけました。

  • STM32 ST-LINK Utility (STSW-LINK004)
  • STSW-STM32080 package

上のパッケージの中には、どうもST社のICEのドライバなどとりあえず必要のないものも入っているようなのですが、

ST-LINK Utility

という独立したツールが含まれており、これで、モトローラSとかインテルHEXとかのオブジェクトファイルをデバイスに書き込めるようになっています。

下のパッケージには、DFUファイルを操作するためのツール群が含まれており、その中の

Dfu file manager

というツールを使うと、DFUファイルからHEXやBINでファイルを抽出できます。つまり、2つを合わせるとDFUファイルからHEXを取り出して書き込むことができます。DFUファイルからHEXでなくBINを取り出せばマスストレージモードでNUCLEOに書き込めるのでは?実際、やってみました。駄目でした。Mbedなどで生成されるBINと違い、MicroPythonのオブジェクトは不連続なアドレス2つに書き込むようになっているのです。BINファイルは2本に分かれて出力されます。NUCLEOのマスストレージモードについてはその仕様の文書をまだ見つけられていないのですが、どうも、最初のBINファイルを読んだところで制御をそいつに渡してしまうのではないかと想像されます。

ST-LINK UtilityにMicroPythonの最新版をロードしたところ。

これを書き込みます。そして、例によって仮想シリアルポートでNUCLEOボードに接続(115Kbps)。プロンプトがでるのでhelp()と打てば、

NUCLEO-F401RE上でMicroPython動いてます。何か、少しスッキリしたかも。

鳥なき里のマイコン屋(61) STM32CubeIDE その3 へ戻る

鳥なき里のマイコン屋(63) NXPマイコンに見るMbed微妙な違い へ進む