NUCLEO-L152REにわざわざST-Link v2を接続してOpenOCDで接続してみた
NUCLEO-L152REにはオンボードでST-Link v2が搭載されているため、ST-Link v2のようなUSB JTAG/SWDデバッガは必要ありません。
今回はわざわざST-Link v2をデバッガ、NUCLEO-L152REをターゲットとして、OpenOCDを使ってみたいという試みです。 この試みには有益性が全く無いですが、はまりどころがあったのでブログに残しておきます。
OpenOCDはgit版を使っています。
K_atc% openocd -v
Open On-Chip Debugger 0.10.0-dev-00411-g607edef (2016-11-05-14:18)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
ピン接続
デバッガ側は、ST-LinkのSTM32と書かれた20ピンを使います。 ピンの割り当ては下の図のようになっています。

図は ULINK2 User's Guide: Target Connectors より
Nucleo側はCN2(ST-Link)ピンに刺さっているジャンパーを外して、CN11、CN12に取り付けます。 ジャンパーを無くさないように設計されていてとてもいいですね〜
SWDの場合

CN2を上から(USBポートがある方を上にする)ピン1、ピン2、ピン3、ピン4とします。 メスーメスのジャンパーコードを下表の対応関係で接続します。
| Nucleo側 | ST-Link側 |
|---|---|
| 1 | 1 (VCC) |
| 2 | 9 (SWCLK) |
| 3 | 4 (GND) |
| 4 | 7 (SWDIO) |
JTAGの場合(試行中)
CN4を上から(USBポートがある方を上にする)ピン1、ピン2、…、ピン6とします。
メスーメスのジャンパーコードを下表の対応関係で接続します。
※をつけたポートはCN2のポートを使用したほうがいいかもしれないです?(OpenOCDに target voltage may be too low for reliable debugging と怒られてしまう)
| Nucleo側 | ST-Link側 |
|---|---|
| 1 | 1 (VCC) ※ |
| 2 | 9 (JTCK) ※ |
| 3 | 4 (GND) ※ |
| 4 | 7 (TMS/JDIO) ※ |
| 5 | 3 (nRST) |
| 6 | 13 (TDO/SWO) |
OpenOCD
ダメな接続例:USB電源を2箇所からとる
openocdのどのスクリプトファイルを使えばいいのかわかりませんでした。 最初はオンボードのデバッガに接続してしまわないように、Nucleoの電源は別のPCからとっていました。 そしたらOpenOCDの起動時のチェックで、ターゲットの電圧が0Vだったり1.5V以下だったりしてエラーになりました。 GNDのレベルがST-LinkとNucleoで違うからなんでしょうね。
よい接続例:USBを同じところからとる
2本のUSBを同じPCに接続するということです。
OpenOCDのスクリプトファイル(-fオプションで渡すファイル)を次の要領で作成しました。
ベースのディレクトリはインストール先によって変わるかもしれません。
# openocd -s /usr/share/openocd/scripts -f interface/stlink-v2.cfg -f target/stm32l1.cfg # でもよい。 [f:id:katc:20170424162753p:plain] cat /usr/share/openocd/scripts/interface/stlink-v2.cfg /usr/share/openocd/scripts/target/stm32l1.cfg > stlink-v2-stm32l1.cfg
SWD/JTAGのどちらの場合も、cfgファイルが対応しているはずなのにjtagで接続できない…
あとはopenocdコマンドを叩いて、デバッガのランプが緑と赤で交互に点滅したら接続完了です。
[root@K_atc nucleo-l152re]# openocd -f stlink-v2-stm32l1.cfg
Open On-Chip Debugger 0.10.0-dev-00411-g607edef (2016-11-05-14:18)
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 use 'transport select <transport>'.
adapter speed: 300 kHz
adapter_nsrst_delay: 100
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
none separate
Info : Unable to match requested speed 300 kHz, using 240 kHz
Info : Unable to match requested speed 300 kHz, using 240 kHz
Info : clock speed 240 kHz
Info : STLINK v2 JTAG v27 API v2 SWIM v6 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.183191
Info : stm32l1.cpu: hardware has 6 breakpoints, 4 watchpoints