Таймеры
Одно из главных преимуществ «bare-metal» встраиваемой системы в том, что вы контролируете всё, что происходит на вашем устройстве. Это позволяет очень точно управлять временем: ничто не замедлит вас, пока вы сами этого не допустите.
Однако, как мы видели, если действительно хотим отмерять время правильно, без помощи, скорее всего, не обойтись. Встраиваемые MCU вроде nRF52833 предоставляют такую помощь в виде «таймеров». Таймер — это периферийное устройство, которое, как следует из названия, работает как маленькие часы, очень точно отсчитывающие время.
В nRF52833 есть четыре таймера. Если заглянуть в документацию чипа, окажется, что настраивать и использовать их довольно сложно. К счастью, HAL предоставляет обёртку над таймерами, которая упрощает типичные сценарии. Самое частое применение таймера — отсчитывать точный промежуток времени, именно это и пытался делать наш wait() в предыдущих разделах.
Посмотрите examples/timer-blinky.rs. Этот код настраивает таймер и использует его, чтобы делать паузу 500 мс (0,5 с) между переключениями.
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use embedded_hal::{delay::DelayNs, digital::OutputPin};
use nrf52833_hal::{gpio, pac, timer};
use panic_halt as _;
#[entry]
fn main() -> ! {
let peripherals = pac::Peripherals::take().unwrap();
let p0 = gpio::p0::Parts::new(peripherals.P0);
let mut row1 = p0.p0_21.into_push_pull_output(gpio::Level::High);
let _col1 = p0.p0_28.into_push_pull_output(gpio::Level::Low);
let mut timer0 = timer::Timer::new(peripherals.TIMER0);
loop {
timer0.delay_ms(500);
row1.set_high().unwrap();
timer0.delay_ms(500);
row1.set_low().unwrap();
}
}
Запустите этот код командой cargo run --release --example timer-blinky и засеките время секундомером. Вы увидите, что каждый цикл «вкл — выкл» длится ровно одну секунду.
Вы могли заметить следующее:
-
Чтобы использовать метод
delay_ms(), нужно подключить трейтembedded_hal::Delay. -
Как и раньше, мы достаём периферию из структуры PAC и передаём её в HAL.
Теперь у нас мигалка промышленного качества. Поговорим немного о том, что из этого следует.