画龙点睛:不依赖任何硬件的,可以按照硬件的规范去封装


包依赖:

cortex-m = "0.7.7"
cortex-m-rt = "0.7.3"

代码案例:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use cortex_m::{asm};  // 引入 Cortex-M 汇编相关功能
use panic_halt as _;  // Panic 处理库

// 定义 STM32F1 硬件寄存器的地址(以 GPIOC 为例)
const RCC_BASE: u32 = 0x40021000;
const GPIOC_BASE: u32 = 0x40011000;

const GPIOC_CRL: *mut u32 = (GPIOC_BASE + 0x00) as *mut u32; // GPIOC 控制寄存器
const GPIOC_BSRR: *mut u32 = (GPIOC_BASE + 0x10) as *mut u32; // GPIOC 位设定/重置寄存器
const RCC_APB2ENR: *mut u32 = (RCC_BASE + 0x18) as *mut u32; // RCC APB2 外设时钟使能寄存器
#[test]
#[entry]
fn test01() -> ! {
    // 使能 GPIOC 时钟
    unsafe {
        RCC_APB2ENR.write_volatile(1 << 4); // 使能 GPIOC 时钟(RCC_APB2ENR 第 4 位)
    }

    // 将 PC13 设置为输出(推挽输出模式)
    unsafe {
        GPIOC_CRL.write_volatile(0b0011 << (13 * 4)); // 设置为输出模式,最大速度 2 MHz
    }

    loop {
        // 点亮 LED
        unsafe {
            GPIOC_BSRR.write_volatile(1 << 13); // 设置 PC13(点亮 LED)
        }
        delay(500_000); // 简单延时

        // 熄灭 LED
        unsafe {
            GPIOC_BSRR.write_volatile(1 << (13 + 16)); // 重置 PC13(熄灭 LED)
        }
        delay(500_000); // 简单延时
    }
}

// 简单的忙循环延时功能
fn delay(t: u32) {
    for _ in 0..t {
        asm::nop(); // 执行空操作
    }
}

编写代码以配置定时器和中断服务程序来切换 GPIO 引脚状态:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use cortex_m::{asm};  // 引入 Cortex-M 汇编方面功能
use panic_halt as _;  // Panic 处理库

// 定义 STM32F103 硬件寄存器的地址
const RCC_BASE: u32 = 0x40021000; // RCC 基址
const GPIOC_BASE: u32 = 0x40011000; // GPIOC 基址
const TIM2_BASE: u32 = 0x40000000; // TIM2 基址

// 计算寄存器地址
const GPIOC_CRL: *mut u32 = (GPIOC_BASE + 0x00) as *mut u32; // GPIOC 控制寄存器
const GPIOC_BSRR: *mut u32 = (GPIOC_BASE + 0x10) as *mut u32; // GPIOC 位设定/重置寄存器
const RCC_APB2ENR: *mut u32 = (RCC_BASE + 0x18) as *mut u32; // RCC APB2 外设时钟使能寄存器
const RCC_APB1ENR: *mut u32 = (RCC_BASE + 0x1C) as *mut u32; // RCC APB1 外设时钟使能寄存器
const TIM2_CR1: *mut u32 = (TIM2_BASE + 0x00) as *mut u32; // TIM2 控制寄存器 1
const TIM2_PSC: *mut u32 = (TIM2_BASE + 0x28) as *mut u32; // TIM2 预分频寄存器
const TIM2_ARR: *mut u32 = (TIM2_BASE + 0x2C) as *mut u32; // TIM2 自动重载寄存器
const TIM2_SR: *mut u32 = (TIM2_BASE + 0x10) as *mut u32; // TIM2 状态寄存器

#[entry]
fn main() -> ! {
    // 使能 GPIOC 时钟
    unsafe {
        RCC_APB2ENR.write_volatile(1 << 4); // 使能 GPIOC 时钟
        RCC_APB1ENR.write_volatile(1 << 0); // 使能 TIM2 时钟
    }

    // 配置 PC13 为输出模式(推挽输出)
    unsafe {
        GPIOC_CRL.write_volatile(0b0011 << (13 * 4)); // 设置为输出模式,最大速度 2 MHz
    }

    // 配置定时器
    unsafe {
        TIM2_PSC.write_volatile(8000 - 1); // 预分频器:8000,输入频率 8 MHz --> 1 KHz
        TIM2_ARR.write_volatile(1000 - 1); // 自动重载寄存器,设置为 1000
        TIM2_CR1.write_volatile(1); // 启动定时器
    }

    loop {
        // 检查定时器更新事件
        unsafe {
            if (*TIM2_SR.read_volatile() & 1) != 0 {
                // 清除更新事件
                TIM2_SR.write_volatile(0);
                
                // 切换 LED 状态
                GPIOC_BSRR.write_volatile(1 << 13); // 点亮 LED
                delay(500_000); // 等待一段时间
                GPIOC_BSRR.write_volatile(1 << (13 + 16)); // 熄灭 LED
            }
        }
    }
}

// 简单的忙循环延时功能
fn delay(t: u32) {
    for _ in 0..t {
        asm::nop(); // 执行空操作
    }
}

putao
8 声望1 粉丝

推动世界向前发展,改善民生。