CH32V003でRustを使ってLチカ
·
2min
以前試した時はうまく動かなかったので、そろそろ熟成されているかなと再度試すことにする。
Google検索して新しそうなものを探すとこれが見つかるので、試してみるとあっさり動いた。
WCH-LinkEの設定は以前書いた通り。
コードはシンプルで、rprintln!()というのを使えば、PC側に表示できるのでprintデバッグも可能。
#![no_std]
#![no_main]
use hal::delay::Delay;
use hal::gpio::{Level, Output};
use ch32_hal as hal;
use panic_halt as _;
use rtt_target::{rprintln, rtt_init_print};
#[qingke_rt::entry]
fn main() -> ! {
rtt_init_print!();
let config = hal::Config::default();
let peripherals = hal::init(config);
let mut led = Output::new(peripherals.PD6, Level::Low, Default::default());
let mut delay = Delay;
loop {
led.toggle();
delay.delay_ms(1000);
rprintln!("Blink!");
}
}
このくらいのローエンドだとメモリー消費量が気になるわけだが、以下のように.cargo/config.tomlにrustflagsを設定してやればマップファイルを出力できた。
[target.riscv32ec-unknown-none-elf]
# Use probe-rs for running the project and specify the linker script
runner = "probe-rs run --chip ch32v003"
rustflags = [
"-C", "link-arg=-Tlink.x",
"-C", "link-arg=-Map=output.map",
]
中を見ると、
VMA LMA Size Align Out In Symbol
...
20bf 20bf 1 1 . = ALIGN(4)
20000000 20c0 18 4 .data
...
2000057c 263c 0 1 PROVIDE( _ebss = .)
20000800 20000800 0 1 .stack
なので、ROM領域が8383バイト(20bf)、RAM領域が1404バイト(57c)みたいだ。ROMは半分くらい使われていて、RAMは残り600バイト切りという感じ。スタックにも必要だから使えるのは、この半分くらいかな。手持ちのCH32V305FBP6を試してみたが、probe-rsの書き込みで失敗して動かなかった。大分前にいじったきりなので、チップが壊れている可能性も否定できない..
るいもの戯言