Переключение
Будем включать и выключать светодиод по очереди. Именно так он и начнёт мигать, верно?
В examples/fast-blink.rs находится следующая версия нашей мигалки. Я решил заставить мигать соседний светодиод, а исходный оставить включённым. Это простое изменение.
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use embedded_hal::digital::OutputPin;
use nrf52833_hal::{gpio, pac};
use panic_halt as _;
#[entry]
fn main() -> ! {
let peripherals = pac::Peripherals::take().unwrap();
let p0 = gpio::p0::Parts::new(peripherals.P0);
let _row1 = p0.p0_21.into_push_pull_output(gpio::Level::High);
let mut row2 = p0.p0_22.into_push_pull_output(gpio::Level::Low);
let _col1 = p0.p0_28.into_push_pull_output(gpio::Level::Low);
loop {
row2.set_high().unwrap();
row2.set_low().unwrap();
}
}
Здесь крейт embedded-hal предоставляет трейты Rust, которые нужны, чтобы устанавливать и сбрасывать состояние светодиода. Благодаря этому данная часть кода переносима на любой HAL на Rust, который реализует трейты embedded-hal, как и наш.
Но постойте: ни один светодиод не мигает! Второй горит чуть тусклее первого, но оба светятся ровно… или всё-таки нет? По умолчанию MB2 выполняет 64 миллиона инструкций в секунду. Допустим, включение или выключение светодиода «под капотом» занимает несколько десятков инструкций. (Возможно, столько в отладочной сборке, а в релизной — гораздо меньше. К тому же выводам нужно время, чтобы сменить состояние. Точно не знаю.) В любом случае второй светодиод включается и выключается сотни тысяч, а то и миллионы раз в секунду. Глаз просто не успевает за этим.
Между переключениями нужна пауза. Оказывается, ждать — самая сложная часть.