NUCLEO ST-Link/V2 で外部ターゲットの電圧が 0V になる問題の解決
はじめに
NUCLEOボードから分離した ST-Link/V2 を、自作基板(AT32F405RTC7)のデバッグに使おうとしていました。しかしOpenOCD が ターゲット電圧を 0V と認識してしまい、接続できない問題に遭遇しました。
原因は NUCLEO ボード上の抵抗の配置にあり、抵抗を移植することで解決しました。この記事ではその原因と対処法を紹介します。
症状
OpenOCD を起動すると、以下のようにターゲット電圧が 0.0V と表示され、デバッグが開始できません。
Target voltage: 0.000000
テストポイントの電圧を測ると 3.3V が正しく供給されているにもかかわらず、ST-Link 側がそれを検出できていない状態です。
原因:ST-Link のターゲット電圧検出回路
ST-Link/V2 は、デバッグ対象の電源電圧(VDD)を検出して、SWD の I/O レベルを合わせる仕組みを持っています。NUCLEO ボードでは、この電圧検出回路がオンボード MCU(STM32F303K8)の VDD に接続されています。
つまり、オンボード MCU に対してデバッグする前提の回路構成になっているため、外部ターゲットの VDD は ST-Link の電圧検出ピンに届きません。
NUCLEO ボードの回路図を見ると、ST-Link 内部の STM32F103 が電圧を検出するための分圧抵抗が、ボード上のはんだブリッジ(SB)を介してオンボード MCU 側に接続されています。
解決方法:抵抗の移植
外部ターゲットの電圧を ST-Link に認識させるために、以下の修正を行いました。
- NUCLEO ボード上の電圧検出に関わる抵抗を特定(今回は R23)
- R23 をオンボード MCU 側の VDD パッドから取り外し
- SWD コネクタの VDD ピン(Pin 1)側のパッド R9 に移植
これにより、外部ターゲットの VDD が ST-Link の電圧検出回路に入力されるようになります。
修正後の確認
抵抗の移植後、OpenOCD を起動すると正常にターゲット電圧が検出されました。
Target voltage: 3.271672
これで外部ターゲットの AT32F405 に対して SWD 経由のデバッグが可能になりました。
SWD 接続の配線
参考までに、NUCLEO-F303K8 の CN4(SWD コネクタ)から外部ターゲットへの配線は以下の通りです。
| CN4 ピン | 信号名 | 接続先 |
|---|---|---|
| 1 | VDD | ターゲット 3.3V |
| 2 | SWCLK | ターゲット SWCLK |
| 3 | GND | ターゲット GND |
| 4 | SWDIO | ターゲット SWDIO |
| 5 | NRST | ターゲット NRST |
まとめ
NUCLEO ボードの ST-Link を外部ターゲット用に流用する場合、電圧検出回路の経路変更が必要です。回路図を確認して、ターゲット電圧の検出パスを SWD コネクタ側に切り替えることで、正しく動作するようになります。
「Target voltage: 0.0V」で悩んでいる方は、まずボード上の電圧検出用の抵抗・はんだブリッジの接続先を確認してみてください。