Mac/LinuxでSTM32にシリアル書き込み

Mac/Linux から STM32 マイコンに書き込みをする方法といえば SWD だったのですが、この度2つほどお手軽なシリアルで書き込む方法を見つけましたのでご紹介します。使う通信プロトコルは UART です。どちらもプログラム実行前には BOOT0 を High に入れたままリセットを行ってください。これでブートモードに入れます。
なお書き込み終了後は BOOT0 を Low にして、そのままリセットをすれば動作を開始すると思います。

色々やってて思ったんですが、やはりマカーには試練がつきものなのですね。色々設定やら改造やらが必要で、疲れてきますよ(本当はそれが楽しいんですがね)。という訳で、以下紹介です。

STM32 Program for Micromouse

マイクロマウスで有名なこじまさんが作製してくださった書き込みツールです。ライタにも関わらず珍しく Python で動きます(そういえば SH Tiny 用のPython製ライタもありましたねえ)。pyserial のインストールは必須です。今のところ Mac で動作を確認しています。ダウンロード先はこちら
こちらのツールはバイナリを直接書き込み指定することが出来ず、Motorola S 形式の *.mot ファイルを用意する必要があります。このファイル形式はルネサス製マイコンを使っている方には馴染みのある形式だと思います。
それでこのファイルの生成法ですが、arm-none-eabi-objdump が必要となります。SW4STM32 で出来上がった elf ファイルをご用意の上、以下のコマンド実行で生成できます。

$ arm-none-eabi-objcopy -O -ihex Resistors_F103.elf Resistors_F103.mot

続いて実際の実行法です。zip ファイルを展開したら中の stm32writer/ に移動し、こんな感じで実行できます。

$ ./stm32writer.py --port=/dev/tty.usbserial-AI0454E0 -e ~/Dropbox/SW4STM32/workspace/Resisters_F303/Debug/Resisters_F303.mot --show-erase-page

--port で出力先のシリアルデバイスを指定し、-e で書き込む mot ファイルを指定します。なお最後の --show-erase-page は必須ではありませんが、書き込み前にイレースされるフラッシュ領域のセクタ番号を表示してくれますのでやや便利かなと思います。

このツールですが、デフォルトでは STM32F3 シリーズには対応していません。なので以下のコードを stm32_prm.py の 66行目付近に追加してください。

prm[0x438]={
    "Device" : "STM32F3xx device",
    "Flash erase unit" : "page",
    "Flash page size" : 0x800,
    "Flash start addr" : 0x08000000,
    "Flash end addr"   : 0x08100000}

これでバッチリです。

stm32flash

こちらは C で書かれた書き込みツールです。brew を使っている方は

$ brew install stm32flash

でサクッとインストール可能です。現時点での最新バージョンは 0.5 でした。Mac/Linux で動作を確認しています。以下の設定および状況は Mac での話です。

こちらもそのまま使用… とは行きません。このツール、僕が実験した結果 LPC11U35 デバッガでは使用不可 ということが分かっています。実際の動作を確認したものは FT232R のみであり、それ以外はまだ分かりません。CP10x とかどうなんでしょう。

しかもこの FT232RL は AppleデフォのFTDIドライバkextでは利用不可だということもわかりました。どうするかといいますと、この FTDI 社のページから VCP Driver をインストールする必要があるということです。インストール後は再起動をお勧めします。これさえ乗り越えれば実行は容易です。このコマンドは SW4STM32 で生成した bin ファイルをそのまま指定して書き込むことが出来るのでとても手頃となっています。

実際のコマンド実行はこちら。

$ stm32flash -b 230400 -w ~/Dropbox/SW4STM32/workspace/Resisters_F303/Debug/Resisters_F303.bin /dev/tty.usbserial-AI0454E0

以下、実行結果になります。

stm32flash 0.5

http://stm32flash.sourceforge.net/

Using Parser : Raw BINARY
Interface serial_posix: 230400 8E1
Version      : 0x31
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0438 (STM32F303x4(6/8)/F334xx/F328xx)
- RAM        : 12KiB  (6144b reserved by bootloader)
- Flash      : 64KiB (size first sector: 2x2048)
- Option RAM : 16b
- System RAM : 8KiB
Write to memory
Erasing memory
Wrote address 0x08005e0c (100.00%) Done.