36
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi Pico C/C++ SDK 環境構築 on Windows 10

Last updated at Posted at 2021-02-11

About

  • Windows 10上でC/C++ SDKを使用したRaspberry Pi Picoの開発環境構築を行います。
    • ビルド
      • Developer Command Prompt for VS 2019 を使用
      • Developer Command Prompt for VS 2019VSCodeを使用
      • MSYS2 を使用 ★おすすめ
    • リモートデバッグ
      • gdb コマンドを使用
      • gdbVSCode を使用 ★おすすめ
  • いくつかの方法を紹介しますが、以下の組合せが一番楽だと思います。(Visual Studioのインストール不要)
    • コーディング: VSCode
    • ビルド: MSYS2
    • リモートデバッグ: VSCode
  • リモートデバッグが不要な方は、前半の内容だけで大丈夫です

環境

  • 基本環境
    • Windows10 64-bit
    • Raspberry Pi Pico
      • リモートデバッグを試す場合は2台
  • その他
    • 手順毎に必要なツールは、都度記載します
    • ソースコード取得のためのgitは既にインストール済みとします
    • getting-started-with-pico.pdf にはpythonのインストールも必要と書いてありましたが、今回の内容だけであれば不要でした

情報源

その他

プロジェクトを用意する

プロジェクト構造を作成する

  • 適当な場所でGitBashを開き、ワークフォルダを作ります。その中に、pico-sdkをcloneします。
    • ワークフォルダ名をpico-work とします
      • その下に、実際に自分のソースコードなどを配置するフォルダを作ります。今回はpj_base とします
      • pj_base と同レベルの位置に、pico-sdk を配置します
    • ここでは、pico-sdkgit submodule として用います。他にも、cmake時に自動でダウンロードさせたり、完全にローカルで持つ方法もあります
  • pico-sdk を使うのに必要なファイル(pico_sdk_import.cmake )を自分のワークフォルダにコピーしておきます
  • また、その他必要な空ファイルだけ作っておきます
GitBash
mkdir pico-work && cd pico-work
git init
git submodule add https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk && git submodule update --init && cd ..
touch CMakeLists.txt
cp pico-sdk/external/pico_sdk_import.cmake .
mkdir pj_base && cd pj_base
touch CMakeLists.txt Main.cpp
構造
pico-work
├─CMakeLists.txt
├─pico_sdk_import.cmake
├─pico-sdk/
└─pj_base/
        CMakeLists.txt
        Main.cpp

CMakeとソースコードを用意する

本記事の主題は環境構築なので、ソースコード関係はとりあえずコピペしてください。
重要なポイントとして、getting-started-with-pico.pdf ではPICO_SDK_PATH の環境変数を設定する必要があると書かれています。ここではpico-sdkがどこにあるか既に知っているのでトップレベルのCMakeLists.txt内で指定しています。逆に、環境変数で設定されているとうまくいかないかもしれません。

pico-work/CMakeLists.txt
cmake_minimum_required(VERSION 3.12)

set(PICO_SDK_PATH ${CMAKE_CURRENT_LIST_DIR}/pico-sdk)
include(pico_sdk_import.cmake)

set(ProjectName "pico-work")
project(${ProjectName})
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()

add_subdirectory(pj_base)
pico-work/pj_base/CMakeLists.txt
set(BinName "pj_base")
add_executable(${BinName}
	Main.cpp
)

pico_enable_stdio_usb(${BinName} 1)
pico_enable_stdio_uart(${BinName} 1)

target_link_libraries(${BinName} pico_stdlib)
pico_add_extra_outputs(${BinName})
pico-work/pj_base/Main.cpp
#include <cstdint>
#include <cstdio>

#include "pico/stdlib.h"

int main() {
	stdio_init_all();
	const uint32_t LED_PIN = 25;
	gpio_init(LED_PIN);
	gpio_set_dir(LED_PIN, GPIO_OUT);

	while (true) {
		printf("Hello, world!\n");
		gpio_put(LED_PIN, 1);
		sleep_ms(250);
		gpio_put(LED_PIN, 0);
		sleep_ms(250);
	}

	return 0;
}

ビルド環境を構築する

Visual Studio 2019を使用する方法と、MSYSを使用する方法の2つを紹介します。どちらでもできることは同じはずですが、Visual Studio 2019を使用するのが正式な方法です。何か問題があったらVisual Studio 2019で正規の方法でも試すことをお勧めします。

ビルド環境を構築する (VS2019)

インストール

  • Visual Studio 2019
    • インストール時に、Windows 10 SDKも追加すること
  • ARM GCC
  • Windows用cmake
    • cmake.exe が格納されているbinディレクトリをパスに追加
    • 注意: 別途msys等をインストール済みで、msysの/usr/bin等にもパスが通っている場合には無効にしておく

ビルドする

  • Developer Command Prompt for VS 2019 を開き、pico-work を作成したフォルダに移動して下記コマンドを実行します
  • 成功したら、pico-work\build\pj_base\pj_base.uf2 が作られているはずです。これを、picoに書き込めばLEDがチカチカしながら、ターミナルに"Hello, world!" が出力されます。
VSCommandPrompt
cd C:\iwatake\devel\pico-work
mkdir build && cd build
cmake -G "NMake Makefiles" ..
nmake

ビルド環境を構築する (VS2019 + VSCode)

インストール

  • Visual Studio Code

    • 以下のエクステンションをインストール
      • ms-vscode.cpptools
      • ms-vscode.cmake-tools
  • VSCodeの設定

    • Manage (左下(ナビゲーションバーの左の歯車アイコン)) -> Settings -> Extensions -> CMake Tools configuration
      • Cmake: Generator
        • NMake Makefiles

ビルドする

  • Developer Command Prompt for VS 2019 を開き、code コマンドによってVSCodeを起動します
    • ★★★非常に重要です。通常の手順でVSCodeを起動するとビルドに失敗します
  • 起動したVSCodeでpico-work フォルダを開く。(フォルダをドラッグ&ドロップするのが楽)
  • ctrl+shift+pでコマンドパレットを開き、CMake: Configure
    • GCC for arm-none-eabi を選択
  • ctrl+shift+pでコマンドパレットを開き、CMake: Build
  • 成功したら、先ほどと同様にbuildフォルダの下にpj_base.uf2が作られます

その他

  • デフォルトだとCMakeLists.txtを編集するたびに自動的にconfigureされてしまいうざいので、VSCodeのsettingsからCmake: Configure On OpenCmake: Configure On Edit をoffにしておくといいと思います

ビルド環境を構築する (MSYS2)

インストール

ARM GCCについて

  • ARM GCCは、以下の2つの手順でインストール可能です
    • 公式手順書に記載のhttps://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads をダウンロードして、MSYSから参照する
      • MSYS2起動後、毎回以下コマンドを実行。または、.bashrc等に記載しておく
      • export PATH=/c/iwatake/tool/gcc-arm-none-eabi-10-2020-q4-major/bin:${PATH}
    • MSYS内でインストールする
      • pacman -S mingw-w64-x86_64-arm-none-eabi-gcc
  • おそらく、上記の2つはまぜるな危険です。どちらか一つの方法を選んでください。不安なら1個目の方法を使ってください。

ビルドする

  • MSYS2を起動し、pico-work を作成したフォルダに移動して下記コマンドを実行します
  • 成功したら、pico-work\build\pj_base\pj_base.uf2 が作られているはずです。
msys
# export PATH=/c/iwatake/tool/gcc-arm-none-eabi-10-2020-q4-major/bin:${PATH}
cd /c/iwatake/devel/pico-work
mkdir build && cd build
cmake .. -G "MSYS Makefiles" 
make

リモートデバッグ環境を構築する

基本的には、getting-started-with-pico.pdfの「Appendix A: Using Picoprobe」の通りです。

Picoprobeをビルドする

  • 本手順は1度だけ必要です
  • デバッガとして動作するRaspberry Pi Pico用のファームウェア(uf2)を作成します
  • ここでは、MSYS2を使ってビルドします。
  • ビルドに成功したら、picoprobe.uf2 というファイルが生成されるので、デバッガとして使用したいRaspberry Pi Picoに書き込みます。
  • 同じものを以下に配置しておきます
  • 本作業が終わったらpicoprobe フォルダは不要なので削除して大丈夫です
msys
# export PATH=/c/iwatake/tool/gcc-arm-none-eabi-10-2020-q4-major/bin:${PATH}
cd /c/iwatake/devel/pico-work
git clone https://github.com/raspberrypi/picoprobe.git
cd picoprobe
mkdir build && cd build
export PICO_SDK_PATH="../../pico-sdk"
cmake .. -G "MSYS Makefiles" 
make

ドライバをインストール

OpenOCDをビルドする

  • 本手順は1度だけ必要です

  • デバッガとして動作するRaspberry Pi Pico用と通信をする、OpenOCDをビルドします。ビルドにはMSYS2を使用します。

  • 以下のパッケージをインストールします。

    msys
     pacman -Syu
     pacman -Su
     pacman -S mingw-w64-x86_64-toolchain git make libtool pkg-config autoconf automake texinfo mingw-w64-x86_64-libusb
     # 全部default設定を選択 (Enter押すだけ)
    
  • 以下コマンドによってビルドします。

    msys
     git clone https://github.com/raspberrypi/openocd.git --branch picoprobe --depth=1
     cd openocd
     ./bootstrap
     ./configure --enable-picoprobe --disable-werror
     make -j4
    
  • 以下コマンドによってOpenOCDを起動します。

  • リモートデバッグ実行時は、事前に必ず起動しておくようにします。起動時のパスはどこでもいいです。起動後は放置して大丈夫です

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

ocd.jpg

デバッガとデバッグ対象のRaspberry Pi Picoを接続する

https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf より

wire.jpg

デバッグ用ビルドをする

  • ビルド時に、以下のオプションを付けてビルドします。無くても実行は出来ますが、ブレークポイントを張ったりできません。

    • CMAKE_BUILD_TYPE=Debug
      • デバッグ情報付加
    • PICO_DEOPTIMIZED_DEBUG=on
      • 最適化しない
  • MSYS2からビルドする場合は以下のようになります

    msys
     # export PATH=/c/iwatake/tool/gcc-arm-none-eabi-10-2020-q4-major/bin:${PATH}
     cmake .. -G "MSYS Makefiles"  -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=on
     make
    
  • Developer Command Prompt for VS 2019からビルドする場合は以下のようになります

    VSCommandPrompt
     cmake -G "NMake Makefiles" .. -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=on
     nmake
    

リモートデバッグする (gdbコマンド)

  • 上述の通り、MSYS2上でOpenOCDを起動しておきます。これとは別のMSYS2を開き、ビルドしたelfファイルがある場所で以下のようにデバッグが可能です。
msys
cd /c/iwatake/devel/pico-work/build/pj_base/
gdb-multiarch pj_base.elf

(gdb)
target remote localhost:3333
load
monitor reset init
b main
continue
n
n
n
quit

gdb.jpg

リモートデバッグする (VSCode)

インストール

  • Visual Studio Code
    • 以下のエクステンションをインストール
      • marus25.cortex-debug

準備

  • ワークフォルダをVSCodeで開きます (ビルドをしないでデバッグだけの場合は、普通に開いて大丈夫です)
  • .vscode フォルダがない場合は自分で作ります
    • TERMINAL上で、mkdir .vscode
  • 設定ファイルのひな形をダウンロードします
    • curl https://raw.githubusercontent.com/raspberrypi/pico-examples/master/ide/vscode/launch-remote-openocd.json -o .vscode/launch.json
    • curl https://raw.githubusercontent.com/raspberrypi/pico-examples/master/ide/vscode/settings.json -o .vscode/settings.json
  • ※上記コマンドは一例なので、どのようにダウンロードしても大丈夫です

launchファイルの修正

  • launch.json ファイルにデバッグ用の設定が記載されていますが、自分の環境に合わせて修正します。修正箇所は主に以下の通りです。
    • executable : elfファイル。トップレベルのCMakeLists.txtにadd_executableが含まれていたらそれが使用される模様。そうじゃないとエラーになるので、自分で指定する
    • gdbPath : gdb実行ファイルのパス。今回はmsysのgdbを指定するのでフルパスで指定する
    • gdbTarget : 別途msysで起動中のOpenOCDで設定したターゲットのURLとポートを指定する
    • svdFile : ハードウェア情報が記載されたファイルへの場所。デフォルトだと環境変数としてのPICO_SDK_PATH を使用しているので、ここも変更
  • 結果、以下のようになります。これは僕の環境の場合ですので、適宜変更をしてください。
launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Pico Debug",
            "type":"cortex-debug",
            "cwd": "${workspaceRoot}",
            // "executable": "${command:cmake.launchTargetPath}",
            "executable": "${workspaceRoot}/build/pj_base/pj_base.elf",
            "request": "launch",
            "servertype": "external",
            // This may need to be arm-none-eabi-gdb depending on your system
            "gdbPath" : "C:/msys64/mingw64/bin/gdb-multiarch.exe",
            // Connect to an already running OpenOCD instance
            "gdbTarget": "localhost:3333",
            "svdFile": "pico-sdk/src/rp2040/hardware_regs/rp2040.svd",
            "runToMain": true,
            // Work around for stopping at main on restart
            "postRestartCommands": [
                "break main",
                "continue"
            ]
        }
    ]
}

リモートデバッグする

F5キーを押すことで、デバッグが開始されます。自動的に、Main.cppのmain関数先頭でブレークポイントがかかって止まるはずです。
この場合も、別途OpenOCDを起動しておく必要があります。

vscode.jpg

おまけ

デバッグ線

僕はRaspberry Pi Picoの内1つはデバッガ専用とするため、デバッグ用配線は直接接続してみました。
ただ、ターゲットとなるRaspberry Pi PicoにもUSBを接続してUART (USB CDC)接続しようとしたら、上手く動きませんでした。

debug.jpg

RUN(Reset)ボタン

こんな感じにResetボタンを付けると便利です。

reset.jpg

自分用コマンドまとめ

[msys]
cd openocd
src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl

[vs]
mkdir build && cd build
cmake -G "NMake Makefiles" ..
cmake -G "NMake Makefiles" .. -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=on
nmake


[msys]
cmake .. -G "MSYS Makefiles" 
cmake .. -G "MSYS Makefiles"  -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=on
make
36
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?