ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

STM32CubeProgでUARTを使ったフラッシュ書き換えを試す

STM32に関しては久しぶりですが
今回はSTからリリースされたSTM32CubeProgというソフトについてみていこうと思います。

STM32CubeProg

www.st.com

簡単に説明すると

STlink utility とかflash loaderとかdfuツールとかそういうのが一緒になってWindows,Mac ,Linuxに対応したものです。
以前できたことは一通りできます。

というわけで・・・・・

SWD接続とかDFUはいろんな方がやっているので
UARTブートローダーでもやってみようと思います。

UART bootloader

UARTからバイナリをぼこぼこ投げて書き込みできる機能。
特にまあたらしい物でもないからこんなもんで早速やって行きましょう。

今回使うものはSTM32F767 Nucleoを使うのでそれ用の設定で説明していきます。

STM32F767の場合UARTは以下のものが使えます。
f:id:gsmcustomeffects:20181020085513p:plain

んでまあ見てわかるんですが注意が必要でUART3ってSTLINKとつながってるのでそれが使えるやん?思う方もいると思うんですがところがどっこい
f:id:gsmcustomeffects:20181020085624p:plain

ブートローダーで使えるピンと違うとこからUART3を出してるのでSTLINK経由では使えません(このせいでなんでつながらないんだろうと5分位悩みました。
問題が整理できたとこでPC10,11が使えるとのことからこの辺から引っ張ってあげましょう

f:id:gsmcustomeffects:20181020090002p:plain

STLINKのTX RXピンから延ばしてもいいのですがシリアル変換器はこの辺の使ってます
f:id:gsmcustomeffects:20181020090144p:plain

次にbootloaderに遷移するための準備です。
STM32の場合は基本BOOT1とBOOT0の設定でフラッシュブートとsystem bootloaderから起動するか設定できるんですがF7の場合BOOTピン一個になりまして起動アドレス指定ができるようになりました。
f:id:gsmcustomeffects:20181020091839p:plain

初期状態でBOOTをHIGHにするとsystem bootloaderでいけるという感じですね。オプションバイトに関してはCubeProgで書き換えたり今の状態を見たりできるのでその都度確認してみてください。
ピンで言うとここです
f:id:gsmcustomeffects:20181020092138p:plain

ココまで終わるとフローチャート的にはこうなります
f:id:gsmcustomeffects:20181020092315p:plain

というわけでBOOTピンをHIGHにしてリセットしてUARTで接続してみましょう。
つながるとこのようになります。
f:id:gsmcustomeffects:20181020092536p:plain

先ほど示したオプションバイトはこのように確認できます。
f:id:gsmcustomeffects:20181020092623p:plain

書き込みはこの画面からできます
f:id:gsmcustomeffects:20181020093101p:plain

所感

というわけでかなり簡単にフラッシュの書き換えができるというわけです。
近年デバッガが安くなってきており持ってると特に使わない機能なんですが

エフェクターとか開発してると弾き手とかそういう人とやりとりする機会が結構あってアルゴリズム詰めてる時向こうが書き込み機を持ってないときとかに便利です。
あとは製品出荷後にアップデートとかしたいときに使えます。

あとF7ならDFUで書くほうが何もいらないのでいいと思いましたw

おまけ

ブートローダーについてCubeProgが自動でやってくれるので特に必要ありませんがマイコン間とかでファーム書き換えする場合は自前で打つ必要があります。
f:id:gsmcustomeffects:20181020093528p:plain

BOOTピンをHIGHにして該当UARTに0x7Fを送るとUARTブートするみたいです。
それを送るとACKがかえるみたいなのでTeratermで実験してみた。
f:id:gsmcustomeffects:20181020093833p:plain

Teratermを16進表記するとわかりやすいのでココを参考にしてみてください
shuzo-kino.hateblo.jp

デバッグmodeにできたら
信号を送信していきます。

ここでもTeratermのマクロ機能が便利です。

send $7F

とすると0x7Fを送ってくれます。

保存はこのような拡張子にします
f:id:gsmcustomeffects:20181020094134p:plain

次に接続設定です。
f:id:gsmcustomeffects:20181020094223p:plain

パリティEVEN以外は得に変わりはないです。

そうしたら上部メニューからコントロール/マクロを選択 先ほどのiniファイルを選択すると

f:id:gsmcustomeffects:20181020094332p:plain

きちんと79が帰ってきています。

そのあとはマニュアル通りにコマンドを打ってあげると書き込みできます。

ちなみにteratermのマクロはいろいろできるのでプロトコルとかそういった通信テストには便利だと思いますので覚えておくといいでしょう。

資料など

  • AN3155 Application note USART protocol used in the STM32 bootloader
  • UM2237 User manual STM32CubeProgrammer software description
  • AN2606 Application note STM32 microcontroller system memory boot mode