Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ボードサポートクレート

PAC と HAL を直接扱うのはかなり便利です。Rust がコンパイルできるほとんどの Arm MCU と、多くのそのほかの MCU には PAC クレートがあります。もしそれがないものを扱っている場合でも、PAC クレートを書くのは面倒ではありますが、かなり単純です。PAC クレートがある多くの MCU には HAL クレートもあります — これも、もし存在しなければ作るのは基本的には面倒な作業であるだけです。PAC および HAL レベルで書かれたコードでは、MCU の細かな詳細にアクセスできます。

しかし、これまで見てきたように、nRF52833 と MB2 の残りの部分とのインターフェースで何が起きているのかを把握し続けるのは、かなり厄介になってきます。オフボードのハードウェアをどう使うかを知るために、回路図などを読む必要がありました。

「ボードサポートクレート」 — Rust 以外の組み込みコミュニティでは Board Support Package (BSP) として知られています — は、ボード向けに HAL と PAC の上に構築され、詳細を隠蔽して利便性を提供するクレートです。これまで使ってきたボードサポートクレートは microbit-v2 クレートです。

microbit-v2 を使って、最終的な、整理された blinky (src/main.rs) を作ってみましょう。

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use embedded_hal::{delay::DelayNs, digital::OutputPin};
use microbit::hal::{gpio, timer};
use panic_halt as _;

#[entry]
fn main() -> ! {
    let board = microbit::Board::take().unwrap();

    let mut row1 = board
        .display_pins
        .row1
        .into_push_pull_output(gpio::Level::High);
    let _col1 = board
        .display_pins
        .col1
        .into_push_pull_output(gpio::Level::Low);

    let mut timer0 = timer::Timer::new(board.TIMER0);

    loop {
        timer0.delay_ms(500);
        row1.set_high().unwrap();
        timer0.delay_ms(500);
        row1.set_low().unwrap();
    }
}

この場合、ほとんど変更していません。ボードサポートクレートが PAC を隠してくれています(今のところは)。さらに重要なのは、LED の行および列の GPIO ピンに対して妥当な名前をそのまま使えるようにすることで、それを実現している点です。

microbit-v2 クレートは、それらの「ディスプレイ」LED に対してさらに高度なサポートも提供しています。このサポートは、近いうちに blinky よりももっと楽しいことをするために使われるのを見ていきます。