Raspberry Pi PicoをWSL2+vsCodeで開発する

ゼロ状態からのC/C++でのRaspberry Pi Pico開発環境の構築メモ(Windows 10)

環境構築

WSLのインストール

  • Ubuntuをインストールする。
wsl --install -d ubuntu
sudo apt update && sudo apt upgrade

WSL2への変更

  • verを確認、2であればOK
wsl -l -v

vsCodeおよび拡張機能Remote-WSLのインストール

  • vsCodeをインストールする、また以下の拡張機能をインストールする
  • ネイティブ環境
    • Remote-WSL
  • WSL上
    • C/C++
    • CMake
    • Cortex-Debug

Pico開発環境の構築

SDKの導入

cd ~/
mkdir pico
cd pico

git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --init
git pull
git submodule update

.bashrcに以下を追記(PATHを通す)

export PICO_SDK_PATH=~/pico/pico-sdk

Toolchainのインストール

sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential libstdc++-arm-none-eabi-newlib

pico-examplesのビルド

  • 環境構築のテストのため公式のexamplesをビルドしてみる
cd ~/pico
git clone -b master https://github.com/raspberrypi/pico-examples.git
cd  pico-example
mkdir build
cd build

cmake ..
make -j4
  • 無事終了すればOK

Picoに書き込む

  • PicoをUSB経由で接続し、マウントする
  • uf2ファイルをコピーすることで書き込みできる
sudo mkdir /mnt/usb
mount -t drvfs d: /mnt/usb
sudo cp ~/pico/pico-examples/build/blink/blink.uf2 /mnt/usb/
  • 書き込みに成功すればLEDが点滅する

自作プロジェクト

  • exampleでなく、自分でプログラムを作成し書きこんでみる
  • 以降の作業はvsCodeからWSLにリモート接続し行う

プログラムの配置

  • プロジェクト用のディレクトリを作り、そこにプログラムを配置する
cd ~/pico
mkdir pico_test
cd pico_test
  • blink.cという名前でプログラムを配置
#include "pico/stdlib.h"

int main() {
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);

    bool LED_ON = false;
  while (true) {
        gpio_put(LED_PIN, LED_ON);
        LED_ON = !LED_ON;
        sleep_ms(1000);
    }
}

CMakeファイルの作成

  • CMakeLists.txtという名前でプログラムと同じディレクトリに配置
cmake_minimum_required(VERSION 3.13)

include(pico_sdk_import.cmake)

project(blink C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()

add_executable(blink blink.c)

target_link_libraries(blink pico_stdlib)

pico_add_extra_outputs(blink)

pico_sdk_import.cmakeのコピー

  • CMakeファイルの実行に必要なファイルをpico-sdkからコピーしてくる
cp ~/pico/pico-sdk/external/pico_sdk_import.cmake ~/pico/pico_test/

vsCode用設定ファイルの作成

  • .vscodeフォルダを作成しそこにc_cpp_properties.jsonという名前で放り込む
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/root/pico/pico-sdk/**",
                "${workspaceFolder}/build/generated/pico_base/"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

ビルドしてみる

  • ビルドが通ればOK
mkdir build
cd build
cmake ..

make -j4

デバッグ

  • Picoをデバッガ化するPicoprobeを用いてデバッグする
  • 接続等に関しては公式ドキュメント参照

Picoprobeのビルド

  • デバッガ用のPicoに書き込む
cd ~/pico
git clone https://github.com/raspberrypi/picoprobe.git
cd picoprobe
mkdir build
cd build
cmake ..
make -j4

gdb-multiarchのインストール

sudo apt install gdb-multiarch

OpenOCDのビルド・インストール

  • RP2040、Picoprobeを使う都合上、公式リポジトリからブランチを指定して落とす
  • ビルドしてインストール
cd ~/pico
sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev pkg-config
git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1 --no-single-branch
cd openocd
./bootstrap
./configure --enable-picoprobe
make -j4
sudo make install

usbipdのインストール

winget install --interactive --exact dorssel.usbipd-win
  • WSL側にUSBIPDツールをインストール
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20

vsCodeデバッグ用launchファイルを作成

  • .vscode内に配置
  • とりあえず引っ張ってきたものなのであとで勉強する
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Pico Debug",
            "cwd": "${workspaceRoot}",
            "executable": "${command:cmake.launchTargetPath}",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "external", 
            // This may need to be arm-none-eabi-gdb depending on your system
            "gdbPath": "gdb-multiarch",
            // Connect to an already running OpenOCD instance
            "gdbTarget": "localhost:3333",
            "device": "RP2040",
            "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
            "runToEntryPoint": "main",
            // Work around for stopping at main on restart
            "postRestartCommands": [
                "break main",
                "continue"
            ]
        }
    ]
}

デバッグ

  • PicoにPicoprobeを接続、PicoprobeをPCに接続
  • WindowsからWSLにPicoprobeをブリッジする
    • Picoprobeのbusidを確認し、そのbusidをattachする
usbipd list
usbipd wsl attach --busid 4-3
  • WSLのアップデートを求められた場合はそれに従う
wsl --update
  • vsCodeの実行とデバッグタブを開き、active kitにarm-none-eabiを指定

  • OpenOCDを起動

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