画龙点睛:不依赖任何硬件的,可以按照硬件的规范去封装
包依赖:
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(); // 执行空操作
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。