
网购了一个小小的电子玩具,它的主控采用了ch32x033f8p6; flash有60多K, ram有20K;这点资源不算多,带一个 180x60 分辨率的屏幕有点吃力;还附加了一颗1M字节的norflash,确实具有一定的可玩性;关键是价格很美丽,只要大概17元包邮,买多块的会更划算一些;插了一下bom表,确实很节省。 配合上位机可以做一个监控电脑的小工具,甚至可以充当个小副屏。
本来打算跑一下 lvgl,但是这个资源确实没法搞,内存太小了;160*80*2=25.6K的内存,单帧数据都不够。
下面说一下芯片如何在rust下进行开发; 首先感谢万能的开源社区,已经对该芯片进行了良好的支持;

embassy-rs 已经有人做了支持;

有点小遗憾是有一些外设还未支持到;其中就包含重点要用到usb;可能是为了节约成本,这个usb的核可能和通用的差异较大,社区未做适配;经过翻看资料,发现它这个外设比较贫瘠,需要大量的软件的参与才能良好驱动。
Cargo.toml
rust
[package]
name = "ch32x033"
version = "0.1.0"
edition = "2021"
[dependencies]
# ch32-hal 我这里设置了本地路径,你可以改成普通的引用
ch32-hal = { path = "./ch32-hal", features = [
"ch32x033f8p6",
"memory-x",
"embassy",
"rt",
"time-driver-tim2",
] }
embassy-executor = { version = "0.10.0", features = [
"platform-spin",
"executor-thread",
] }
embassy-time = "0.5.1"
embassy-usb = "0.6.0"
embassy-usb-driver = "0.2.2"
embassy-sync = "0.8.0"
embassy-futures = "0.1.2"
critical-section = "1.2.0"
# CH32X(RISC-V)无原生原子 CAS,portable-atomic 需要 critical-section 实现
#(static_cell 依赖 portable-atomic 的 compare_exchange,无此 feature 会编译失败)。
portable-atomic = { version = "1.5.1", features = ["critical-section"] }
static_cell = "2.1.0"
qingke-rt = "0.7"
qingke = "0.7"
panic-halt = "1.0"
embedded-hal = "1.0.0"
embedded-hal-async = "1.0.0"
heapless = "0.9.3"
[profile.release]
strip = false # symbols are not flashed to the microcontroller, so don't strip them.
lto = true
opt-level = "z" # Optimize for size.
[profile.dev]
strip = false # symbols are not flashed to the microcontroller, so don't strip them.
lto = true
opt-level = "z" # Optimize for size.
rust
fn main() {
println!("cargo:rustc-link-arg-bins=--nmagic");
println!("cargo:rustc-link-arg-bins=-Tlink.x");
}
主代码

说一下重点,可以把编译出来的bin或者hex进行官方工具进行下载到芯片; 万能的社区提供了一个更好的方式, wlink; 为适配沁恒的调试器专门搞的一个工具,它需要用 zadig.exe 进行强制给调试器安装驱动,如果你已经安装了官方驱动,那么你需要在 设备管理器中找到硬件,并卸载设备和驱动; 让后再用zadig.exe 签名装驱动。
wlink的安装也很简单 使用cargo install wlink 命令即可;
使用方法也很简单

补充上后面的 --enable-sdi-print --watch-serial 这个, 可以在下载之后直接看到输出的信息,不用额外的使用一个硬件串口;但是遗憾的是不支持往里面发送数据。不过一般调试也够了,算是完成了一半的rtt的工作。
如果不想直接在 下载页面看到打印消息 去掉 --watch-serial; 在常用的串口工具打开wclink自带的串口,一样可以看到消息。
直接运行 cargo run
过程还是很丝滑的
