Previous Post | Top | Next Post |
TOC
STM32F411CEが載っているblackpillの導入記録の続きです。
HID BOOTLOADER の復元準備
前記の方法でQMKをDFUで内蔵フラッシュメモリーの0x800 0000
から導入すると上書きされてしまいます。書き換えできるメモリーの最後にbootloaderを置くAVRと異なり、ARM系のSTM32Fはフラッシュの最初の0x800 0000
にBootloader等を置かれているからです。
STM32F103のような、ROM化されたUSB対応bootloaderが無いMCUの場合にはHID BOOTLOADERが必要ですが、STM32F411等はROMがDFUをサポートしてUSB経由のファームウエアー書き換えに対応しているので、HID BOOTLOADERは必須要素技術ではありません。ここは、後学のため元のHID BOOTLOADERの復元法を記します。元々はA9-A12
ピン問題で悩んでいた際の学習ノートです。
最初に入っていたHID Bootloaderは、ベンダーの WeActTC の技術情報サイトを覗き入手します。
HEXファイルやバイナリーのホストプログラムとともに、元ネタサイト情報もありました。
ARDUINO作成のスケッチのアップロードは、WeAct_HID_Flash-CLIで単純にBINファイルを書いているので、ARDUINO系のシステムでSTM32F103と共通のファームウエアーを作成し使用するには、HID_Bootloaderも良いかもしれません。
アドレス
ベンダーの WeActTCの技術情報サイトから落としたGIT repo中の情報によると、HID Bootloaderの APP forwarding address
は0x8004000
だそうです。
STM32F103と違いSTM32F411はフラッシュの書き換え単位が16KBあるので、これだけのスペース空けています。
ROM Addr |
---|
0x8000000 Bootloader |
16KB |
0x8004000 APP |
….. |
END |
つまり元々ボード上のMCUに書き込まれていたのHID Bootloaderには0x800 0400
に読み込まれて実行されるように作成したファームウエアーが必要です。
QMKは通常0x800 0000
に書き込み実行するファームウエアーを作成するので、QMKファームウエアーの導入にHID Bootloaderは使えません。
HEXファイル
WeActが提供するプロプライエタリーのHEXファイルは以下:
- HID Bootloader:
MiniSTM32F4x1/Soft/WeAct_HID_FW_Bootloader/Bootloader/WeAct_HID_Bootloader_F4x1.hex
- TESTアプリ:
MiniSTM32F4x1/Soft/WeAct_HID_FW_Bootloader/APP/stm32f411_APP_test 0x8004000.hex
電源接続下での、DFUへのはいり方
- BOOT0 と reset キーの同時押し
- 先に、resetキーのリリース
- 0.5秒後、BOOT0キーのリリース
DFU接続の確認法
$ journalctl -f --no-hostname
...
usb 6-1.4.2: new full-speed USB device number 33 using xhci_hcd
usb 6-1.4.2: New USB device found, idVendor=0483, idProduct=df11, bcdDevice=22.00
usb 6-1.4.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 6-1.4.2: Product: STM32 BOOTLOADER
usb 6-1.4.2: Manufacturer: STMicroelectronics
usb 6-1.4.2: SerialNumber: ******************
checking bus 6, device 33: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.4/usb6/6-1/6-1.4/6-1.4.2"
bus: 6, device: 33 was not an MTP device
checking bus 6, device 33: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.4/usb6/6-1/6-1.4/6-1.4.2"
bus: 6, device: 33 was not an MTP device
そこで、dfu-util
実行:
$ dfu-util -l
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Found DFU: [0483:df11] ver=2200, devnum=27, cfg=1, intf=0, path="6-1.4.3", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="************"
Found DFU: [0483:df11] ver=2200, devnum=27, cfg=1, intf=0, path="6-1.4.3", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="************"
Found DFU: [0483:df11] ver=2200, devnum=27, cfg=1, intf=0, path="6-1.4.3", alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="************"
Found DFU: [0483:df11] ver=2200, devnum=27, cfg=1, intf=0, path="6-1.4.3", alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="************"
ちゃんと、DFUモードに入って、dfu-util
が使えています。
STM32F411の各種プログラム方法
Linux上でのSTM32F411チップのプログラム法を整理しました。
program | 機能 | タイプ |
---|---|---|
dfu-util |
USB-DFU 経由でのプログラム | FLOSS |
pydfu |
USB-DFU 経由でのプログラム | FLOSS |
stlink-tools /stlink-gui |
STLink (SWD) 経由でのプログラム | FLOSS |
STM32CubeProg | JTAG/SWD/? 経由でのプログラム | Proprietary (ST) |
WeAct_HID_Flash-CLI | USB-HID 経由でのプログラム | Proprietary (WeAct) |
pydfu
は Micropython に含まれてます。
BINファイル経由でのDFU実行
Google すると、詳しい原状復帰をBINファイル経由でのDFUで実現している人がいました。
これをフォローしました。
$ objcopy -Iihex -j .sec1 -Obinary WeAct_HID_Bootloader_F4x1.hex WeAct_HID_Bootloader_F4x1.bin
$ dfu-suffix -a WeAct_HID_Bootloader_F4x1.bin
dfu-suffix (dfu-util) 0.9
Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Suffix successfully added to file
$ dfu-util -a 0 -s 0x08000000 -D WeAct_HID_Bootloader_F4x1.bin
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Downloading to address = 0x08000000, size = 14888
Download [=========================] 100% 14888 bytes
Download done.
File downloaded successfully
更にUSBケーブルを抜き差しすると、ホストPCのjournalctl
に以下が出ましたので、また元のHIDデバイスとして機能します。
usb 6-1.4.2: New USB device found, idVendor=0483, idProduct=572a, bcdDevice= 2.00
usb 6-1.4.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 6-1.4.2: Product: WeAct Studio HID Bootloader
usb 6-1.4.2: Manufacturer: WeAct Studio
usb 6-1.4.2: SerialNumber: ************
hid-generic 0003:0483:572A.001D: hiddev2,hidraw2: USB HID v1.11 Device [WeAct Studio WeAct Studio HID Bootloader] on usb-0000:08:00.4-1.4.2/input0
checking bus 6, device 42: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.4/usb6/6-1/6-1.4/6-1.4.2"
bus: 6, device: 42 was not an MTP device
checking bus 6, device 42: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.4/usb6/6-1/6-1.4/6-1.4.2"
bus: 6, device: 42 was not an MTP device
上記でのdfu-suffix
を使って、単にファームウエアーがハードウエアーに対応することを確認するためだけ等の識別番号・CRC相当のバイナリーのサフィックスデータを追加はどうも必須要件では無く、ただこれをするとうるさい警告が出なくなります。
必須要件は、BINファイル使用時には、書き込み開始アドレスを明示的に-s 0x08000000
等と指定することです。
DFUファイルの場合はちょっと違います。これは次回触れます。
HID Bootloaderの導入の失敗例
最初、安直に、HEXファイルを直接dfu-util
に渡して動かずに慌てました。dfu-util`には、BINファイルかDFUファイルが必要です。
STM32CubeProgも動くけど…
STM32CubeProgをダウンロードすると、LINUX上でもJAVAベースのIDEがSWD/JTAGベースで接続して使えるようです。ただファイルの展開の際に、LINUX上なのにEXEファイルが必要だったのは意外でした。拡張子がEXEですが、大きなファイルだから中身は自己解凍のアーカイブなのかな?
ちなみにSTM32CubeProgの前に使われた古いプログラムに、DfuSe USB device firmware upgrade (UM0412) がソース付きであるようです。ただ、WINDOWS専用です。
STM32CubeProgを実行した所、なぜか立ち上げてみた新しいSTM32CubeProgでは、LinuxのGUI上ではSWDとかJTAGしか選択肢にDFUがつかえるように見えませんでした。STM32CubeProgは、GUIのプログラム群でめまいがします。とにかく、dfu-util
が動いているのでSTのプロプライエタリーツールは降参しておきます。
Previous Post | Top | Next Post |