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();
    }
}

编译与烧录

  1. 编译:cargo build --release
  2. 烧录(使用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状态将无法保持。