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);
  }
}

参考サイト : Raspberry Pi Picoで組込みRust開発(開発環境構築編)

Previous article

RUST StartUp

Next article

WindowsにWSLでLinuxを