← スキル一覧に戻る

embassy-rp
by njfdev
The code for the entire payload system onboard the 2025 NCSSM HPR rocket named C.A.V.E.R.N.
⭐ 1🍴 0📅 2026年1月18日
SKILL.md
name: embassy-rp description: Embassy HAL for Raspberry Pi RP2040 and RP2350 microcontrollers. Use when working with Pico/Pico 2 peripherals, GPIO, SPI, I2C, UART, PIO, or flashing with picotool. keywords: [embassy-rp, rp2040, rp2350, pico, pico2, raspberry pi pico, gpio, spi, i2c, uart, pio, dma, pwm, adc, usb, picotool, memory.x, cortex-m, thumbv6m, thumbv8m]
Embassy-RP HAL
embassy-rp provides safe, idiomatic Rust APIs for RP2040 and RP2350 microcontrollers with both blocking and async support.
Cargo.toml Setup
For RP2350 (Pico 2)
[dependencies]
embassy-executor = { version = "0.9", features = ["arch-cortex-m", "executor-thread"] }
embassy-rp = { version = "0.9", features = ["rp235xa", "time-driver", "critical-section-impl"] }
embassy-time = "0.5"
cortex-m = "0.7"
cortex-m-rt = "0.7"
panic-probe = "1.0"
[profile.release]
opt-level = "s"
lto = true
For RP2040 (Original Pico)
embassy-rp = { version = "0.9", features = ["rp2040", "time-driver", "critical-section-impl"] }
.cargo/config.toml
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = "picotool load -u -v -x -t elf"
[build]
target = "thumbv8m.main-none-eabihf" # RP2350
# target = "thumbv6m-none-eabi" # RP2040
Memory Layout (memory.x)
MEMORY {
FLASH : ORIGIN = 0x10000000, LENGTH = 2048K
RAM : ORIGIN = 0x20000000, LENGTH = 512K
SRAM8 : ORIGIN = 0x20080000, LENGTH = 4K /* Core 0 dedicated */
SRAM9 : ORIGIN = 0x20081000, LENGTH = 4K /* Core 1 dedicated */
}
Basic Template
#![no_std]
#![no_main]
use embassy_executor::Spawner;
use embassy_rp::gpio::{Level, Output};
use embassy_time::Timer;
use panic_probe as _;
// Binary info for picotool
#[unsafe(link_section = ".bi_entries")]
#[used]
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
embassy_rp::binary_info::rp_program_name!(c"My Program"),
embassy_rp::binary_info::rp_program_description!(c"Description"),
embassy_rp::binary_info::rp_cargo_version!(),
embassy_rp::binary_info::rp_program_build_attribute!(),
];
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default());
let mut led = Output::new(p.PIN_25, Level::Low);
loop {
led.toggle();
Timer::after_millis(500).await;
}
}
Peripheral Examples
GPIO
use embassy_rp::gpio::{Input, Output, Level, Pull};
let mut led = Output::new(p.PIN_25, Level::Low);
let button = Input::new(p.PIN_15, Pull::Up);
if button.is_low() {
led.set_high();
}
I2C (Async)
use embassy_rp::i2c::{I2c, Config};
let i2c = I2c::new_async(
p.I2C0,
p.PIN_1, // SCL
p.PIN_0, // SDA
Irqs,
Config::default(),
);
let mut buf = [0u8; 2];
i2c.write_read(0x76, &[0xD0], &mut buf).await.unwrap();
SPI (Async)
use embassy_rp::spi::{Spi, Config};
let mut spi = Spi::new(
p.SPI0,
p.PIN_18, // CLK
p.PIN_19, // MOSI
p.PIN_16, // MISO
p.DMA_CH0,
p.DMA_CH1,
Config::default(),
);
let mut cs = Output::new(p.PIN_17, Level::High);
cs.set_low();
spi.transfer(&mut buf).await.unwrap();
cs.set_high();
UART (Async)
use embassy_rp::uart::{Uart, Config};
let uart = Uart::new(
p.UART0,
p.PIN_0, // TX
p.PIN_1, // RX
Irqs,
p.DMA_CH0,
p.DMA_CH1,
Config::default(),
);
let (mut tx, mut rx) = uart.split();
tx.write(b"Hello\n").await.unwrap();
Interrupt Binding
use embassy_rp::bind_interrupts;
use embassy_rp::peripherals::{I2C0, UART0};
bind_interrupts!(struct Irqs {
I2C0_IRQ => embassy_rp::i2c::InterruptHandler<I2C0>;
UART0_IRQ => embassy_rp::uart::InterruptHandler<UART0>;
});
Flashing
# Build and flash
cargo run --release
# Build only
cargo build --release
# Manual flash
picotool load -u -v -x -t elf target/thumbv8m.main-none-eabihf/release/pico_logger
Resources
スコア
総合スコア
50/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
レビュー
💬
レビュー機能は近日公開予定です