BluePillをArduinoで使えるようにする

こちらを参考にやってみました。結局の所、課題はある感じです。何通りかの方法を試してみましたが、 ST-Link V2を使う方法が結局は良さそうです。

1.bootloaderの書き込み

まずは https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries からブートローダプログラムであるgeneric_boot20_pc13.binをダウンロードしてきて、~/Arduino/BluePil/. の下に置きました。

次に、https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zipからArduino開発環境をダウンロードしてきて、展開して~/Arduino/hardwareの下に置きます。

BluePillボードにシリアル接続して、接続チェックします。このときのジャンパの状態はBOOT0=1、BOOT1=0(ISPブートモード)で行いました。端子配置はコチラが参考になります。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash /dev/ttyUSB0 
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB

接続が確認できたら、ブートローダを書き込んでみます。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash -w ~/Arduino/BluePil/generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x08015a48 (100.00%) Done.

Starting execution at address 0x08000000... done.

BOOT0=0、BOOT1=0(Flashブートモード)に変更して、USBケーブルを挿してみましたが・・・

[762473.049541] usb 4-3: new full-speed USB device number 89 using ohci-pci
[762473.209544] usb 4-3: device descriptor read/64, error -62
[762473.477560] usb 4-3: device descriptor read/64, error -62
[762473.741551] usb 4-3: new full-speed USB device number 90 using ohci-pci
[762473.901550] usb 4-3: device descriptor read/64, error -62
[762474.169572] usb 4-3: device descriptor read/64, error -62
[762474.277700] usb usb4-port3: attempt power cycle
[762474.749583] usb 4-3: new full-speed USB device number 91 using ohci-pci
[762475.165585] usb 4-3: device not accepting address 91, error -62
[762475.321474] usb 4-3: new full-speed USB device number 92 using ohci-pci
[762475.737532] usb 4-3: device not accepting address 92, error -62
[762475.737644] usb usb4-port3: unable to enumerate USB device

うーん、enumerateできない・・・。ググると、どうもあるある現象っぽい。あきらめます。

2.hidのブートローダを試してみる

hidのブートローダを焼いてみました。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash -w ~/Arduino/BluePil/hid_generic_pc13.bin -v -g 0x0 /dev/ttyUSB0
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x080007b4 (100.00%) Done.

Starting execution at address 0x08000000... done.

ダウンロード方法にusbhidを指定してもダメ・・・。なぜかttyACM0にアクセスできないなどと表示される。

rootじゃなくてもusbhidにアクセスできるように /etc/udev/rules.d/99-stm32_hid_bl.rulesにルールを追加してもダメ・・・。

# STM32_HID_bootloader
ATTRS{idProduct}=="beba", ATTRS{idVendor}=="1209", MODE:="666"

を追加して、

$ sudo udevadm control --reload-rules

としてもダメでした。うーん。これもあきらめます。

3.ST-Link V2で書き込んでみる

ST-Link V2とBluePillを接続するアダプタを作って、ST-Link V2で試してみます。

Arduino環境にもLinuxMintにもstlinkというST-Link V2を動かすプログラムが入っていないようです(実は入ってた)ので、https://github.com/stlink-org/stlink/releases/tag/v1.6.1 からstlink-1.6.1.1_amd64.deb をダウンロードしてきてインストールします。このときに依存関係にあるものが十数個インストールされます。

そして、そのままではユーザー権限でアクセスできないので、/etc/udev/rules.d/99-st-link.rulesとして以下のファイルを作成します。

# ST-LINK/V2
ATTRS{idProduct}=="3748", ATTRS{idVendor}=="0483", MODE:="666"

作成したら、

$ sudo udevadm control --reload-rules

として適用します。これで、

$ st-flash reset
st-flash 1.6.1
2020-10-15T01:18:53 INFO common.c: F1xx Medium-density: 20 KiB SRAM, 64 KiB flash in at least 1 KiB pages.

という感じでリセットができるようになりました。

Arduino IDEで書き込み方法(Upload method)にSTLinkを指定(注:書込装置の選択ではない)してやると、書き込みの際に /home/xxxx/Arduino/hardware/Arduino_STM32/tools/linux/stlink_upload というスクリプトでエラーが出ていました。実際には64bit環境の場合にはlinuxではなくlinux64ディレクトリを使う構成ですので、

$ cd ~/Arduino/hardware/Arduino_STM32/tools
$ rm -fr linux
$ ln -s linux64 linux

としてごまかします。これで、スケッチ例のBlinkが書き込めて動作するようになりました。しかし、UARTとしては使えないので、書き込み後にttyデバイスがないっぽいエラーが出ます。

結局の所、シリアルは別に接続する必要があるようです。USB経由でシリアルを使う方法もありそうなので試してみましたが、上手くいきませんでした。やや面倒と言えば面倒ですが、この状態だとUSBはフリーになっているので、USBを使う工作で使うには便利そうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)