前回の記事では、開発環境の設定と、実際にプログラムを書き込むところまでの手順を紹介しました。
yokomumu.hateblo.jp
今回は、Raspberry Pi Debug Probeを使ったプログラムの書き込みとデバッグの手順について紹介したいと思います。
Debug Probeの本家サイトはこちら。
www.raspberrypi.com
Amazonからも購入できます:https://amzn.to/3YtdsR1
Debug Probeを接続する
Debug ProbeとターゲットのRaspberry Pi Picoを接続します。

私のRaspberry Pi PicoにはSWD用のSHコネクタが付いていませんので、ピンヘッダーをはんだ付けして、そこへDebug Probe付属のSHコネクタ - ピンソケットケーブルを使って接続しています。
なお、接続方法は以下の通りです。
- 橙色:SWCLK
- 黒色:GND
- 黄色:SWDIO
また、UARTも忘れずに接続します(接続しなくても書き込みはできますがデバッグができません)。
そして、例によってDebug Probeのためにudevの設定を追加します。
$ sudo vi /etc/udev/rules.d/99-raspberry-pi-pico.rules
以下の行を貼り付けて保存、終了します。
SUBSYSTEM=="usb", ATTR{idVendor}=="2e8a", ATTR{idProduct}=="000c", MODE="0666", GROUP="plugdev"そしてルールファイルを読み込ませます。
$ sudo udevadm control --reload-rules $ sudo udevadm trigger
OpenOCD(On-Chip-Debugger)の設定をする
Raspberry Pi公式がPicoシリーズ用に用意したOpenOCDをインストールします(ついでに念のためgdb-multiarchも最新版を入れます)。
$ sudo apt update $ sudo apt install gdb-multiarch autoconf automake libtool pkg-config libusb-1.0-0-dev libhidapi-dev autoconf-archive
そしてOpenOCDをクローンし、ビルド、インストールします。
$ git clone https://github.com/raspberrypi/openocd.git --depth=1 $ cd openocd $ ./bootstrap $ ./configure --enable-picoprobe $ make CFLAGS="-Wno-error" -j4 $ sudo make install
次にOpenOCDデーモンを立ち上げます。
$ openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg
SWD経由でプログラムを書き込む
BOOTSELボタンを押しながら接続せずとも、VSCodeからSWDを使ってプログラムを書き込むことができます。これは超らくちん。
VSCodeのサイドバーにあるRaspberry Piのアイコンをクリックします。
続いて、「Flash Project (SWD)」をクリックしてみます。
以下のようなログが表示されたら書き込みは問題なく終了しています。
Info : Padding image section 1 at 0x10001944 with 188 bytes (bank write end alignment) Warn : Adding extra erase range, 0x10001a00 .. 0x10001fff ** Programming Finished ** ** Verify Started ** ** Verified OK ** ** Resetting Target ** shutdown command invoked * Terminal will be reused by tasks, press any key to close it.
デバッグを開始する
予めプロジェクトDebugビルドしておかないとうまくデバッグできませんが、取り敢えず動作確認ということで、とにかくデバッガを起動してみます。
まず、プロジェクトの初期設定として、下の図のようにVSCodeのサイドバーから「Run & Debug」をクリックします。

続いて、下の図ようにスピナーボックスから「Pico Debug (Cortex-Debug with external OpenOCD)」を選択します。

すると、先に起動したOpenOCDデーモンのターミナルにログがチョロチョロと流れ、やがてデバッガが起動します。

main()関数の先頭で停止します。
あとは、トレース実行やローカル変数のブラウズなどもできます。
以上です。また手順を改良できたら紹介したいと思います。
という訳で…
