Крейт поддержки платы
Работать напрямую с PAC и HAL — довольно здорово. У большинства Arm-микроконтроллеров и у многих других MCU, под которые умеет собирать Rust, есть PAC-крейт. Если для вашего MCU его нет, написать PAC-крейт может быть утомительно, но в целом это несложно. У многих MCU с PAC-крейтом есть и HAL-крейт; если его нет, его тоже придётся писать, и опять же работа довольно рутинная. Код на уровне PAC и HAL даёт доступ к тонким деталям MCU.
Однако, как мы уже видели, довольно неудобно постоянно следить за тем, что происходит на стыке нашего nRF52833 и остальной части MB2. Нам приходилось читать схемы и прочие документы, чтобы понять, как пользоваться остальным оборудованием платы.
«Крейт поддержки платы» (в не-Rust-сообществе встраиваемых систем известный как Board Support Package, BSP) — это крейт, построенный поверх HAL и PAC для конкретной платы; он скрывает подробности и предоставляет удобные средства. Крейт поддержки платы, с которым мы работали, — это крейт microbit-v2.
Используем microbit-v2, чтобы получить окончательную, аккуратную мигалку (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 (пока что). Что важнее, он сделал это, позволив нам просто использовать понятные имена для строк и столбцов GPIO-выводов светодиода.
Крейт microbit-v2 предоставляет ещё более продвинутую поддержку для светодиодного «дисплея». Скоро мы увидим, как она используется для задач поинтереснее мигалки.