為什么要在Swm341中運行Rust代碼?
Swm341是一款非常優秀的國產單片機芯片,聚焦于顯示控制,有著非常多的硬件資源可供使用,開發非常方便。另外Rust目前開始變得流行,執行效率也非常高,因此想在Swm341中嘗試使用運行Rust開發。
一切從點燈開始
正如學習語言從打印hello world!
開始,單片機的學習當然從點燈開始。在本工程中,將會打印一些日志,并且一秒閃爍一次。代碼非常簡單,在src/main
中添加以下的代碼即可。
#![no_std]
#![no_main]
use defmt_rtt as _;
use panic_probe as _;
use swm341_pac as pac;
// 簡單的毫秒延時函數
fn delay_ms(ms: u32) {
for _ms in 0..ms {
for _i in 0..20 {
for _j in 0..10 {}
}
}
}
#[cortex_m_rt::entry]
fn main() -> ! {
defmt::info!("swm341 led blinky example start...");
let p = pac::Peripherals::take().unwrap();
let sys_con = p.SYS;
// 開啟 gpion的時鐘
sys_con.clken0.write(|w| w.gpion().set_bit());
let port = p.PORTN;
// 設置portn.0 為 gpio 映射
port.func0.write(|w| unsafe { w.pin0().bits(0) });
// 設置 portn.0 上拉
port.pullu.write(|w| w.pin0().set_bit());
let gpio = p.GPION;
// 設置 gpion.0 為輸出方向
gpio.dir.write(|w| w.pin0().set_bit());
let mut count = 0u32;
loop {
// 翻轉 gpion.0
gpio.odr.modify(|r, w| w.pin0().bit(!r.pin0().bit()));
// 打印計數值
defmt::info!("{}", count);
count += 1;
delay_ms(500);
}
}
然后直接執行cargo run --example blinky
即可編譯和下載并運行,下載非常快,不到1秒。
執行效果如下
可執行文件的大小
由下圖可知,
- 在Release模式下編譯,固件大小為
(6740+56+1032)/1024=7.64KB
- 在Debug模式下編譯,固件大小為
(18228+56+1032)/1024=18.8KB