embassy stm32 点灯
想研究下embassy的使用,手里有块STM32F3DISCOVERY开发板,以前买来学习rust嵌入式用的,闲置了很久,刚好拿来练练手。开发环境使用ubuntu24.04
1 udev配置,解决操作设备权限问题
创建udev配置文件:vim /etc/udev/rules.d/49-stlink.rules,内容如下:
#STM32F3DISCOVERY – ST-LINK/V2.1
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE:="0666"
其中 0483和3748可能会有变动,可以插上板子usb接口,使用lsusb 查出来。
设置完成后reload一下:sudo udevadm control –reload-rules
2 安装 probe-rs-tools
刚开始是用官网的脚本安装,装完后发现无法烧录芯片,后来改用 cargo install probe-rs-tools 安装,发现中间还有编译出错的crates。简直无语,后来采用probe-rs-tools crates上介绍的方法安装最新版,使用命令:
cargo install probe-rs-tools –git https://github.com/probe-rs/probe-rs –locked –force
安装过程中有可能提示需要安装开发环境和cmake等。
3 生成工程
使用probe-rs 查看下芯片对应的型号,开发板对应的芯片是 stm32f303vct6, 在probe-rs中对应的是 STM32F303VC:
probe-rs chip list | grep -i stm32f303
…
STM32F303VC
…
使用cargo embassy 生成工程,其中disc是要生成的工程的名称:
cargo embassy init disc –chip stm32f303vc
生成的工程中,需要在Cargo.toml 中添加 embassy-stm32 crates.
生成的.cargo/config.toml 和Embed.toml 里面的芯片可能是 STM32F303VCTx, 使用STM32F303VC也是可以的。
4 修改代码
板子使用的led管脚是PE8 到 PE15,修改对应的管脚。
5 编译运行
使用cargo run –release 运行程序,程序会自动加载到芯片并运行,终端会提示打印信息。
~/r/disc (main)> cargo run –release
Compiling disc v0.1.0 (/home/rust/disc)
Finished
release
profile [optimized] target(s) in 1.43sRunning
probe-rs run --chip STM32F303VC target/thumbv7em-none-eabi/release/disc
WARN probe_rs::util::rtt: Insufficient DWARF info; compile your program with
debug = 2
to enable location info.Erasing ✔ 100% [####################] 10.00 KiB @ 43.07 KiB/s (took 0s)
Programming ✔ 100% [####################] 10.00 KiB @ 12.82 KiB/s (took 1s)
WARN probe_rs::util::rtt::client: RTT read pointer changed, re-attaching
0.000000 TRACE BDCR ok: 00008218
└─ @ └─ <invalid location: defmt frame-index: 6>:0
0.000000 DEBUG rcc: Clocks { sys: Hertz(8000000), pclk1: Hertz(8000000), pclk1_tim:Hertz(8000000), pclk2: Hertz(8000000), pclk2_tim: Hertz(8000000),
hclk1: Hertz(8000000), adc: None, adc34: None, rtc: Some(Hertz(40000)) }
└─ @ └─ <invalid location: defmt frame-index: 8>:0
0.000061 INFO Hello, World!└─ @ └─ <invalid location: defmt frame-index: 9>:0
1.000305 INFO Hello, World!└─ @ └─ <invalid location: defmt frame-index: 9>:0
2.000610 INFO Hello, World!└─ @ └─ <invalid location: defmt frame-index: 9>:0
同时能看到两个led在轮流点亮了。
查看下bin大小,大致10k,稍微偏大了点,可能是引入embassy调度器的原因,不知道还有没有办法再压缩一点。
~/r/disc (main) [102]> size target/thumbv7em-none-eabi/release/disc
text data bss dec hex filename
9820 112 5332 15264 3ba0 target/thumbv7em-none-eabi/release/disc
点灯在嵌入式中相当于 "hello world!"例程, 下一步,可以在此基础上,调试其他更复杂的功能模块。
作者:yeamon