使用 Rust 对 FTHR-G0001 板子进行探索
分享作者:scgummy
评测品牌:灵动微电子
评测型号:FTHR-G0001
发布时间:2025-09-18 09:30:57
2 1
前言
开源口碑分享内容
使用 Rust 进行 FTHR-G0001 板子的探索,我们可以利用 `probe-rs` 的 CMSIS pack 迁移工具将灵动微电子官方的 KEIL pack 生成为兼容 `probe-rs` 的芯片描述文件.
同时用 SVD 生成 Rust 的 PAC,用先前文章类似的思路就可以写出下面的 UART 串口和 LED 控制程序.
#![no_std]
#![no_main]
use mm32g0001::Peripherals;
use cortex_m_rt::entry;
use core::fmt::Write;
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
struct Led;
impl Led {
fn enable() {
let peripherals = unsafe { Peripherals::steal() };
peripherals.rcc.ahbenr().modify(|_r, w| {
w.gpioa().set_bit()
});
peripherals.gpioa.crh().modify(|_r, w| unsafe {
w.mode11().bits(0b1);
// gpio push-pull
w.cnf11().bits(0b00)
});
}
fn set(value: bool) {
let peripherals = unsafe { Peripherals::steal() };
if value {
peripherals.gpioa.bsrr().write(|w| {
w.bs11().set_bit()
});
} else {
peripherals.gpioa.brr().write(|w| {
w.br11().set_bit()
});
}
}
}
struct Usart;
impl Usart {
fn new() -> Self {
let peripherals = unsafe { Peripherals::steal() };
peripherals.gpioa.crh().modify(|_r, w| unsafe {
w.mode12().bits(0b1);
// af push-pull
w.cnf12().bits(0b10)
});
peripherals.gpioa.afrh().modify(|_r, w| unsafe {
// af mux: usart1_tx
w.afr12().bits(0x1)
});
peripherals.rcc.apb1rstr().modify(|_r, w| {
w.usart1().set_bit();
w.usart1().clear_bit()
});
peripherals.rcc.apb1enr().modify(|_r, w| {
w.usart1().set_bit()
});
peripherals.usart1.cr1().modify(|_r, w| {
w.ue().clear_bit();
w.re().clear_bit();
w.te().clear_bit()
});
peripherals.usart1.cr1().modify(|_r, w| {
w.dl().clear_bit();
w.pce().clear_bit();
w.ps().clear_bit();
w.over8().clear_bit()
});
peripherals.usart1.cr2().modify(|_r, w| unsafe {
// stop bit 1
w.stop().bits(0b00)
});
peripherals.usart1.brr().modify(|_r, w| unsafe {
w.mfd().bits(4);
w.ffd().bits(5)
});
peripherals.usart1.cr1().modify(|_r, w| {
w.te().set_bit()
});
peripherals.usart1.cr1().modify(|_r, w| {
w.ue().set_bit()
});
Self
}
fn write_u8(&self, data: u8) {
let peripherals = unsafe { Peripherals::steal() };
while peripherals.usart1.sr().read().txe().bit_is_clear() {}
peripherals.usart1.dr().modify(|_r, w| unsafe {
w.dr().bits(data as u16)
});
while peripherals.usart1.sr().read().tc().bit_is_clear() {}
}
}
impl Write for Usart {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
s.as_bytes().iter().for_each(|b| self.write_u8(*b));
Ok(())
}
}
#[entry]
unsafe fn main() -> ! {
Led::enable();
let mut state = false;
let mut values = [0u8];
let mut usart = Usart::new();
loop {
Led::set(state);
let _ = writeln!(usart, "Counters: {:#x?}", &values);
state = !state;
values[0] += 1u8;
for i in 0..800_000 { core::hint::black_box(i); }
}
}
最终效果,动态演示可参考 b 站视频
全部评论

暂无评论

0/144