目的
Windows 10/64bitのパソコン上にRaspberry Pi Picoの開発環境を構築します。また、Picoを2個用意して1個をエミュレータとして接続することでブレークポイント・ステップ実行ベースのデバッグが可能となる環境を構築します。
ビルド環境
基本は公式ドキュメントの記載に従い環境構築していきます。わかり難い点もあるため必要に応じて補足を記載します。
https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf
各種必要ソフトをインストール
多数のソフトが必要ですが、以下のインストーラーを利用すると楽です。時間はかなりかかります。
※以降は状況によって選択が分かれますが、筆者の場合の例で記載します。
MSYS2インストール
以下のページに記載の手順に従ってInstallationを実施します。躓きそうな部分は特に見当たりません。
インストールされた「MSYS2 MinGW 64-bit」を起動し、必要パッケージインストールします。
$ pacman -S mingw-w64-x86_64-toolchain git make libtool pkg-config autoconf automake texinfo mingw-w64-x86_64-libusb
必要に応じてその他パッケージをインストールします。
$ pacman -S vim
パス設定、alias設定を行います。恒久的に設定するには~/.bashrcに追記してください。
$ alias vi='vim' $ export "PATH=$PATH:/c/Program Files/CMake/bin" $ export "PATH=$PATH:/c/Program Files (x86)/GNU Arm Embedded Toolchain/10 2020-q4-major/bin"
SDKとサンプルコード
以降、MSYS2 MinGW 64-bit起動して作業します。尚、pico-sdkを以下のパスに配置する前提で記載します。
C:\user\pico\pico-sdk
SDKとサンプルをgit clone
$ cd c: $ mkdir user $ cd user $ mkdir pico $ cd pico $ git clone -b master https://github.com/raspberrypi/pico-sdk.git $ cd pico-sdk $ git submodule update --init $ cd .. $ git clone -b master https://github.com/raspberrypi/pico-examples.git
サンプルをビルド
$ export PICO_SDK_PATH=c:/user/pico/pico-sdk $ cd pico-examples $ mkdir build $ cd build $ cmake .. -G "MSYS Makefiles" $ make
テストアプリ(1秒周期でLED点滅、及び1秒周期で”Hello world.”の文字列をシリアル出力)を構成
$ cd c:/user/pico $ mkdir pico-work $ cd pico-work $ vi CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)
project(pico-work)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# Initialize the SDK
pico_sdk_init()
# Add sub-directory
add_subdirectory(led_world)
$ cp ../pico-examples/pico_sdk_import.cmake . $ mkdir led_world $ cd led_world $ vi CMakeLists.txt
set(BinName "led_world")
add_executable(${BinName}
main.c
)
pico_enable_stdio_usb(${BinName} 1)
pico_enable_stdio_uart(${BinName} 1)
target_link_libraries(${BinName} pico_stdlib)
pico_add_extra_outputs(${BinName})
$ vi main.c
#include <stdint.h>
#include <stdio.h>
#include "pico/stdlib.h"
int main(void)
{
stdio_init_all();
const uint32_t LED_PIN = 25;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (1) {
printf("Hello world.\n");
gpio_put(LED_PIN, 1);
sleep_ms(500);
gpio_put(LED_PIN, 0);
sleep_ms(500);
}
return 0;
}
テストアプリをビルド
$ cd .. $ mkdir build $ cd build $ cmake .. -G "MSYS Makefiles" $ make
以下のパスに実行ファイルが生成されます。
C:\user\pico\pico-work\build\led_world\led_world.uf2
書き込み・実行
以下の手順でバイナリをPicoに書き込みます。
- PCとPicoをUSB接続
- Picoの「BOOTSEL」ボタンを押しながらPicoをリセット
- 「RPI-RP2」という名称にてUSBストレージとしてドライブに割り当たるので(マウントされるので)、そこに「led_world.uf2」をドラッグアンドドロップする。
書き込みに成功するとPicoが自動的にリセットし書き込んだプログラムが実行されますので、以下動作を確認します。
- Pico本体のLEDが1秒周期で点滅。
- TeraTerm等のターミナルソフトを起動しシリアル接続し、ボーレートを115200に設定する。1秒周期で「Hello world.」の文字列が出力。
デバッグ環境
以下2枚目のPicoをエミュレータとして使用しデバッグする環境を構築していきます。
Visual Studio Codeインストール
Visual Studio Code(VSCode)のインストーラーを以下サイトから取得してインストールします。
以下の拡張機能をインストールします。
- Japanese Language Pack for Visual Studio Code(日本語化。必要に応じて)
- ms-vscode.cpptools
- ms-vscode.cmake-tools
- marus25.cortex-debug
※本手順ではVSCodeでのビルドはしないので実質必要ないものもあるが一応。
Picoprobeをビルド
Picoをエミュレータとして使用するためのプログラムをビルドします。
$ cd c:/user/pico $ export PICO_SDK_PATH=c:/user/pico/pico-sdk $ git clone https://github.com/raspberrypi/picoprobe.git $ cd picoprobe $ mkdir build $ cd build $ cmake .. -G "MSYS Makefiles" $ make
以下のパスに実行ファイルが生成されます。
C:\user\pico\picoprobe\build\picoprobe.uf2
二枚のPicoを接続
二枚のPicoを以下の図の通り接続します。左のUSBケーブルが接続されている方がエミュレータ用です。ターゲット実機は右側です。
ブレッドボードとジャンパーワイヤーを使用して接続した実際の様子は以下の通りです。
※タクトスイッチは100個入りです。ここでは2個しか使いませんが…
PCに二枚目のPico(エミュレータ用)をUSB接続し、Picoprobeを書き込み
以下の手順でバイナリをPicoに書き込みます。
- PCとPico(エミュレータとして使用する側)をUSB接続
- Picoの「BOOTSEL」ボタンを押しながらPicoをリセット
- 「RPI-RP2」という名称にてUSBストレージとしてドライブに割り当たるので(マウントされるので)、エクスプローラーを開いて、そこに「picoprobe.uf2」をドラッグアンドドロップする。
- 書き込みに成功すると自動でリセットされる。
Picoprobe用のUSBドライバの設定を行う(初回のみ)
https://zadig.akeo.ieよりzadig-2.6.exeをダウンロード、実行します。以下のようなポップアップが表示されるので”Install Driver”を押下します。
ターミナルソフトを起動、接続
TeraTerm等のターミナルソフトを起動しシリアル接続し、ボーレートを115200に設定します。
テストアプリをデバッグビルド(最適化オフ、デバッグ情報付与)
テストアプリをデバッグ用の設定でリビルドします。
$ cd c:/user/pico/pico-work $ rm -rf build $ mkdir build $ cd build $ cmake .. -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=on $ make
OpenOCDをビルド
Open-OCDはオープンソースで提供されているGDBサーバー+JTAGピンドライバ機能を持つソフトウェアです。
$ cd c:/user/pico $ git clone https://github.com/raspberrypi/openocd.git --branch picoprobe --depth=1 $ cd openocd $ ./bootstrap $ ./configure --enable-picoprobe --disable-werror $ make -j4
OpenOCDを実行
Picoprobeを使用してデバッグを行う際には常時起動させておく必要があります。
$ src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
※Pico(エミュレータとして使う側)をUSB接続した状態で実行します。接続されていない場合エラーとなり起動失敗します。また、起動後にPicoをUSBから切断した場合はopenOCDも切断されます。
デバッグ構成ファイル
.vscodeディレクトリを作成し、pico-examplesから当該ファイルをコピーします。
$ cd c:/user/pico/pico-work $ mkdir .vscode $ cd .vscode $ cp c:/user/pico/pico-examples/ide/vscode/launch-remote-openocd.json ./launch.json $ cp c:/user/pico/pico-examples/ide/vscode/settings.json .
launch.jsonを以下の通り編集します(★の箇所)
{
"version": "0.2.0",
"configurations": [
{
"name": "Pico Debug",
"type":"cortex-debug",
"cwd": "${workspaceRoot}",
//★"executable": "${command:cmake.launchTargetPath}",
"executable": "${workspaceRoot}/build/led_world/led_world.elf",
"request": "launch",
"servertype": "external",
// This may need to be arm-none-eabi-gdb depending on your system
//★"gdbPath" : "gdb-multiarch",
"gdbPath" : "C:/msys64/mingw64/bin/gdb-multiarch.exe",
// Connect to an already running OpenOCD instance
//★"gdbTarget": "your-openocd:3333",
"gdbTarget": "localhost:3333",
"svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
"runToMain": true,
// Work around for stopping at main on restart
"postRestartCommands": [
"break main",
"continue"
]
}
]
}
VSCodeを起動しデバッグ実施
以下手順でデバッグを実施します。
- VSCodeを起動する。
- テストアプリディレクトリを開く。Ctrl+K → Ctrl-O → C:\user\pico\pico-work を選択。
- main.cを開く。
- F5キー押下(あるいは画面左のデバッグボタン押下)でデバッグ開始
コメント