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

Переключение

Будем включать и выключать светодиод по очереди. Именно так он и начнёт мигать, верно?

В 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 миллиона инструкций в секунду. Допустим, включение или выключение светодиода «под капотом» занимает несколько десятков инструкций. (Возможно, столько в отладочной сборке, а в релизной — гораздо меньше. К тому же выводам нужно время, чтобы сменить состояние. Точно не знаю.) В любом случае второй светодиод включается и выключается сотни тысяч, а то и миллионы раз в секунду. Глаз просто не успевает за этим.

Между переключениями нужна пауза. Оказывается, ждать — самая сложная часть.