サンプルソースがビルドはできたので、次はデバッグ環境だ(メモリマップとかデフォルトのままなので、まともにはうごかないだろうけど)。発注したST-LINK互換品が届いたので、PCにさしてみた。すると、STM32 STLinkとしてデバイスは認識された。
ファームを焼いたりデバッグ操作はコマンドラインからできるようにしたいけど、、ST-LINKを制御するために、ひとまず、STM32 ST-LINK Utilityを入れてみる。
https://www.st.com/en/development-tools/stsw-link004.html
ツールを入れてる途中に、USB/シリアルドライバも入って、ST-LINKはCOMポートとして見えるのか?
で、、ST-LINKが正しく操作できるかSTM32 ST-LINKを走らせて確認する。メニューから、Target>Settings... を選択する。正しく接続されていると、SerialNumberとFirmwareVersionが表示される。もし正しく接続されていないと、ST-LINKの欄に、「No ST-LINK detected!」と表示される。ST-LINKのファームバージョンが取得できたので、PCとは正しく接続できていると判断。
(バージョンアップ終わってから再度撮影しているのでバージョンがすでに上がっています)
ST-LINK Utilityを使うことで、ターゲットボードにファームを焼けるようだが、扱えるファイルは、bin,hex,srec,s19のようで、先ほどビルドしたaxf形式は扱えない。だから、、バイナリを抜き出す必要がある。まだターゲットボードが届いていないので、今はファーム焼かない。
GDBでデバッグするにはOpenOCDが必要というわけで、以下からOpenOCDを取得
http://www.freddiechopin.info/en/download/category/4-openocd
OpenOCDを起動する際は、ボードの属性が定義されたconfigを読み込ませるようなのでが、、これは同梱されている以下のフォルダにありそうだ。
openocd-0.10.0/scripts/board
ボードが来てから、使えそうなconfigを探すことにする。OpenOCD起動時に、デバッグ手段としてST-LINKをどうやって指定するのかはチトわからず。
何もわからずopenocdを実行すると以下の内容で怒られた。openocd.cfgも見つけられないと。。
$ ./openocd.exe Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html embedded:startup.tcl:60: Error: Can't find openocd.cfg in procedure 'script' at file "embedded:startup.tcl", line 60 Error: Debug Adapter has to be specified, see "interface" command embedded:startup.tcl:60: Error: in procedure 'script' at file "embedded:startup.tcl", line 60
先行する方をぐぐってみると、例えば以下で起動
openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg
上記を参考に以下と打ち込んでみる、、ボードがないと怒られる(まだ納入されていないので仕様通りの動作かと)
$ ./bin-x64/openocd.exe -f scripts/interface/stlink-v2-1.cfg -f scripts/target/stm32f1x.cfg Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override u se 'transport select <transport>'. Info : The selected transport took over low-level target control. The results mi ght differ compared to plain JTAG/SWD adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : clock speed 950 kHz Error: open failed in procedure 'init' in procedure 'ocd_bouncer'
評価ボードが届いたら実際にファーム焼いてデバッグしてみるつもり。さすがにクロスコンパイラのコンパイルはやる気がないけど、ARM用のコンパイラやらデバッガ等のツール類を集めながら試行錯誤で動かすのは面白い。。GCCによるIDEでなくコマンドベースの開発環境を構築する解説本も出ているので、自分の手あたりばったり手法が進まなくなればそれを読むつもり。
先日買ったstm32nucleoにもST-LINK Debugが付いてるのを思い出して、、
[PC (USB)]--(USB)--[stm32nucleo]
の形式で接続した。以下を実行、ターゲットと接続できた。別途購入したST-LINK V2とNucleoを接続するには、Nucleo側のST-LINKを切り離す必要があると思うのですが、ボード側のジャンパ設定がちょっと分からないので、今日はここまで。
$ ./bin-x64/openocd -f scripts/interface/stlink-v2-1.cfg -f scripts/target/stm32l4x.cfg Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override u se 'transport select <transport>'. Info : The selected transport took over low-level target control. The results mi ght differ compared to plain JTAG/SWD adapter speed: 500 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 500 kHz, using 480 kHz Info : Unable to match requested speed 500 kHz, using 480 kHz Info : clock speed 480 kHz Info : STLINK v2 JTAG v36 API v2 SWIM v26 VID 0x0483 PID 0x374B Info : using stlink api v2 Info : Target voltage: 3.249836 Info : stm32l4x.cpu: hardware has 6 breakpoints, 4 watchpoints
■追記
BuffaloのUSBハブを仲介させると接続が安定した(10回抜き差ししてもエラー発生せずに認識)。ST-LINKのUSBの電気特性の問題ではないかと推測。以下は場当たり的回避策
ST LINKを使っておられる記事
YES! STM32 einchip mikrokontroller!
OpenOCD + ST-LinkでFirmware書き込み - ryochack.blog
STM32 STM32F103C8T6マイコンボードを ST-Link V2を使って開発 (STM32F103C8 ARM Cortex-M3 72MHz CPU、ST-LINK Utilityでファームのアップデート)
■追記
別のデスクトップにSTLINKをさすと、ドライバが正しく入らずエラーになった。
ノートPCでやったのと同じように、STSWのソフトウエア一式を入れてみる。
https://www.st.com/en/development-tools/stsw-link004.html
上記ソフトウエアを入れる途中でユニバーサルシリアルバスデバイス用のデバドラがインストールされ、ST Linkのエラーが解消された。
STM32 ST-LINK Utilityは正常に動作した。