chakokuのブログ(rev4)

日々のごった煮ブログです

ARM用開発環境を構築してみる(デバッグ環境)

サンプルソースがビルドはできたので、次はデバッグ環境だ(メモリマップとかデフォルトのままなので、まともにはうごかないだろうけど)。発注したST-LINK互換品が届いたので、PCにさしてみた。すると、STM32 STLinkとしてデバイスは認識された。

f:id:chakoku:20200307151130p:plain:w300
HiLetgoで購入したST-LINK(互換品)
device認識状況
ターゲットボードはGDBデバッグしたいので、その場合はOpenOCDを動かす必要あるようだ。

ファームを焼いたりデバッグ操作はコマンドラインからできるようにしたいけど、、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 Manager画面
ST-LINKのファームも最新に上げておくのがよかろうと、ST-LINK > Firmware updateを選択、ST-Linkと接続するダイアログが出て、「Device Connect」を押下、ST-Linkに接続され、現在のバージョン(V2.J29.S7)と更新バージョン(V2.J34.S7)が出る。「YES>>>」を押下してST-LINKのファームを更新する。その後、ST-LINKは正常に認識されなくなったが、ST-LINKをさしているUSBポートを別のポートに変更すると再認識された。。ST-LINK純正品ではないので、こういう動作はかなりビビる。なんどか抜き差しして試すと、半分ぐらいの確率で正しく認識されない(不明なUSBデバイスと表示される)。うーん。どうしたものか(この問題については、追記:場当たり的回避策をご参照ください)。

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認識問題を場当たり的に回避

■ご参考URL
STM32解説本
Getting Started With STM32 Nucleo Development (English Edition)

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は正常に動作した。