使用嵌入式 Rust 在 Raspberry Pi Pico 上闪烁外部 LED
让我们从创建项目开始。我们将使用 cargo-generate 并使用我们为本书准备的模板。
在你的终端中,输入:
cargo generate --git https://github.com/ImplFerris/pico2-template.git --tag v0.3.1
你会被问到几个问题:
-
对于项目名称,你可以随意命名。我们将使用 external-led。
-
接下来,它会要求我们选择硬件抽象层(HAL)。我们应该选择 "Embassy"。
-
然后,它会询问我们是否要启用 defmt 日志记录。这仅在我们使用调试探针时有效,因此你可以根据你的设置进行选择。无论如何,在本次练习中我们不会编写任何日志。
导入
项目模板中已经包含了大部分所需的导入。对于本次练习,我们只需要从 gpio 中添加 Output 结构体和 Level 枚举:
#![allow(unused)] fn main() { use embassy_rp::gpio::{Level, Output}; }
在编写主代码时,你的编辑器通常会建议缺失的导入。如果没有建议或者你看到了错误,请检查完整代码部分并从那里添加缺失的导入。
主要逻辑
代码与快速开始示例几乎相同。唯一的区别是我们现在使用 GPIO 13 而不是 GPIO 25。GPIO 13 是我们连接 LED(通过电阻)的地方。
让我们将这些代码添加到主函数中:
#![allow(unused)] fn main() { let mut led = Output::new(p.PIN_13, Level::Low); loop { led.set_high(); // 打开 LED Timer::after_millis(500).await; led.set_low(); // 关闭 LED Timer::after_millis(500).await; } }
我们在这里使用 Output 结构体,因为我们想从 Pico 向 LED 发送信号。我们将 GPIO 13 设置为输出引脚,并使其初始状态为低电平(关闭)。
注意:如果你想从组件(如按钮或传感器)读取信号,则需要将 GPIO 引脚配置为输入(Input)。
然后我们在引脚上调用 set_high 和 set_low,并在它们之间设置延迟。这会在高电平和低电平之间切换引脚,从而打开和关闭 LED。
完整代码
这里是完整的代码供参考:
#![no_std] #![no_main] use embassy_executor::Spawner; use embassy_rp as hal; use embassy_rp::block::ImageDef; use embassy_rp::gpio::{Level, Output}; use embassy_time::Timer; // Panic处理程序(Panic Handler) use panic_probe as _; // Defmt 日志记录 use defmt_rtt as _; /// 告知引导 ROM(Boot ROM)关于我们的应用程序 #[unsafe(link_section = ".start_block")] #[used] pub static IMAGE_DEF: ImageDef = hal::block::ImageDef::secure_exe(); #[embassy_executor::main] async fn main(_spawner: Spawner) { let p = embassy_rp::init(Default::default()); let mut led = Output::new(p.PIN_13, Level::Low); loop { led.set_high(); // 打开 LED Timer::after_millis(500).await; led.set_low(); // 关闭 LED Timer::after_millis(500).await; } } // 用于 `picotool info` 的程序元数据。 // 这不是必需的,但建议保留这些最基本的条目。 #[unsafe(link_section = ".bi_entries")] #[used] pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [ embassy_rp::binary_info::rp_program_name!(c"external-led"), embassy_rp::binary_info::rp_program_description!(c"your program description"), embassy_rp::binary_info::rp_cargo_version!(), embassy_rp::binary_info::rp_program_build_attribute!(), ]; // 文件结束
克隆现有项目
你可以克隆我创建的项目并导航到 external-led 文件夹:
git clone https://github.com/ImplFerris/pico2-embassy-projects
cd pico2-embassy-projects/external-led
如何运行?
你可以参考 “运行程序” 章节