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