Raspberry Pi Pico 2に搭載されているRP2350向けに、Rustを使ったベアメタル開発の環境を、Mac(Appleシリコン搭載機)上に構築する手順となります。
ベアメタル開発とは?
WindowsやmacOSのような「OS」が存在しないまっさらなハードウェア(マイコン)に対して、直接プログラムを書き込んで動かす開発手法のことです。
RP2350はARMとRISC-Vという2つの頭脳(コア)を持つユニークなマイコンです。この記事では、メインとなるARMコア(Cortex-M33)をターゲットにしたRust環境のセットアップから、初めてのプログラム(Lチカ)を動かすまでを書いています。
対象環境
- macOS (Apple Silicon)
- ターミナル(Zsh)の基本的な操作ができること
1. 依存パッケージのインストール (Homebrew)
Rustのツール群を動かすために必要なライブラリを、Macのパッケージマネージャーである「Homebrew」で事前にインストールします。
brew install pkg-config libusb
実行結果
==> Auto-updating Homebrew...
Adjust how often this is run with `$HOMEBREW_AUTO_UPDATE_SECS` or disable with
`$HOMEBREW_NO_AUTO_UPDATE=1`. Hide these hints with `$HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> Auto-updated Homebrew!
Updated 3 taps (localstack/tap, homebrew/core and homebrew/cask).
==> New Formulae
==> Downloading https://formulae.brew.sh/api/formula.jws.json
actions-languageserver: Language server for GitHub Actions YAML files
auth0: Build, manage and test your Auth0 integrations from the command-line
beets: Music library manager and tagger
buffa: Pure-Rust Protocol Buffers implementation with editions support
civetweb: C/C++ embeddable web server with optional CGI, SSL and Lua support
coacd: Approximate convex decomposition for 3D meshes with collision-aware concavity
container2wasm: Container to WASM converter
cyclonedx-cli: Tool for analysis and manipulation of CycloneDX SBOMs
dbx-cli: Command-line interface for DBX database connections, schema, and safe queries
dbxcli: Command-line tool for Dropbox users and team admins
depsguard: Harden package manager configs against supply chain attacks
draw-things-cli: Local inference and LoRA training CLI for Draw Things
fakecloud: Free, open-source local AWS cloud emulator for integration testing
gcc@15: GNU compiler collection
gnhf: Autonomous agent orchestrator for long-running coding tasks
ip2location: C library and CLI to geolocate IP addresses
isponsorblocktv: SponsorBlock client for all YouTube TV clients
just-lsp: Language server for just
jwt-ui: TUI for decoding and encoding JWT tokens
liquidsoap: Audio and video streaming language
merman-cli: Mermaid.js, but headless, in Rust
mimo-code: AI coding agent with cross-session memory
minibwa: Successor of BWA-MEM for short-read alignment
msgvault: Archive a lifetime of email and chat with offline search and analytics
netwatch: Cross-platform realtime network diagnostics TUI
nvi2: Multibyte fork of the nvi editor for BSD
openturns: Probabilistic modelling and uncertainty quantification library
pdf.tocgen: CLI toolset to generate table of contents for PDF files automatically
pkgsite: Documentation server for Go packages
poppler-qt6: PDF rendering library (based on the xpdf-3.0 code base)
proton-pass-cli: Command-line interface for Proton Pass
pv-migrate: CLI tool to migrate or backup/restore Kubernetes persistent volumes
pypy3.11: Implementation of Python 3 in Python
redli: Humane alternative to redis-cli with TLS support
slint-compiler: Compiler for the Slint UI markup language
slint-cpp: C++ library and headers for the Slint UI toolkit
socktainer: Docker-compatible REST API on top of Apple container
splitrail: Real-time token usage tracker and cost monitor for CLI coding agents
swgp-go: Simple WireGuard proxy with minimal overhead for WireGuard traffic
taproom: Interactive TUI for Homebrew
tirith: Detect terminal injection, homograph, and pipe-to-shell attacks
tpack: Drop-in replacement for tmux-plugin-manager (tpm) with a TUI
ttl: Modern traceroute/mtr-style TUI with hop stats and ASN/geo enrichment
tubeup: Use yt-dlp to download video/metadata and upload to the Internet Archive
tuxedo: Fast, keyboard-driven terminal UI for todo.txt
unuran: UNU.RAN - Universal Non-Uniform RANdom number generator
vdt: Math library of fast, approximate and vectorisable trascendental functions
==> New Casks
==> Downloading https://formulae.brew.sh/api/cask.jws.json
8bitdo-firmware-updater: Firmware updater for 8BitDo controllers
altersend: Secure, peer-to-peer file transfer app
annotate: Keyboard-driven screen annotation tool
ariax: Aria2 download manager
atoll: Dynamic Island for the MacBook notch
baseline: Automate onboardings by installing apps and running scripts
bettercmdtab: Replacement for the built-in Cmd+Tab app switcher
brave-origin: Privacy-focused web browser
brave-origin@beta: Privacy-focused web browser
brave-origin@nightly: Privacy-focused web browser
clarify: Autonomous CRM
cotypist: System-wide AI autocomplete
ctivo: Download and convert Tivo shows
flow5: Potential flow solver for preliminary aerodynamic and hydrofoil design
font-paperlogy
font-yuyu
font-yuyu-short
go2tv: Cast media files to Smart TVs and Chromecast devices
greensignal: Pre-call check for camera, microphone, speaker, and network quality
kde-connect: Communicate with your handheld devices
meta-quest-remote-desktop: Remote desktop companion app for Meta Quest headsets
navigator: Companion app for ZSA's Navigator trackpad
open-design: Local-first, agent-native design tool
palmier-pro: Video Editor built for AI
platinum-notes: Improve audio quality of music files
pycharm-oss: Open-source edition of PyCharm
r-rig-app: R Installation Manager
radix: Disk space analyzer
seekfast: Search text in documents and files
silkypix-developer-studio-se: RAW image development software used with Panasonic products
snippety: Snippet manager & text expander
supaterm: Terminal emulator with built-in agent automation
sxitch: Tree based app switcher
tikz-editor: WYSIWYG editor for TikZ diagrams in LaTeX
tunarr: Create your own live TV channels from media on Plex, Jellyfin, Emby
typewhisper: Speech-to-text and AI text processing
You have 47 outdated formulae and 10 outdated casks installed.
Warning: pkgconf 2.5.1 is already installed and up-to-date.
To reinstall 2.5.1, run:
brew reinstall pkgconf
libusb 1.0.29 is already installed but outdated (so it will be upgraded).
Warning: The following taps are not trusted:
localstack/tap
Homebrew is currently ignoring formulae, casks and commands from these taps because tap trust is required.
Prefer trusting only the specific formulae, casks or commands you need.
Trust installed formulae from these taps with:
brew trust --formula localstack/tap/localstack-cli
Trust other specific casks and commands with:
brew trust --cask <user>/<tap>/<cask>
brew trust --command <user>/<tap>/<command>
Whole-tap trust is broader and includes all current and future formulae,
casks and commands from the listed taps. Trust whole taps with:
brew trust localstack/tap
Untap them with:
brew untap localstack/tap
To disable trust checks:
export HOMEBREW_NO_REQUIRE_TAP_TRUST=1
This is not recommended and will be removed in a later release.
For more information, see:
https://docs.brew.sh/Tap-Trust
==> Would install 1 formula:
libusb
==> Downloading https://ghcr.io/v2/homebrew/core/libusb/manifests/1.0.30
##################################################################################################################### 100.0%
==> Would upgrade 1 dependent of upgraded formula:
Disable this behaviour by setting `HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
qemu 10.1.0 -> 11.0.1
==> Do you want to proceed with the installation? [y/n]
==> Fetching downloads for: libusb
✔︎ Bottle libusb (1.0.30) Downloaded 192.2KB/192.2KB
==> Upgrading libusb
1.0.29 -> 1.0.30
==> Pouring libusb--1.0.30.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/libusb/1.0.30: 23 files, 639.3KB
==> Running `brew cleanup libusb`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
Removing: /opt/homebrew/Cellar/libusb/1.0.29... (23 files, 643.7KB)
==> Upgrading 1 dependent of upgraded formula:
qemu 10.1.0 -> 11.0.1
✔︎ Bottle Manifest qemu (11.0.1) Downloaded 65.8KB/ 65.8KB
==> Fetching downloads for: qemu
✔︎ Bottle Manifest capstone (5.0.9) Downloaded 9.0KB/ 9.0KB
✔︎ Bottle Manifest dtc (1.8.1) Downloaded 9.2KB/ 9.2KB
✔︎ Bottle Manifest glib (2.88.2) Downloaded 20.9KB/ 20.9KB
✔︎ Bottle Manifest libtasn1 (4.21.0) Downloaded 7.9KB/ 7.9KB
✔︎ Bottle Manifest nettle (4.0) Downloaded 9.4KB/ 9.4KB
✔︎ Bottle libtasn1 (4.21.0) Downloaded 165.3KB/165.3KB
✔︎ Bottle Manifest p11-kit (0.26.2) Downloaded 10.0KB/ 10.0KB
✔︎ Bottle Manifest gnutls (3.8.13_2) Downloaded 16.6KB/ 16.6KB
✔︎ Bottle dtc (1.8.1) Downloaded 145.6KB/145.6KB
✔︎ Bottle Manifest jpeg-turbo (3.1.4.1) Downloaded 8.4KB/ 8.4KB
✔︎ Bottle Manifest libpng (1.6.58) Downloaded 8.6KB/ 8.6KB
✔︎ Bottle Manifest libslirp (4.9.3) Downloaded 17.0KB/ 17.0KB
✔︎ Bottle p11-kit (0.26.2) Downloaded 992.2KB/992.2KB
✔︎ Bottle Manifest libssh (0.12.0_1) Downloaded 9.5KB/ 9.5KB
✔︎ Bottle capstone (5.0.9) Downloaded 3.3MB/ 3.3MB
✔︎ Bottle Manifest ncurses (6.6) Downloaded 11.9KB/ 11.9KB
✔︎ Bottle jpeg-turbo (3.1.4.1) Downloaded 1.1MB/ 1.1MB
✔︎ Bottle libpng (1.6.58) Downloaded 459.8KB/459.8KB
✔︎ Bottle libssh (0.12.0_1) Downloaded 611.8KB/611.8KB
✔︎ Bottle nettle (4.0) Downloaded 990.8KB/990.8KB
✔︎ Bottle libslirp (4.9.3) Downloaded 159.5KB/159.5KB
✔︎ Bottle glib (2.88.2) Downloaded 9.3MB/ 9.3MB
✔︎ Bottle ncurses (6.6) Downloaded 2.5MB/ 2.5MB
✔︎ Bottle gnutls (3.8.13_2) Downloaded 3.0MB/ 3.0MB
✔︎ Bottle qemu (11.0.1) Downloaded 107.6MB/107.6MB
==> Upgrading qemu
10.1.0 -> 11.0.1
==> Installing dependencies for qemu: capstone ↑, dtc ↑, glib ↑, libtasn1 ↑, nettle ↑, p11-kit ↑, gnutls ↑, jpeg-turbo ↑, libpng ↑, libslirp ↑, libssh ↑ and ncurses ↑
==> Installing qemu dependency: capstone
==> Pouring capstone--5.0.9.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/capstone/5.0.9: 31 files, 23.4MB
==> Installing qemu dependency: dtc
==> Pouring dtc--1.8.1.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/dtc/1.8.1: 19 files, 676.3KB
==> Installing qemu dependency: glib
==> Pouring glib--2.88.2.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/glib/2.88.2: 506 files, 39.9MB
==> Installing qemu dependency: libtasn1
==> Pouring libtasn1--4.21.0.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/libtasn1/4.21.0: 64 files, 722.4KB
==> Installing qemu dependency: nettle
==> Pouring nettle--4.0.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/nettle/4.0: 93 files, 2.9MB
==> Installing qemu dependency: p11-kit
==> Pouring p11-kit--0.26.2.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/p11-kit/0.26.2: 33 files, 4.9MB
==> Installing qemu dependency: gnutls
==> Pouring gnutls--3.8.13_2.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/gnutls/3.8.13_2: 1,289 files, 11.2MB
==> Installing qemu dependency: jpeg-turbo
==> Pouring jpeg-turbo--3.1.4.1.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/jpeg-turbo/3.1.4.1: 47 files, 3.7MB
==> Installing qemu dependency: libpng
==> Pouring libpng--1.6.58.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/libpng/1.6.58: 28 files, 1.4MB
==> Installing qemu dependency: libslirp
==> Pouring libslirp--4.9.3.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/libslirp/4.9.3: 13 files, 437.8KB
==> Installing qemu dependency: libssh
==> Pouring libssh--0.12.0_1.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/libssh/0.12.0_1: 25 files, 1.7MB
==> Installing qemu dependency: ncurses
==> Pouring ncurses--6.6.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/ncurses/6.6: 4,086 files, 10.5MB
==> Installing qemu
==> Pouring qemu--11.0.1.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/qemu/11.0.1: 169 files, 711.9MB
==> Running `brew cleanup qemu`...
Removing: /opt/homebrew/Cellar/qemu/10.1.0... (170 files, 710.3MB)
2. Rustツールチェーンのインストール
Rustの開発に必要な基本ツール(rustup, cargo, rustcなど)をインストールします。
Cargo(カーゴ)とは?
Rustの公式パッケージマネージャー兼ビルドツールです。ライブラリのダウンロードからコンパイルまで全て管理してくれます。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
実行結果
info: downloading installer
warn: It looks like you have an existing rustup settings file at:
warn: /Users/nomura/.rustup/settings.toml
warn: Rustup will install the default toolchain as specified in the settings file,
warn: instead of the one inferred from the default host triple.
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:
/Users/nomura/.rustup
This can be modified with the RUSTUP_HOME environment variable.
The Cargo home directory is located at:
/Users/nomura/.cargo
This can be modified with the CARGO_HOME environment variable.
The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:
/Users/nomura/.cargo/bin
This path will then be added to your PATH environment variable by
modifying the profile files located at:
/Users/nomura/.profile
/Users/nomura/.bash_profile
/Users/nomura/.bashrc
/Users/nomura/.zshenv
/Users/nomura/.tcshrc
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: aarch64-apple-darwin
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>
info: profile set to default
info: default host triple is aarch64-apple-darwin
warn: Updating existing toolchain, profile choice will be ignored
info: syncing channel updates for stable-aarch64-apple-darwin
info: default toolchain set to stable-aarch64-apple-darwin
stable-aarch64-apple-darwin unchanged - rustc 1.96.0 (ac68faa20 2026-05-25)
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.
This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env" # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish" # For fish
source "~/.cargo/env.nu" # For nushell
source "$HOME/.cargo/env.tcsh" # For tcsh
. "$HOME/.cargo/env.ps1" # For pwsh
source "$HOME/.cargo/env.xsh" # For xonsh
インストールが完了したら、ターミナルを再起動するか source $HOME/.cargo/env を実行して、コマンドを使えるようにします。
3. RP2350用ターゲットの追加
Rustのプログラムを、Mac用ではなく「RP2350のARMコア(Cortex-M33)」向けに翻訳(クロスコンパイル)するための設定を追加します。
rustup target add thumbv8m.main-none-eabihf
実行結果
info: downloading component rust-std
rust-std installed 12.24 MiB
4. 組み込み開発用CLIツールのインストール
次に、マイコン開発に必須となる便利なツールをインストールします。
書き込みツール(picotool)のインストール
まず、このツールが何をするのかを理解しておきましょう。
| 用語 | 解説 |
|---|---|
| ELF | パソコン上でプログラムをコンパイルした直後にできる実行ファイル。マイコンはこの形式を直接理解できません。 |
| UF2 | USB経由でマイコンにプログラムを書き込むための形式。Pico 2はパソコンに繋ぐとUSBメモリのように見え、このUF2ファイルをドラッグ&ドロップするだけで書き込めます。 |
picotool は、Raspberry Pi公式の書き込みツールです。コンパイル後のELFファイルを
直接Pico 2に転送します。
この後利用するrp235x-project-template では、このツールがデフォルトの
書き込み手段として設定されています。
brew install picotool
実行結果
✔︎ JSON API packages.arm64_tahoe.jws.json Downloaded 15.2MB/ 15.2MB
Warning: The following taps are not trusted:
localstack/tap
Homebrew is currently ignoring formulae, casks and commands from these taps because tap trust is required.
Prefer trusting only the specific formulae, casks or commands you need.
Trust installed formulae from these taps with:
brew trust --formula localstack/tap/localstack-cli
Trust other specific casks and commands with:
brew trust --cask <user>/<tap>/<cask>
brew trust --command <user>/<tap>/<command>
Whole-tap trust is broader and includes all current and future formulae,
casks and commands from the listed taps. Trust whole taps with:
brew trust localstack/tap
Untap them with:
brew untap localstack/tap
To disable trust checks:
export HOMEBREW_NO_REQUIRE_TAP_TRUST=1
This is not recommended and will be removed in a later release.
For more information, see:
https://docs.brew.sh/Tap-Trust
==> Would install 1 formula:
picotool
==> Downloading https://ghcr.io/v2/homebrew/core/picotool/manifests/2.2.0
##################################################################################################################### 100.0%
==> Fetching downloads for: picotool
✔︎ Bottle picotool (2.2.0) Downloaded 621.2KB/621.2KB
==> Pouring picotool--2.2.0.arm64_tahoe.bottle.tar.gz
🍺 /opt/homebrew/Cellar/picotool/2.2.0: 14 files, 2.5MB
==> Running `brew cleanup picotool`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
リンカツールのインストール
続いて、flip-link をインストールします。このツールが必要な理由を先に確認しておきましょう。
| 用語 | 解説 |
|---|---|
| スタックオーバーフロー | プログラムが一時的なデータ保存領域(スタック)を使い果たし、溢れてしまうこと。OSがない環境ではシステム全体の暴走を引き起こします。 |
| リンカ | 複数のプログラムの断片を1つの実行ファイルに結合するツール。 |
パソコン向けのプログラムと違い、OSを持たないマイコンではスタックが溢れてもエラー画面が出ず、他のデータを破壊して暴走してしまいます。flip-link はプログラムのメモリ配置を工夫することで、この問題を安全に検知できるようにしてくれます。
cargo install flip-link
実行結果
Updating crates.io index
Downloaded flip-link v0.1.12
Downloaded 1 crate (27.8KiB) in 0.08s
Installing flip-link v0.1.12
Updating crates.io index
Locking 14 packages to latest compatible versions
Adding evalexpr v12.0.3 (available: v13.1.0)
Adding getrandom v0.2.17 (available: v0.4.3)
Adding object v0.35.0 (available: v0.39.1)
Downloaded env_filter v2.0.0
Downloaded getrandom v0.2.17
Downloaded env_logger v0.11.11
Downloaded aho-corasick v1.1.4
Downloaded log v0.4.33
Downloaded evalexpr v12.0.3
Downloaded regex v1.12.4
Downloaded object v0.35.0
Downloaded regex-syntax v0.8.11
Downloaded regex-automata v0.4.14
Downloaded 10 crates (1.8MiB) in 0.19s
Compiling libc v0.2.186
Compiling log v0.4.33
Compiling cfg-if v1.0.4
Compiling memchr v2.8.2
Compiling evalexpr v12.0.3
Compiling env_filter v2.0.0
Compiling env_logger v0.11.11
Compiling object v0.35.0
Compiling getrandom v0.2.17
Compiling flip-link v0.1.12
Finished `release` profile [optimized] target(s) in 3.63s
Installing /Users/nomura/.cargo/bin/flip-link
Installed package `flip-link v0.1.12` (executable `flip-link`)
高度なデバッグを行いたい場合(任意)
デバッガを使ってプログラムを1行ずつ止めながら確認したい場合は probe-rs が便利です。現時点ではHomebrew経由ではなく、以下の公式スクリプトでインストールします。
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.sh | sh
実行結果
```bash: downloading probe-rs-tools 0.31.0 aarch64-apple-darwin installing to /Users/nomura/.cargo/bin cargo-embed cargo-flash probe-rs everything's installed! ```5. プロジェクトの作成とLチカ(LED点滅)
環境が整ったので、RP2350用のプロジェクトを作成します。
マイコン開発では初期設定が複雑なため、コミュニティが用意してくれたテンプレートから始めるのが一般的です。
まず、テンプレートからプロジェクトを作成するツールをインストールします。
cargo install cargo-generate
実行結果
Updating crates.io index
Downloaded cargo-generate v0.23.12
Downloaded 1 crate (124.2KiB) in 0.08s
Installing cargo-generate v0.23.12
Updating crates.io index
Locking 270 packages to latest compatible versions
Adding cargo-util-schemas v0.13.0 (available: v0.14.0)
Adding generic-array v0.14.7 (available: v0.14.9)
Adding gix-config v0.56.0 (available: v0.58.0)
Downloaded anymap2 v0.13.0
Downloaded once_cell v1.21.4
Downloaded anyhow v1.0.103
Downloaded tinystr v0.8.3
Downloaded zeroize v1.9.0
Downloaded potential_utf v0.1.5
Downloaded pkg-config v0.3.33
Downloaded serde-value v0.7.0
Downloaded ordered-float v2.10.1
Downloaded stable_deref_trait v1.2.1
Downloaded option-ext v0.2.0
Downloaded ppv-lite86 v0.2.21
Downloaded gix-sec v0.14.1
Downloaded time-core v0.1.9
Downloaded itoa v1.0.18
Downloaded cvt v0.1.2
Downloaded block-buffer v0.10.4
Downloaded zerofrom-derive v0.1.7
Downloaded terminal-prompt v0.2.3
Downloaded sha1 v0.10.6
Downloaded rand_chacha v0.3.1
Downloaded terminal_size v0.4.4
Downloaded same-file v1.0.6
Downloaded powerfmt v0.2.0
Downloaded gix-validate v0.11.2
Downloaded gix-hashtable v0.15.2
Downloaded form_urlencoded v1.2.2
Downloaded tinyvec_macros v0.1.1
Downloaded zerovec-derive v0.11.3
Downloaded toml_datetime v1.1.1+spec-1.1.0
Downloaded pest_meta v2.8.6
Downloaded yoke v0.8.3
Downloaded toml v0.9.12+spec-1.1.0
Downloaded serde_derive v1.0.228
Downloaded zerotrie v0.2.4
Downloaded unicode-segmentation v1.13.3
Downloaded prodash v31.0.0
Downloaded zerovec v0.11.6
Downloaded unicode-normalization v0.1.25
Downloaded winnow v1.0.3
Downloaded portable-atomic v1.13.1
Downloaded jiff-static v0.2.29
Downloaded vcpkg v0.2.15
Downloaded time v0.3.51
Downloaded idna v1.1.0
Downloaded icu_properties_data v2.2.0
Downloaded unicode-width v0.2.2
Downloaded hashbrown v0.17.1
Downloaded rhai v1.25.1
Downloaded git2 v0.21.0
Downloaded rustix v1.1.4
Downloaded nix v0.29.0
Downloaded itertools v0.14.0
Downloaded indexmap v2.14.0
Downloaded bstr v1.12.3
Downloaded icu_collections v2.2.0
Downloaded icu_properties v2.2.0
Downloaded gix-config v0.56.0
Downloaded cc v1.2.65
Downloaded ignore v0.4.26
Downloaded icu_normalizer_data v2.2.0
Downloaded icu_normalizer v2.2.0
Downloaded icu_locale_core v2.2.0
Downloaded heapless v0.8.0
Downloaded gix-ref v0.63.0
Downloaded openssl-sys v0.9.117
Downloaded liquid-core v0.26.11
Downloaded libssh2-sys v0.3.1
Downloaded indicatif v0.18.4
Downloaded pest v2.8.6
Downloaded icu_provider v2.2.0
Downloaded getrandom v0.4.3
Downloaded sha1-checked v0.10.0
Downloaded find-msvc-tools v0.1.9
Downloaded gix-fs v0.21.2
Downloaded getrandom v0.3.4
Downloaded digest v0.10.7
Downloaded jiff v0.2.29
Downloaded typenum v1.20.1
Downloaded serde v1.0.228
Downloaded rand v0.8.6
Downloaded num-traits v0.2.19
Downloaded gix-object v0.60.0
Downloaded ahash v0.8.12
Downloaded url v2.5.8
Downloaded libz-sys v1.1.29
Downloaded toml v1.1.2+spec-1.1.0
Downloaded tinyvec v1.11.0
Downloaded names v0.14.0
Downloaded fs_at v0.2.1
Downloaded serde_core v1.0.228
Downloaded pest_derive v2.8.6
Downloaded parking_lot v0.12.5
Downloaded gix-path v0.12.1
Downloaded gix-features v0.48.1
Downloaded thin-vec v0.2.18
Downloaded tempfile v3.27.0
Downloaded smallvec v1.15.2
Downloaded rhai_codegen v3.2.0
Downloaded ucd-trie v0.1.7
Downloaded toml_parser v1.1.2+spec-1.1.0
Downloaded time-macros v0.2.30
Downloaded semver v1.0.28
Downloaded toml_datetime v0.7.5+spec-1.1.0
Downloaded tiny-keccak v2.0.2
Downloaded thiserror-impl v2.0.18
Downloaded synstructure v0.13.2
Downloaded smartstring v1.0.1
Downloaded shlex v2.0.1
Downloaded shell-words v1.1.1
Downloaded sha2 v0.10.9
Downloaded serde-untagged v0.1.9
Downloaded remove_dir_all v1.0.0
Downloaded rand_core v0.6.4
Downloaded proc-macro-error2 v2.0.1
Downloaded pest_generator v2.8.6
Downloaded percent-encoding v2.3.2
Downloaded pastey v0.2.3
Downloaded parking_lot_core v0.9.12
Downloaded normpath v1.5.1
Downloaded memmap2 v0.9.11
Downloaded litemap v0.8.2
Downloaded liquid-lib v0.26.11
Downloaded globset v0.4.18
Downloaded gix-tempfile v23.0.2
Downloaded gix-error v0.2.4
Downloaded fs-err v3.3.0
Downloaded erased-serde v0.4.10
Downloaded displaydoc v0.2.6
Downloaded dialoguer v0.12.0
Downloaded defmt-macros v1.1.0
Downloaded defmt v1.1.0
Downloaded console v0.16.3
Downloaded cargo-util-schemas v0.13.0
Downloaded byteorder v1.5.0
Downloaded autocfg v1.5.1
Downloaded auth-git2 v0.6.0
Downloaded zerofrom v0.1.8
Downloaded libgit2-sys v0.18.5+1.9.4
Downloaded yoke-derive v0.8.2
Downloaded writeable v0.6.3
Downloaded walkdir v2.5.0
Downloaded version_check v0.9.5
Downloaded utf8_iter v1.0.4
Downloaded unit-prefix v0.5.2
Downloaded unicode-bom v2.0.3
Downloaded typeid v1.0.3
Downloaded toml_writer v1.1.1+spec-1.1.0
Downloaded thiserror v2.0.18
Downloaded serde_spanned v1.1.1
Downloaded sanitize-filename v0.6.0
Downloaded num-conv v0.2.2
Downloaded lock_api v0.4.14
Downloaded liquid-derive v0.26.10
Downloaded liquid v0.26.11
Downloaded kstring v2.0.2
Downloaded gix-utils v0.3.3
Downloaded gix-trace v0.1.20
Downloaded gix-hash v0.25.1
Downloaded gix-glob v0.26.1
Downloaded gix-date v0.15.5
Downloaded fastrand v2.4.1
Downloaded deranged v0.5.8
Downloaded gix-lock v23.0.1
Downloaded gix-config-value v0.18.1
Downloaded errno v0.3.14
Downloaded equivalent v1.0.2
Downloaded dirs-sys v0.5.0
Downloaded idna_adapter v1.2.2
Downloaded home v0.5.12
Downloaded generic-array v0.14.7
Downloaded faster-hex v0.10.0
Downloaded hash32 v0.3.1
Downloaded dirs v6.0.0
Downloaded crypto-common v0.1.7
Downloaded crunchy v0.2.4
Downloaded cpufeatures v0.2.17
Downloaded const-random-macro v0.1.16
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded jobserver v0.1.34
Downloaded gix-actor v0.41.1
Downloaded defmt-parser v1.0.0
Downloaded const-random v0.1.18
Downloaded 183 crates (13.2MiB) in 1.47s (largest was `libgit2-sys` at 1.8MiB)
Compiling proc-macro2 v1.0.106
Compiling quote v1.0.46
Compiling unicode-ident v1.0.24
Compiling libc v0.2.186
Compiling cfg-if v1.0.4
Compiling memchr v2.8.2
Compiling regex-syntax v0.8.11
Compiling serde_core v1.0.228
Compiling stable_deref_trait v1.2.1
Compiling smallvec v1.15.2
Compiling version_check v0.9.5
Compiling bitflags v2.13.0
Compiling thiserror v2.0.18
Compiling find-msvc-tools v0.1.9
Compiling shlex v2.0.1
Compiling aho-corasick v1.1.4
Compiling parking_lot_core v0.9.12
Compiling pkg-config v0.3.33
Compiling autocfg v1.5.1
Compiling scopeguard v1.2.0
Compiling fastrand v2.4.1
Compiling tinyvec_macros v0.1.1
Compiling tinyvec v1.11.0
Compiling lock_api v0.4.14
Compiling generic-array v0.14.7
Compiling vcpkg v0.2.15
Compiling portable-atomic v1.13.1
Compiling regex-automata v0.4.14
Compiling same-file v1.0.6
Compiling syn v2.0.118
Compiling gix-trace v0.1.20
Compiling walkdir v2.5.0
Compiling jobserver v0.1.34
Compiling parking_lot v0.12.5
Compiling cc v1.2.65
Compiling unicode-normalization v0.1.25
Compiling rustix v1.1.4
Compiling typenum v1.20.1
Compiling prodash v31.0.0
Compiling gix-utils v0.3.3
Compiling errno v0.3.14
Compiling litemap v0.8.2
Compiling writeable v0.6.3
Compiling icu_normalizer_data v2.2.0
Compiling utf8_iter v1.0.4
Compiling icu_properties_data v2.2.0
Compiling once_cell v1.21.4
Compiling serde v1.0.228
Compiling crypto-common v0.1.7
Compiling block-buffer v0.10.4
Compiling openssl-sys v0.9.117
Compiling libz-sys v1.1.29
Compiling zerocopy v0.8.52
Compiling getrandom v0.4.3
Compiling heapless v0.8.0
Compiling byteorder v1.5.0
Compiling hash32 v0.3.1
Compiling bstr v1.12.3
Compiling digest v0.10.7
Compiling synstructure v0.13.2
Compiling gix-validate v0.11.2
Compiling jiff v0.2.29
Compiling cpufeatures v0.2.17
Compiling crunchy v0.2.4
Compiling ucd-trie v0.1.7
Compiling percent-encoding v2.3.2
Compiling pest v2.8.6
Compiling sha1 v0.10.6
Compiling zerofrom-derive v0.1.7
Compiling yoke-derive v0.8.2
Compiling thiserror-impl v2.0.18
Compiling zerovec-derive v0.11.3
Compiling displaydoc v0.2.6
Compiling serde_derive v1.0.228
Compiling regex v1.12.4
Compiling zerofrom v0.1.8
Compiling libssh2-sys v0.3.1
Compiling num-traits v0.2.19
Compiling static_assertions v1.1.0
Compiling log v0.4.33
Compiling yoke v0.8.3
Compiling tiny-keccak v2.0.2
Compiling hashbrown v0.17.1
Compiling gix-path v0.12.1
Compiling zerovec v0.11.6
Compiling zerotrie v0.2.4
Compiling gix-features v0.48.1
Compiling tempfile v3.27.0
Compiling pest_meta v2.8.6
Compiling faster-hex v0.10.0
Compiling sha1-checked v0.10.0
Compiling gix-error v0.2.4
Compiling num-conv v0.2.2
Compiling utf8parse v0.2.2
Compiling typeid v1.0.3
Compiling crossbeam-utils v0.8.21
Compiling itoa v1.0.18
Compiling cfg_aliases v0.2.1
Compiling time-core v0.1.9
Compiling gix-date v0.15.5
Compiling time-macros v0.2.30
Compiling nix v0.29.0
Compiling getrandom v0.2.17
Compiling pest_generator v2.8.6
Compiling anstyle-parse v1.0.0
Compiling gix-hash v0.25.1
Compiling gix-fs v0.21.2
Compiling tinystr v0.8.3
Compiling potential_utf v0.1.5
Compiling icu_locale_core v2.2.0
Compiling icu_collections v2.2.0
Compiling form_urlencoded v1.2.2
Compiling libgit2-sys v0.18.5+1.9.4
Compiling colorchoice v1.0.5
Compiling powerfmt v0.2.0
Compiling either v1.16.0
Compiling deranged v0.5.8
Compiling erased-serde v0.4.10
Compiling is_terminal_polyfill v1.70.2
Compiling anstyle v1.0.14
Compiling anstyle-query v1.1.5
Compiling getrandom v0.3.4
Compiling icu_provider v2.2.0
Compiling itertools v0.14.0
Compiling anstream v1.0.0
Compiling icu_normalizer v2.2.0
Compiling icu_properties v2.2.0
Compiling const-random-macro v0.1.16
Compiling rand_core v0.6.4
Compiling kstring v2.0.2
Compiling time v0.3.51
Compiling pest_derive v2.8.6
Compiling gix-tempfile v23.0.2
Compiling gix-hashtable v0.15.2
Compiling idna_adapter v1.2.2
Compiling idna v1.1.0
Compiling gix-actor v0.41.1
Compiling ppv-lite86 v0.2.21
Compiling liquid-derive v0.26.10
Compiling serde_spanned v1.1.1
Compiling smartstring v1.0.1
Compiling url v2.5.8
Compiling ahash v0.8.12
Compiling unicode-width v0.2.2
Compiling anymap2 v0.13.0
Compiling option-ext v0.2.0
Compiling dirs-sys v0.5.0
Compiling console v0.16.3
Compiling rand_chacha v0.3.1
Compiling gix-object v0.60.0
Compiling crossbeam-epoch v0.9.18
Compiling gix-lock v23.0.1
Compiling const-random v0.1.18
Compiling ordered-float v2.10.1
Compiling terminal_size v0.4.4
Compiling toml_datetime v0.7.5+spec-1.1.0
Compiling memmap2 v0.9.11
Compiling fs-err v3.3.0
Compiling cvt v0.1.2
Compiling clap_lex v1.1.0
Compiling heck v0.5.0
Compiling winnow v1.0.3
Compiling liquid-core v0.26.11
Compiling strsim v0.11.1
Compiling names v0.14.0
Compiling unicode-segmentation v1.13.3
Compiling equivalent v1.0.2
Compiling anyhow v1.0.103
Compiling clap_builder v4.6.0
Compiling toml_parser v1.1.2+spec-1.1.0
Compiling indexmap v2.14.0
Compiling clap_derive v4.6.1
Compiling toml v0.9.12+spec-1.1.0
Compiling gix-ref v0.63.0
Compiling serde-value v0.7.0
Compiling fs_at v0.2.1
Compiling serde-untagged v0.1.9
Compiling crossbeam-deque v0.8.6
Compiling rand v0.8.6
Compiling dirs v6.0.0
Compiling gix-glob v0.26.1
Compiling gix-config-value v0.18.1
Compiling globset v0.4.18
Compiling env_filter v2.0.0
Compiling liquid-lib v0.26.11
Compiling rhai_codegen v3.2.0
Compiling semver v1.0.28
Compiling toml_datetime v1.1.1+spec-1.1.0
Compiling gix-sec v0.14.1
Compiling terminal-prompt v0.2.3
Compiling shell-words v1.1.1
Compiling unit-prefix v0.5.2
Compiling normpath v1.5.1
Compiling toml_writer v1.1.1+spec-1.1.0
Compiling zeroize v1.9.0
Compiling unicode-bom v2.0.3
Compiling thin-vec v0.2.18
Compiling gix-config v0.56.0
Compiling dialoguer v0.12.0
Compiling toml v1.1.2+spec-1.1.0
Compiling rhai v1.25.1
Compiling remove_dir_all v1.0.0
Compiling cargo-util-schemas v0.13.0
Compiling liquid v0.26.11
Compiling indicatif v0.18.4
Compiling clap v4.6.1
Compiling ignore v0.4.26
Compiling env_logger v0.11.11
Compiling sanitize-filename v0.6.0
Compiling pastey v0.2.3
Compiling home v0.5.12
Compiling git2 v0.21.0
Compiling auth-git2 v0.6.0
Compiling cargo-generate v0.23.12
Finished `release` profile [optimized] target(s) in 2m 31s
Installing /Users/nomura/.cargo/bin/cargo-generate
Installed package `cargo-generate v0.23.12` (executable `cargo-generate`)
次に、以下のコマンドでプロジェクトを作成します。
cargo generate --git https://github.com/rp-rs/rp235x-project-template --name my-pico2-rp-hal
テンプレートのURLについて
上記のURLは記事執筆時点のものです。テンプレートは現在も活発に更新されているため、リンク切れや構成変更が起きる可能性があります。その場合は rp-hal の GitHubリポジトリ のREADMEから最新の「RP235x Project Template」のリンクを参照してください。
対話形式でいくつか質問されますが、基本的にはデフォルト(Enterキー)で進めて大丈夫です。
書き込み方法を聞かれたら(Which flashing method do you intend to use?)、picotool を選択してください。
実行結果
% cargo generate --git https://github.com/rp-rs/rp235x-project-template --name my-pico2-rp-hal
🔧 Destination: /Users/nomura/rust/my-pico2-rp-hal ...
🔧 project-name: my-pico2-rp-hal ...
🔧 Generating template ...
✔ 🤷 Which flashing method do you intend to use? · picotool
[ 1/20] Done: .cargo/config.toml [ 2/20] Done: .cargo [ 3/20] Done: .envrc [ 4/20] Skipped: .github/workflows/ci_checks.yml [ 5/20] Done: .github/workflows [ 6/20] Done: .github [ 7/20] Done: .gitignore [ 8/20] Done: .vscode/launch.json [ 9/20] Done: .vscode/settings.json [10/20] Done: .vscode [11/20] Done: Cargo.toml [12/20] Done: Embed.toml [13/20] Done: LICENSE-APACHE-2.0 [14/20] Done: LICENSE-MIT [15/20] Done: build.rs [16/20] Done: flake.lock [17/20] Done: flake.nix [18/20] Done: memory.x [19/20] Done: src/main.rs [20/20] Done: src 🔧 Moving generated files into: `/Users/nomura/rust/my-pico2-rp-hal`...
🔧 Initializing a fresh Git repository
✨ Done! New project created /Users/nomura/rust/my-pico2-rp-hal
クレートとHALについて
| 用語 | 解説 |
|---|---|
| クレート (Crate) | Rustにおけるパッケージやライブラリのこと。 |
| HAL (Hardware Abstraction Layer) | マイコンの複雑なメモリ操作を、Rustの分かりやすい関数として扱えるようにしてくれる橋渡し役のクレート。 |
Lチカ(LED点滅)のコードの雰囲気を見てみよう
テンプレートの中には、LEDを光らせるサンプルコードが含まれています。OSがない環境でのRustコードは、概ね以下のような構成になります。
#![no_std] // OSの標準ライブラリを使わない宣言
#![no_main] // 通常のmain関数から始まらない宣言
use defmt_rtt as _; // デバッグ出力用
use panic_probe as _; // パニック時の処理
use rp235x_hal as hal; // RP2350用のHAL
#[hal::entry]
fn main() -> ! {
let mut pac = hal::pac::Peripherals::take().unwrap();
// 1. 必須:ウォッチドッグとクロックの初期化
let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);
let clocks = hal::clocks::init_clocks_and_plls(
12_000_000u32,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
).ok().unwrap();
// 2. ピンの初期化
let sio = hal::Sio::new(pac.SIO);
let pins = hal::gpio::Pins::new(
pac.IO_BANK0,
pac.PADS_BANK0,
sio.gpio_bank0,
&mut pac.RESETS,
);
// 3. 基板上のLEDピンを出力モードに設定
let mut led_pin = pins.gpio25.into_push_pull_output();
// 4. 無限ループで点滅させる
loop {
led_pin.set_high().unwrap(); // 点灯
// (ここに数ミリ秒待機する遅延処理が入る)
led_pin.set_low().unwrap(); // 消灯
// (ここに数ミリ秒待機する遅延処理が入る)
}
}
上記のコードは、マイコン制御の全体の流れ(クロック設定 → ピン設定 → ループ処理)を掴むための概念的な抜粋です。そのままではコンパイルが通らないため、実際のコーディングの際はテンプレートに含まれるサンプルコードをベースに進めてください。実際に動くサンプルは rp-hal の examples で確認できます。
6. Pico 2 への書き込み
コードが準備できたら、いよいよマイコンに書き込みます。
- Raspberry Pi Pico 2 基板上の BOOTSELボタンを押しながら、MacとUSBケーブルで接続します(
RP2350という名前のドライブが一時的に表示されます。picotoolが自動的に検出して書き込みます)。 - プロジェクトのフォルダ(例:
my-pico-project)に移動し、以下のコマンドを実行します。
# 1. ディレクトリ移動
cd my-pico2-rp-hal
# 2. Pico 2 を BOOTSELボタンを押しながらUSB接続
# 3. ビルドと書き込み
cargo run --release
実行結果
Updating crates.io index
Locking 65 packages to latest Rust 1.96.0 compatible versions
Adding rp235x-hal v0.3.0 (available: v0.4.0)
Compiling proc-macro2 v1.0.106
Compiling unicode-ident v1.0.24
Compiling quote v1.0.46
Compiling semver-parser v0.7.0
Compiling cortex-m v0.7.7
Compiling defmt v1.1.0
Compiling nb v1.1.0
Compiling thiserror v2.0.18
Compiling syn v1.0.109
Compiling cortex-m-rt v0.7.5
Compiling nb v0.1.3
Compiling void v1.0.2
Compiling defmt-macros v1.1.0
Compiling vcell v0.1.3
Compiling semver v0.9.0
Compiling volatile-register v0.2.2
Compiling embedded-hal v0.2.7
Compiling rustc_version v0.2.3
Compiling paste v1.0.15
Compiling portable-atomic v1.13.1
Compiling bare-metal v0.2.5
Compiling bitfield v0.13.2
Compiling heapless v0.8.0
Compiling stable_deref_trait v1.2.1
Compiling byteorder v1.5.0
Compiling frunk_core v0.4.4
Compiling hash32 v0.3.1
Compiling embedded-hal-async v1.0.0
Compiling embedded-hal v1.0.0
Compiling rp235x-pac v0.1.0
Compiling bitflags v1.3.2
Compiling critical-section v1.2.0
Compiling gcd v2.3.0
Compiling fugit v0.3.9
Compiling panic-probe v1.0.0
Compiling defmt-rtt v1.2.0
Compiling either v1.16.0
Compiling arrayvec v0.7.7
Compiling itertools v0.13.0
Compiling syn v2.0.118
Compiling proc-macro-error-attr2 v2.0.0
Compiling usb-device v0.3.2
Compiling rp-hal-common v0.1.0
Compiling embedded-hal-nb v1.0.0
Compiling embedded-dma v0.2.0
Compiling rand_core v0.6.4
Compiling embedded-io v0.6.1
Compiling rp-binary-info v0.1.2
Compiling bitfield v0.14.0
Compiling sha2-const-stable v0.1.0
Compiling my-pico2-rp-hal v0.1.0 (/Users/nomura/rust/my-pico2-rp-hal)
Compiling num_enum_derive v0.5.11
Compiling num_enum v0.5.11
Compiling proc-macro-error2 v2.0.1
Compiling frunk_proc_macro_helpers v0.1.4
Compiling pio v0.2.1
Compiling thiserror-impl v2.0.18
Compiling cortex-m-rt-macros v0.7.5
Compiling frunk_derives v0.4.4
Compiling rp235x-hal-macros v0.1.0
Compiling frunk v0.4.4
Compiling defmt-parser v1.0.0
Compiling rp235x-hal v0.3.0
Finished `release` profile [optimized + debuginfo] target(s) in 15.42s
Running `picotool load -u -v -x -t elf target/thumbv8m.main-none-eabihf/release/my-pico2-rp-hal`
Family ID 'rp2350-arm-s' can be downloaded in absolute space:
00000000->02000000
Loading into Flash: [==============================] 100%
Verifying Flash: [==============================] 100%
OK
The device was rebooted to start the application.
テンプレートの設定により、cargo run の裏側で先ほどインストールした picotool が呼び出され、自動的にELFファイルの書き込みが行われます。
転送が完了するとドライブは自動的に解除され、プログラムが起動してLEDが点滅し始めます!
Pico 2 W をお使いの場合
Pico 2 W のオンボードLEDはGPIO25に繋がっておらず、
このコードでは点滅しません。外付けLEDをGPIOピンに接続して
動作確認するか、Embassyフレームワークを使用してください。
発展:この環境で何が作れるの?
C/C++と同等のハードウェア制御力を持ちながら、メモリ安全性が保証されているRustの開発環境が構築されます。
Lチカやセンサー制御に慣れてきたら、以下のようなプロジェクトに挑戦することも十分に可能です。
- 自作OSの開発: ARMコアの環境でタスクスケジューラやメモリ管理を自作し、UNIXライクなOSのカーネルをRustだけで組み上げるプロジェクト。実際に、著名な組み込みRust開発者がRP2040向けに自作したRust製OSをRP2350へ移植した事例もあります。
- インタプリタの構築: Rustの強力な構文解析の仕組みを利用して、マイコン上で直接動くBASIC言語などのインタプリタを自作するプロジェクト。
- デュアルコアの活用: RP2350はARMコアとRISC-Vコア(Hazard3)の両方を搭載しています。現時点ではRISC-Vコア側の割り込みサポートが開発中のため、まずはARMコアから始めるのがおすすめです。将来的には両コアを協調させた、このチップならではのユニークなシステム構築も視野に入ります。
まずは今回構築した環境で、Rustとマイコンの仕組みに触れてみてください。
