1. 点亮板载LED
任务目标
编写一个Rust程序,控制开发板上的板载LED点亮。通过本案例熟悉嵌入式Rust项目的基本结构、GPIO输出引脚的配置方式,以及如何将程序编译并烧录到开发板。
环境与依赖
本案例以 STM32F103C8T6(Blue Pill)开发板为例,板载LED连接在 PC13 引脚(低电平点亮)。需要以下工具链:
rustup添加目标:thumbv7m-none-eabi- 安装
cargo-binutils、flip-link(可选,用于链接) - 使用
openocd+gdb或cargo-flash进行烧录 - Cargo依赖:
cortex-m-rt、panic-halt、stm32f1xx-hal
项目结构
创建一个新的二进制项目,Cargo.toml 中关键配置如下:
[dependencies]
cortex-m-rt = "0.7"
panic-halt = "0.2"
stm32f1xx-hal = { version = "0.10", features = ["stm32f103", "rt"] }
[[bin]]
name = "led_blink"
path = "src/main.rs"
[profile.release]
opt-level = "s"
完整代码
在 src/main.rs 中写入以下代码,实现LED点亮功能:
#![no_std]
#![no_main]
use panic_halt as _;
use stm32f1xx_hal::{pac, prelude::*, timer::Timer};
#[cortex_m_rt::entry]
fn main() -> ! {
// 获取外设访问权限
let dp = pac::Peripherals::take().unwrap();
let cp = cortex_m::Peripherals::take().unwrap();
// 配置GPIO端口C
let mut gpioc = dp.GPIOC.split();
// 将PC13配置为推挽输出模式
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crl);
// 点亮LED(PC13低电平有效)
led.set_low();
// 使用定时器实现简单延时,保持LED点亮状态
let mut timer = Timer::syst(cp.SYST, &dp.RCC).start_count_down(1.hz());
loop {
timer.wait();
}
}
编译与烧录
- 编译:
cargo build --release - 烧录(使用ST-Link):
cargo flash --chip stm32f103c8 --release
验证方法
烧录成功后,观察开发板上PC13对应的LED灯。若LED保持常亮,则程序运行正确。若LED不亮,请检查:
- 开发板是否为Blue Pill(PC13连接LED)
- 烧录时芯片型号是否选择正确
- LED是否损坏或焊接不良
关键说明
本案例仅实现LED常亮,不涉及闪烁。代码中 set_low() 使PC13输出低电平,从而点亮LED(板载LED阳极接3.3V,阴极接PC13)。Timer::syst 用于提供延时循环,防止程序退出;若移除该循环,程序会立即结束并触发 panic_halt,LED状态将无法保持。