使用 Rust 对 FTHR-G0001 板子进行探索
分享作者:scgummy
评测品牌:灵动微电子
评测型号:FTHR-G0001
发布时间:2025-09-18 09:30:57
1
前言
使用 Rust 进行 FTHR-G0001 板子的探索,我们可以利用 `probe-rs` 的 CMSIS pack 迁移工具将灵动微电子官方的 KEIL pack 生成为兼容 `probe-rs` 的芯片描述文件.
开源口碑分享内容

使用 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