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のインストール
Pico開発環境の構築
- ドキュメントのChapter 2参照
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用設定ファイルの作成
{ "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のインストール
- 参考
ネイティブ環境からWSL2にUSBデバイスをブリッジする
まずWinsows側にUSBIPD-WINをインストール
- PowerShellで実行
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
openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl