STM32F411CE (2)

Date: 2022/02/22 (initial publish), 2022/08/30 (last update)

Source: jp/note-00045.md

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 address0x8004000だそうです。 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ファイルは以下:

電源接続下での、DFUへのはいり方

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)

pydfuMicropython に含まれてます。

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