Raspberry Pi STM32F103開発環境(Arduino IDE PlatformIO)

前回はRaspberry Piからのシリアル接続でBluepill,Blackpillへブートローダーの導入ができました。
Arduino IDE(PlatformIO)の環境を構築してブートローダー書き込み後スケッチのアップロードも可能のようです。
さらに環境を整備していろいろ試すと予期せぬアップロードエラーが頻発してしまいます。
これらについてはSTM32に対しての知識が乏しいのが最大の要因ですがOSやToolなどの問題もあるようです。
この点については後述しますが取り敢えずアップロードも正常にできるようになりました。(一手間必要ですが!)

環境構築
STM32ボードを使うためにはコンパイラやツールを導入する必要があるのですがArduino_STM32のツールはRaspberry Pi(ARM)に対応していません。そのため先にPlatformIOから環境構築をします。

PlatformIO
boardを選択

$ pio boards | grep -i stm32f103


型番STM32F103C8では(20k RAM. 64k Flash)になっているためSTM32F103CB (20k RAM. 128k Flash)を選択します。
おそらく現在流通しているSTM32F103C8搭載ボードは128k Flashになっていると思います。

boardはSTM32F103CBに決定しました。
ディレクトリ、設定ファイルを作成します。

$ mkdir -p ~/platformio/project/stm32/bluepill/Blink
$ cd ~/platformio/project/stm32/bluepill/Blink
$ pio init -b genericSTM32F103CB

platformio.iniが作成されているはずなので編集

[env:genericSTM32F103CB]
platform = ststm32
board = genericSTM32F103CB
framework = arduino
upload_port = /dev/ttyACM0
upload_protocol = dfu

ディレクトリsrc/にBlink.inoを作成(~/platformio/project/stm32/bluepill/Blink/src)
boardはBluepill

void setup() {
  pinMode(PC13, OUTPUT);
}

void loop() {
  digitalWrite(PC13, LOW);
  delay(1000);
  digitalWrite(PC13, HIGH);
  delay(1000);
}

準備ができたので実行(ディレクトリは~/platformio/project/stm32/bluepill/Blink)

$ pio run

コンパイラやツールのダウンロードとコンパイルのみ実行します。
終了すると~/.platformio/packages以下にSTM32関連のファイルがインストールされています。

Arduino IDE
ここからArduino IDE側の環境を構築していきます。
ボードマネージャからArduino SAM Boards (32-bits ARM Cortex-M3)インストール

Arduino_STM32をダウンロード

https://github.com/rogerclarkmelbourne/Arduino_STM32
Download ZIPでダウンロードしたファイルを展開コピー
tools/linuxをPlatformIOにリンク

$ unzip Arduino_STM32-master.zip
$ cp -r Arduino_STM32-master ~/Applications/arduino-1.8.5/hardware
$ cd ~/Applications/arduino-1.8.5/hardware/Arduino_STM32/tools
$ rm -r linux
$ ln -s ~/.platformio/packages/tool-stm32duino linux

udev設定
PlatformIOからダウンロードした~/.platformio/packages/tool-stm32duinoディレクトリの45-maple.rulesを編集(コピーを取って編集)
Raspberry piではModemManagerと競合するようです。

$ cd ~/.platformio/packages/tool-stm32duino

45-maple.rules 3行目、4行目ENV{ID_MM_DEVICE_IGNORE}="1"追記
ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev"
ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev"
ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1"

install.shを実行
$ sudo ./install.sh

/etc/udev/rules.dにrulesファイルが作成されます。

-rw-r--r-- 1 root root  411  7月 29 10:12 45-maple.rules
-rw-r--r-- 1 root root  471  7月 28 22:08 49-stlinkv1.rules
-rw-r--r-- 1 root root  532  7月 28 22:08 49-stlinkv2-1.rules
-rw-r--r-- 1 root root  530  7月 28 22:08 49-stlinkv2.rules
-rw-r--r-- 1 root root 1028  7月 28 22:10 99-com.rules

ここで設定を有効にするためRaspberry Piを再起動します。

書き込みを実行してみる
ここで前回のブートローダーを再度書き込みます。
BOOT0 1 reset
$ stm32flash -w generic_boot20_pc13.bin /dev/serial0
BOOT0 0 reset
/dev/ttyACM0 確認

先に作成したBlink.inoを書き込み ~/platformio/project/stm32/bluepill/Blink

$ pio run -t upload


upload OKですね

45-maple.rulesの追加修正が無いと下記のリセット操作が必要になります。

再度書き込み実行 $ pio run -t upload
dfu-util: No DFU capable USB device available

検索するとこのエラー報告は多く見つかりますが解決策はなかなか見つかりません。
いろいろ試すと適当なタイミングでリセットすると成功することがわかりました。根本的な解決策では無いのですがこんな解説が見つかります。
Uploading a sketch
多分ここに書いてあることと同じと思いますがdfu modeにできなかったので手動でリセットしなさいということです。

ブートローダー書き込み直後はflashに何も無いためdfu modeで起動、待ち受けるため初回のみ成功すると思います。
さてリセットのタイミングですがPlatformIOから実行した場合は(コンパイル済)
Compiling .pioenvs/genericSTM32F103CB/src/Blink.ino.cpp.o
または
Uploading .pioenvs/genericSTM32F103CB/firmware.bin
ここで少し待っているのでいいタイミングでリセットを1回押します。
慣れてくるとかなりの確率で成功すると思います。


Arduino IDEからも同様で書き込み動作(赤文字)に入る前のタイミングでリセットします。

dfu-utilは汎用書き込みツールでRasbpianにもパッケージ(同バージョン)があります。
おそらくwindowsではこのような問題は無いと思うので簡単に解決することは難しいと感じています。

取り敢えずリセット書き込みになりましたがなんとか正常に書き込めるようなのでこの状態で少し遊んでみようと思います。

アダプタの作成 bluepill.pdf

PiのGPIOを利用するためアダプタを作成しました。ESPの下駄を利用しています。(電源3V3はベース基板から)
空いてるランドにピンソケットを立て引き出しています。
またUSBコネクタも繋ぎ変えたくないのでベース基板のコネクタを利用します。
使用の際はcp2102モジュールを外してアダプタをセット。D-D+はピンヘッダを介してモジュールのPA11,12と接続しておりD+のプルアップはモジュール側を利用することになります。ブートローダーは適切にセットしてあれば確実に書き込んでくれます。スケッチ書き込みもOKです。

end