やりたいこと
Raspberry Pi PicoのPlatformIOでの開発環境を作る。
pioasmも使えるようにする
PlatformIOのインストール
①VSCodeでExtentionを開く。
②検索バーに platformio を入力する。
③表示されたPlatformIO IDEを選択する。
④ Install を押す。
ラズベリーパイPicoへの接続
USBケーブルを接続する。
デバイスマネージャーに表示されていることを確認する。
(ポートは違うこともある)
「BOOTSEL」ボタンを押しながら接続してしまうと表示されないので注意する。
プロジェクトを作成する
①PlatformIOのアイコンをクリックする。
② Create New Project を選択する。
New Project を選択する。
①プロジェクト名を入力する。(ここでは「RPi_Pico_blink」)
② Board: に pico を入力する。
③出てきた候補の中から Raspberry Pi Pico を選択する。
図のとおり設定ができたら Finish をクリックする。
設定が完了するまで数分待つ。
図の内容が表示される。
「このフォルダー内のファイルの作成者を信頼しますか?」が表示されたら「はい」を選択する。
ファイルは
C:\Users\ユーザー\Documents\PlatformIO\Projects 内に作成される
ボード設定の書き換え
「Platform.ini」ファイルの内容を使用するボードを書き換えて、開発版の環境にする。
開発版の方が元のPlatformIOよりも更新されているため。
変更前
[env:pico]
platform = raspberrypi
board = pico
framework = arduino
変更後
[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = pico
framework = arduino
board_build.core = earlephilhower
「platformio.ini」に書き込むとプロジェクトの更新が始まるので完了するまで待つ。
30分ほどかかる。

RPi_Pico_blink\src\main.cpp を開く
以下を書き込む
#include <Arduino.h>
void setup() { // 初期設定(1回だけ実行)
pinMode(LED_BUILTIN, OUTPUT); // LED端子を出力に設定
}
void loop() { // メイン処理
digitalWrite(LED_BUILTIN, HIGH); // LEDを点灯
delay(500); // 0.5秒待つ
digitalWrite(LED_BUILTIN, LOW); // LEDを消灯
delay(500); // 0.5秒待つ
}
画面左下の [→] を押すことで書き込みする。
以下の表示が出たら書き込み成功
書き込みに失敗したとき
まず「BOOTSEL」ボタンを「押さずに」USBケーブルを挿し直して書き込めるか確認する。
書き込めなければ、
C:\Users\ユーザー\Documents\PlatformIO\Projects\RPi_Pico_blink\.pio\build\pico
にある「firmware.uf2」を「BOOTSEL」ボタンを押しながら接続したときに表示される「RPI-RP2」フォルダの中にコピーする。
Pico C SDKを使う
pioasmを使うためにPico C SDKを使う。
PlartformIOのプロジェクト作成時、Frameworkを Picosdk にして作成する。
MSYS2をダウンロード
msys2-x86_64-*.exe をダウンロード。
msys2をインストールする。
インストール先はデフォルトの C:\msys64 のまま。
VSCodeからMINGW64を開く
以下コマンドを入力。
pacman -Syu
ターミナルが落ちるので再度MINGW64で開く。
もう一度以下コマンドを入力。
pacman -Syu
ビルド環境をインストール。
pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-zlib
正しく入ったか確認。
which gcc
which cmake
which mingw32-make
ls /mingw64/bin/zlib1.dll
それぞれ以下が表示されればOK。
/mingw64/bin/gcc
/mingw64/bin/cmake
/mingw64/bin/mingw32-make
/mingw64/bin/zlib1.dll
pioasmのビルド
MINGW64を開いて以下を入力し、pioasmをビルドする
cd $USERPROFILE/.platformio/packages/framework-arduinopico/pico-sdk/tools/pioasm
cmake -S . -B build -G "MinGW Makefiles" -DPIOASM_VERSION_STRING="1.0.0"
cd build
mingw32-make all
PlatformIOの設定
platformio.ini に以下を書き込む。
[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = pico
framework = picosdk
extra_scripts = pre:scripts/pioasm.py
プロジェクトフォルダの直下に scripts というフォルダを作り、以下のファイルを作成する。
pioasm.py
import glob
import os.path
import pathlib
import sys
import warnings
Import("env") # type: ignore
PIO_FILES = glob.glob(os.path.join(env["PROJECT_SRC_DIR"], "*.pio"), recursive=True) # type: ignore
if len(PIO_FILES) != 0:
PIOASM_EXECUTABLE = (
pathlib.Path(env.PioPlatform().get_package_dir("framework-arduinopico")) # type: ignore
.joinpath("pico-sdk/tools/pioasm/build/")
.joinpath(f"pioasm{'.exe' if sys.platform.startswith('win') else ''}")
.resolve()
)
if PIOASM_EXECUTABLE.exists():
for filename in PIO_FILES:
env.Execute(f'"{PIOASM_EXECUTABLE}" -o c-sdk "{filename}" "{filename}.h"') # type: ignore
else:
warnings.warn(f'pioasm executable not found in "{PIOASM_EXECUTABLE}"', Warning)
128ns幅のパルスを出すコード
GP0ピンから128nsのパルス幅でクロックを出すコードを書く。
srcフォルダに以下のファイルを作成する。
toggle_128ns.pio
.program toggle_128ns
; GP0 を 128ns ごとに High/Low トグル(125MHz クロック前提)
.wrap_target
loop:
set pins, 1 [15] ; 1 + 15 = 16 サイクル ≒ 128ns High
set pins, 0 [15] ; 同じく 128ns Low
jmp loop
.wrap
% c-sdk {
#include "hardware/pio.h"
static inline void toggle_128ns_program_init(PIO pio, uint sm, uint offset, uint pin) {
pio_sm_config c = toggle_128ns_program_get_default_config(offset);
// 出力に使うピンを設定
sm_config_set_set_pins(&c, pin, 1);
// GPIO 初期化&方向
pio_gpio_init(pio, pin);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
// シフト設定(今回は特に使わない)
sm_config_set_out_shift(&c, false, false, 32);
// ステートマシン初期化
pio_sm_init(pio, sm, offset, &c);
}
%}
main.c
#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pio.h"
#include "toggle_128ns.pio.h"
int main() {
stdio_init_all();
PIO pio = pio0;
uint sm = 0;
uint offset = pio_add_program(pio, &toggle_128ns_program);
toggle_128ns_program_init(pio, sm, offset, 0);
pio_sm_set_enabled(pio, sm, true);
while (1) tight_loop_contents();
}
書き込むとパルスが出る。
200MHzにクロック上げる
125nsのパルス幅で出すためにクロックを上げて実行する。
src フォルダに以下にファイルを作成する。
toggle_125ns_200m.pio
.program toggle_125ns_200m
.wrap_target
loop:
set pins, 1 [24] ; 1 + 24 = 25 cycles = 125ns (200 MHz)
set pins, 0 [24]
jmp loop
.wrap
% c-sdk {
#include "hardware/pio.h"
static inline void toggle_125ns_200m_program_init(PIO pio, uint sm, uint offset, uint pin) {
pio_sm_config c = toggle_125ns_200m_program_get_default_config(offset);
// ピン設定
sm_config_set_set_pins(&c, pin, 1);
pio_gpio_init(pio, pin);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
// init
pio_sm_init(pio, sm, offset, &c);
}
%}
main.c
#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pio.h"
#include "toggle_125ns_200m.pio.h"
int main() {
stdio_init_all();
// 200MHz
set_sys_clock_khz(200000, true);
PIO pio = pio0;
uint sm = 0;
uint offset = pio_add_program(pio, &toggle_125ns_200m_program);
toggle_125ns_200m_program_init(pio, sm, offset, 0);
pio_sm_set_enabled(pio, sm, true);
while (1) tight_loop_contents();
}
書き込むとパルスが出る。
参考サイト
















