STM32シリーズへの書き込み(DFU編)

綱です。

今回から、STM32シリーズへのFlash書き込みについて書いていきます。

今回は、デバッガでの書き込みが一般的になり、すっかりいらない子になっている気がする「DFU」での書き込みについてです。

なお、ここに書いた内容について、一切の責任を負いません。投稿時点での情報なので、古くなっている可能性もあります。

 

0. DFU対応マイコン

DFU書き込みに対応したマイコンは以下の通りです。

  • STM32F0シリーズ:STM32F0x2
  • STM32F1シリーズ:STM32F105, STM32F107
  • STM32F2シリーズ:全て
  • STM32F3シリーズ:STM32F30x, STM32F37x
  • STM32F4シリーズ:全て
  • STM32L1シリーズ:flash256KB以上のマイコン(STM32L1xxxxの末尾がC以上)

詳細はアプリケーション・ノートAN2606や、各マイコンデータシートの「Boot modes」項を参照してください。

USBが付いているけどDFUに対応していないマイコンを、DFU書き込み可能にする方法に関しては、今回は扱いません。

※STBee / STBee MiniはSTM32F103なのにDFU書き込み可能ですが、これはブートローダーをFlash領域に仕込んでいるからです。基本的に同様の方法で書き込めますが、注意しないとブートローダーを消してしまいます。

 

 

1. ドライバについて

ドライバのインストールは不要です。

Windowsの場合、DFUを繋ぐと公式ドライバが自動的にインストールされます。DfuSeにもドライバが付属していますが、自動インストールされるドライバのほうが新しいです。

Linux等の場合、libusbを使用します。libusbが使用可能なら問題ありません。

 

2. マイコンをDFUモードにする

BOOT0ピンをH、BOOT1ピンをLにした状態で、マイコンの電源を入れる(またはリセットする)と、マイコン内臓のブートローダーが起動します。

ブートローダー起動時にUSBが接続されていると、自動的にDFU待ち受けモードになります。

 

BOOT1ピンが存在しないマイコンもあります。その場合は、FLASH_OBRレジスタのnBOOT1ビットを操作することで、BOOT1ピンの代わりにできます。

nBOOT1 == 1ならL、nBOOT1 == 0ならHになります。nBOOT1はデフォルトで1なので、操作しなければBOOT1は常にLです。

 

3. DFUでプログラムを書き込む

DFUでプログラムを書き込むためには、専用のソフトが必要です。

通常はST公式のソフト「DfuSe」を使えばいいのですが、Windows専用でGUI操作です。Windowsを使いたくない人や、CUIで書き込みたい人が居ると思うので、いろいろ書いておきます。

書き込む前にマイコンをUSBでPCに接続し、DFUモードにしておいてください。

DfuSeを使う

Windows専用です。

URL: http://www.st.com/web/jp/catalog/tools/FM147/CL1794/SC961/SS1533/PF257916

上記URLから、STSW-STM32080をダウンロードし、インストールします。

インストール後の使い方は以下の通りです。

  1. 付属の「DfuFileMgr.exe」を使って、hex/bin/s19ファイルのいずれかをdfuファイルに変換する。(詳細は省略)
  2. 「DfuSeDemo.exe」を起動し、「Available DFU devices」から目的のデバイスを選ぶ。(目的のデバイスがない場合、認識されていません。デバイスマネージャーで確認して下さい。)
  3. 「Upgrade or Verify Action」の「Choose…」から、書き込みたいdfuファイルを選び、「Upgrade」を押す。

操作は全てGUIのため、書き込みまでに時間が掛かります。

 

DfuSeCommandを使う

Windows専用です。DfuSeDemoのコマンドラインバージョンです。

DfuSeに付属しているため、DfuSeをインストールすれば使用可能です。

コマンドラインで操作したい場合に使いますが、DfuSeではdfuファイルへの変換がGUIソフトでしかできないため、Hex2DFU.exeや、後述のDfuConvert.exeを使って変換を行います。

Hex2DFU.exeは、こちらのURLからダウンロードできます。ダウンロードして、Hex2DFU.exeをDfuSeと同じ場所に置いてください。

http://www.geocities.jp/altshibabou/win/cqstarm_dl.html

使い方は以下の通りです。

  1. Hex2DFU.exe hoge.hex hoge.dfu
  2. DfuSeCommand.exe -c -d --fn hoge.dfu

これは最小限必要なオプションです。1ではhexファイルをdfuファイルに変換しています。2では書き込みを行っています。

オプションの詳細は、それぞれ引数なしで実行すればヘルプが表示されるので、それを参考にしてください。

 

DFU Command Line Tools from KSKを使う

Windows専用です。マイコン徹底入門の環境に付属しています。一時期はWindows8.1で動作しませんでしたが、Windows8.1のアップデートにより動作するようになりました。

単体でのダウンロードはこちらのURLからできます。ダウンロードしてインストールしてください。

http://miqn.net/node/185

使い方は以下の通りです。

  1. DfuConvert.exe -n DFU_NAME -v 0483 -p DF11 -b 0 -ReadFileName hoge.hex -CreateFileName hoge.dfu
  2. DfuUpgrade.exe -DownFileName hoge.dfu -TargetIdSel 0
  3. DfuVerify.exe -DownFileName hoge.dfu -TargetIdSel 0

全てのオプションを書いています。省略した場合、para.txtから読み込まれます。ファイル名以外は基本的にこのままでいいはずです。

1ではhexファイルをdfuファルに変換しています。2では書き込みを行っています。3ではチェックを行っています。

オプションの詳細は、付属しているpdfの説明を読んでください。

 

DFUWを使う

Windows専用です。ストロベリー・リナックスの「STBee」「STBee Mini」にDFUで書き込むためのソフトですが、これら以外でも使えます。

こちらのURLからダウンロードし、解凍します。C:\cygwin\binにコピーすると指示がありますが、ここに置かなくても問題なさそうです。

http://strawberry-linux.com/stbee/dfuw

使い方は以下の通りです。

  1. dfuw.exe hoge.hex

これだけで書き込めます。引数はhexファイルのみです。

紹介しているソフトの中で、最も簡単に使えます。

 

dfu-utilを使う

Windows/Linux/Macで使用可能です。Unix向けですが、Windows用のバイナリも配布されています。

ドライバにlibusbを使います。Windowsで使う場合、zadigを使ってドライバをwinusb(libusb)に変更する必要があります。

バイナリが欲しい場合は、こちらのURLから最新版のバイナリ(dfu-util-0.7-binaries.7z)をダウンロードし、解凍してください。

http://dfu-util.gnumonks.org/releases/

自分でビルドしたい場合は、こちらのURLを参考にしてください。

http://dfu-util.gnumonks.org/build.html

使い方は以下の通りです。

  1. dfu-util -a0 -d 0x0483:0xdf11 -s 0x08000000 -D hoge.bin

オプションの詳細は、-hオプションを付ければヘルプが表示されるので、それを参考にしてください。

 

終わりに

こういうの書くのは苦手なのでかなり読みづらいと思います。ごめんなさい。

面倒なので図とか一切用意していません。ごめんなさい。

こういうのって、普通は図とか実際にやってる画像とか用意して説明するものだと思うけど、そこまでする気が起きませんでした。。

 

昔と違い、DFUでの書き込み環境が充実しているのにびっくりしました。

次はUARTでの書き込みに関してですかね。

STLink等のデバッガでの書き込みもそのうち書きますが、これはいろんな人が書いているので後回しで。

最近はCANとかI2Cとかでも書き込めるようですが、わざわざ使うことは無さそうなので書きません。

マイコンをCANやI2Cバス上に多数並べることがあるなら考えます。部内ではまさにそういう状況になっていますが、まだ個別に書き込める程度なのでやりません。