一、简要说明
本文主要是参考 Rust 官方的 探索之书 Discovery。
书中使用的开发板为 micro::bit,而我使用的开发板为 野火指南者,其使用的芯片为 stm32f103ve。
下文主要是根据 探索之书 的内容,构建属于我们的开发环境。
二、 工具安装
因为要使用到交叉编译的内容,故先要为 rustup 安装相应 target
。
Arm 系列架构的,可以参考 Build it - Discovery (rust-embedded.org) 。
然后需要添加一些辅助的工具,可参考 主要参考 Setting up a development environment - Discovery (rust-embedded.org)。
其中,我现在安装过了里面的两个工具:
文中还提到几个工具,我还未用过,故先暂下不表。
其中 cargo-embed
是另一个项目 probe-rs
的一部分。probe-rs
的功能相当于 pyOCD 和 openOCD,主要是提供下载、调试等功能。
三、项目的创建
在命令行里,使用 cargo
命令来创建一个空项目。
$ cargo new embed-study
因为我们运行在祼机的环境下,所以我们需要自己实现一些最小的运行时环境。幸运的是,开源世界里提供了相应的帮助。
# 在根目录环境下
$ cargo add cortex-m-rt
cortex-m
表示我们的架构,rt
表示运行时环境。
其工作原理,可参考下面两个网站:
接着需要安装另一个库
$ cargo add panic-halt
此库的主要功能是提供了 panic
产生后的处理方法。
接着实现 src/main.rs 的内容了。主要参考 LED roulette - Discovery (rust-embedded.org)
// ./src/main.rs
#![no_std]
#![no_main]
// 引入 panic 的处理,但因为不是我们使用,
// 为了避免一些不必要的 `unuse` 警告,
// 所以把其定义为 前缀带 下划线
use panic_halt as _;
// 电脑环境下的 main 是根据相应操作系统做了适配
// 而当前是作为交叉编译,而且目标环境与电脑是不一样
// 故上面使用 `#![no_main]` 。
// 但当前 binary crate 总得有一个入口,
// 而 cortex-m-rt 提供一个宏 `entry` 来创建入口
use cortex_m_rt::entry;
#[entry]
fn main() -> ! {
loop {}
}
三、 构建、烧录与调试
在 cortex-m-rt
的文档里有提,我们需要提供一个 memory.x 的文件,用于指明芯片的 Flash
和 Ram
的位置与大小。具体可以参考 Rust嵌入式开发入门(07)--链接脚本是如何串接起来的_哔哩哔哩_bilibili
/* 这里写的可能不正确的 */
/* Linker script for the STM32F103C8T6 */
MEMORY
{
FLASH : ORIGIN = 0x08000000, LENGTH = 64K
RAM : ORIGIN = 0x20000000, LENGTH = 20K
}
然后创建一个文件 .cargo/config.toml
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = [
"-C", "link-arg=-Tlink.x",
]
注意,如果没有 config.toml ,可以编译成功,但烧录时,会出错。可以参考 [src/05-led-roulette]No loadable ELF sections were found · Issue #452 · rust-embedded/discovery · GitHub
还有一个文件,就是 ./Embed.toml。此文件是提供给 cargo-embed
使用的。
[default.general]
# chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
# chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1
# 可以在命令中,使用 `probe-rs chip list > chips.txt`
# 然后在生成的 `chips.txt` 里找到你的芯片类型
chip = "STM32F103VE"
[default.reset]
halt_afterwards = true
[default.rtt]
enabled = false
# 是否开启 gdb 调试
[default.gdb]
enabled = true
四、修改功能
为了能更直观地看到程序是否正常烧录至单片机上,我们把原程序修改下。