RustでRaspberryPi PicoのGPIO操作
RustでPicoのLedを点滅。
Rustには組み込み開発用に、ARM Cortex-Mアーキテクチャのクロスコンパイラがある。
# rustup target install thumbv6m-none-eabi
# cargo install flip-link elf2uf2-rs
# cargo generate –git https://github.com/rp-rs/rp2040-project-template –branch main –name pico-blink
pico-blinkのクレートができた
# cd pico-blink
■Cargo.toml の変更
edit -> pico-blink/Cargo.toml
[package]
name = “pico-blink”
# git init
# git add -A
# git commit -m “最初のコミット”
■プロジェクトのビルド
# cargo build
■プログラムをPicoに書き込んで実行
BOOTSELボタンを押しながらpicoをUSB接続すると、新たなプログラムを書き込めるようになる。
USB接続接続で「RPI-RP2」という名前のドライブとして自動マウントされない場合、手動マウント。
# fdisk -l
/dev/sdb1 と認識されていれば
# mount /dev/sdb1 /media/pi/RPI-RP2
media/pi/のRPI-RP2 へ、その都度認識されたドライブをマウントする。
ツールのelf2uf2-rsは、ビルドで生成されたELF形式のファイルをUF2形式へ変換する。
変換後にPicoのドライブへのコピーの自動化を .cargo/config.tomlで設定する
[target.’cfg(all(target_arch = “arm”, target_os = “none”))’]
#runner = “probe-run –chip RP2040”
runner = “elf2uf2-rs -d”
■ # cargo run を実行し、LEDの点滅が始まれば成功。
src/main.rs (picoのLED点滅ソースコード)
#![no_std]
#![no_main]
use bsp::entry;
use defmt::*;
use defmt_rtt as _;
use embedded_hal::digital::v2::OutputPin;
use panic_probe as _;
use rp_pico as bsp;
// use sparkfun_pro_micro_rp2040 as bsp;
use bsp::hal::{
clocks::{init_clocks_and_plls, Clock},
pac,
sio::Sio,
watchdog::Watchdog,
};
#[entry]
fn main() -> ! {
info!(“Program start”);
let mut pac = pac::Peripherals::take().unwrap();
let core = pac::CorePeripherals::take().unwrap();
let mut watchdog = Watchdog::new(pac.WATCHDOG);
let sio = Sio::new(pac.SIO);
// External high-speed crystal on the pico board is 12Mhz
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz());
let pins = bsp::Pins::new(
pac.IO_BANK0,
pac.PADS_BANK0,
sio.gpio_bank0,
&mut pac.RESETS,
);
// LED to one of the GPIO pins, and reference that pin here.
//let mut led_pin = pins.led.into_push_pull_output();
let mut led_pin = pins.gpio3.into_push_pull_output();
//let mut led_pin = pins.led.into_push_pull_output();
loop {
for _ in 0..3 {
// LEDを点灯
led_pin.set_high().unwrap();
delay.delay_ms(200);
// LEDを消灯
led_pin.set_low().unwrap();
delay.delay_ms(200);
}
delay.delay_ms(1600);
}
}