我正在尝试为Rust中的STM32F1xx制作"Blinky".我知道它有libs,但是我想创建自己的"lib"用于学习目的.
我可以通过C中的地址访问STM32的"寄存器":
*(uint32_t*)(0x40021000 + 0x018) |= 0x10;
*(uint32_t*)(0x40011000 + 0x004) |= 0x33;
*(uint32_t*)(0x40011000 + 0x004) &= ~0xCC;
*(uint32_t*)(0x40011000 + 0x10) |= 0x300;
while(1) {}
Run Code Online (Sandbox Code Playgroud)
这会将一些位写入RCC_APB2ENR寄存器以启用端口C的时钟,配置引脚并启用Discovery上的LED.
我需要在Rust中重写它,以制作consts,fns并开始编写漂亮的Rusty代码.在没有FFI调用C代码的情况下Rust是否可能?我能用asm!宏来实现吗?
自1.9版以来,这些功能read_volatile和write_volatile都是稳定的,因此您应该使用它们。借用@ker的翻译样本进行演示:
use std::ptr::{read_volatile, write_volatile};
const A: *mut u32 = (0x40021000 + 0x018) as *mut u32;
const B: *mut u32 = (0x40011000 + 0x004) as *mut u32;
const C: *mut u32 = (0x40011000 + 0x10) as *mut u32;
unsafe {
write_volatile(A, read_volatile(A) | 0x10);
write_volatile(B, read_volatile(B) | 0x33);
write_volatile(B, read_volatile(B) & !0xCC);
write_volatile(C, read_volatile(C) | 0x300);
}
Run Code Online (Sandbox Code Playgroud)
此外,volatile板条箱提供了用于易失性访问的值周围的包装器类型。
use volatile::Volatile;
const A: *mut u32 = (0x40021000 + 0x018) as *mut u32;
const B: *mut u32 = (0x40011000 + 0x004) as *mut u32;
const C: *mut u32 = (0x40011000 + 0x10) as *mut u32;
const volatile_A = A as *mut Volatile<u32>;
const volatile_B = B as *mut Volatile<u32>;
const volatile_C = C as *mut Volatile<u32>;
unsafe {
(*volatile_A).update(|x| *x | 0x10);
(*volatile_B).update(|x| *x & !0xCC);
(*volatile_C).update(|x| *x | 0x300);
}
Run Code Online (Sandbox Code Playgroud)