Logo Shun Suzuki

RustでRaspberry Pi Picoの開発 (Windows + VSCode + OpenOCD + GDB)

以下は, この記事に従ってOpenOCDがインストールされていることが前提である.

事前準備

Raspberry Pi Picoの用意

ここでは, Raspberry Pi Picoを二台用意し, 片方にPicoprobeを書き込み, これを使用してもう一台の開発を行うことにする.

Picoprobeは公式にuf2ファイルが用意されているので, これを使用すれば良い.

あとは, ドキュメントのAppendix Aに従って, 二台のRasberry Pi Picoを接続しておく.

必要なツールのインストール

次に, コンパイルに必要なRustのツールチェインとツールをインストールする.

rustup target install thumbv6m-none-eabi
cargo install flip-link

あと, templateを使用するために, cargo-generateもインストールする.

cargo install cargo-generate

また, デバッグ用にgdbもインストールしておく, これはMSYSで行う.

pacman -S mingw-w64-x86_64-gdb-multiarch

テンプレートのビルド

Raspberry Pi Pico用のテンプレートが存在するので, これを利用する.

cargo generate --git https://github.com/rp-rs/rp2040-project-template --name pico-blink
cd pico-blink
cargo build

すると, target/thumbv6m-none-eabi/debug/rp2040-project-template (ELF形式) が生成される.

VSCode + GDBを使用してデバッグ

VSCodeとgdbを使用してデバッグするには, まず, 以下の拡張機能をインストールする必要がある.

Native Debug

次に, .vscode/launch.jsonを書き換える. デフォルトのままだと動かないので適当に書き換えた.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "rp2040-project",
            "preLaunchTask": "rust: cargo build",
            "type": "gdb",
            "request": "attach",
            "executable": "target/thumbv6m-none-eabi/debug/rp2040-project-template",
            "cwd": "${workspaceFolder}",
            "target": ":3333",
            "remote": true,
            "gdbpath": "gdb-multiarch",
            "autorun": [
                "target remote :3333",
                "mon reset init",
                "load",
            ],
        }
    ]
}

次に, terminalでOpenOCDを起動する.

openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s C:/openocd/tcl

あとは, main.rsを開き, 適当なところにブレークポイントを貼り, F5を押せばデバッグが始まる.

OpenOCDで書き込み

上記のELFファイルをOpenOCDで書き込むには以下のようにすれば良い.

openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s C:/openocd/tcl -c "program target/thumbv6m-none-eabi/debug/rp2040-project-template verify reset exit"

UF2で書き込み

或いは, UF2で書き込む場合はelf2uf2-rsを使用する. まず, elf2uf2-rsをインストールする.

cargo install elf2uf2-rs

次に, BOOTSELボタンを押した状態でRaspberry Pi Picoを接続しておく.

また, .cargo/config.tomlを書き換え, runner = "probe-run --chip RP2040"をコメントアウトし, runner = "elf2uf2-rs -d"のコメントを外す.

# runner = "probe-run --chip RP2040"
# runner = "cargo embed"
runner = "elf2uf2-rs -d"

この状態で, cargo runするとuf2が自動的に書き込まれる.