闪烁

Delaying

现在我们将简要介绍一下delay抽象,embedded-hal后再将其与上一章中的GPIO抽象结合起来,以最终使LED闪烁。

embedded-hal为我们提供了两个抽象来延迟我们程序的执行:DelayUsDelayMs。 除了它们的延迟函数接受不同的单位外,它们基本上都以完全相同的方式工作。

在我们的MCU内部,存在几个所谓的"定时器"。他们可以为我们做各种关于时间的事情,包括简单地暂停 我们程序的执行一段固定的时间。 例如,一个非常简单的基于延迟的程序每秒打印一些内容可能如下所示:

#![deny(unsafe_code)] #![no_main] #![no_std] use cortex_m_rt::entry; use rtt_target::{rtt_init_print, rprintln}; use panic_rtt_target as _; use microbit::board::Board; use microbit::hal::timer::Timer; use microbit::hal::prelude::*; #[entry] fn main() -> ! { rtt_init_print!(); let mut board = Board::take().unwrap(); let mut timer = Timer::new(board.TIMER0); loop { timer.delay_ms(1000u16); rprintln!("1000 ms passed"); } }

注意,我们在这里将panic实现从panic_halt更改为panic_rtt_target。这将要求您取消注释Cargo.toml 中的两个RTT行,并注释panic-halt,因为Rust一次只允许一个panic实现。

为了真正看到打印,我们必须更改Embed.toml像这样:

[default.general] # chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2 # chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1 [default.reset] halt_afterwards = false [default.rtt] enabled = true [default.gdb] enabled = false

现在,在将代码放入src/main.rs和另一个cargo embed (再次使用之前使用的相同标志) 后您应该会看到"1000 ms passed"每秒从MCU发送到控制台。

闪烁

现在我们已经到了可以结合我们关于 GPIO 和延迟抽象的新知识的地步,以便真正使micro:bit 背面的LED闪烁。 生成的程序实际上只是上面一个程序和上一节中打开LED的程序的混搭,如下所示:

#![deny(unsafe_code)] #![no_main] #![no_std] use cortex_m_rt::entry; use rtt_target::{rtt_init_print, rprintln}; use panic_rtt_target as _; use microbit::board::Board; use microbit::hal::timer::Timer; use microbit::hal::prelude::*; #[entry] fn main() -> ! { rtt_init_print!(); let mut board = Board::take().unwrap(); let mut timer = Timer::new(board.TIMER0); board.display_pins.col1.set_low().unwrap(); let mut row1 = board.display_pins.row1; loop { row1.set_low().unwrap(); rprintln!("Dark!"); timer.delay_ms(1_000_u16); row1.set_high().unwrap(); rprintln!("Light!"); timer.delay_ms(1_000_u16); } }

在将代码放入src/main.rs和最后一个cargo embed(带有适当的标志)后,您应该看到我们在闪烁之前点亮的LED以及打印, 每次LED从关闭变为打开,反之亦然。