1个不稳定版本
0.8.0 | 2021年7月25日 |
---|
#1747 in 嵌入式开发
28 每月下载量
用于 2 crates
535KB
6.5K SLoC
stm32f1xx-hal
HAL for the STM32F1 family of microcontrollers
快速入门指南
嵌入式Rust开发比普通开发需要更多设置。对于本指南,我们假设您正在使用stm32 blue pill板(如下所示),但如果您有其他f1微控制器,您应该能够适应它。
您还需要一个调试器,例如用于编程和调试的 stlink v3 mini。 (市场上有很多不同的STLink调试器,所有这些调试器 都应该 在此处提供的说明下工作良好,其他JTAG或SWD调试器也可以工作,但可能需要不同的软件或配置)。
安装软件
要编程您的微控制器,您需要安装
- openocd
gdb-multiarch
(在某些平台上,您可能需要使用gdb-arm-none-eabi
代替,请确保更新.cargo/config
以反映此更改)
最后,您需要为Rust编译器安装arm目标支持。要这样做,请运行
rustup target install thumbv7m-none-eabi
设置您的项目
创建一个新的Rust项目,就像您通常使用 cargo init
一样。嵌入式开发的hello world通常是闪烁一个LED,相关的代码在 examples/blinky.rs 中。将该文件复制到您的项目的 main.rs
中。
您还需要将一些依赖项添加到您的 Cargo.toml
[dependencies]
embedded-hal = "0.2.3"
nb = "0.1.2"
cortex-m = "0.6.2"
cortex-m-rt = "0.6.11"
# Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives
panic-halt = "0.2.0"
[dependencies.stm32f1xx-hal]
version = "0.6.1"
features = ["rt", "stm32f103", "medium"]
如果您现在构建项目,您应该会得到一个错误: error: language item required, but not found: eh_personality
。这个无用的错误信息可以通过为正确的目标编译来解决。
我们还需要告诉 Rust 如何链接我们的可执行文件以及如何在内存中布局结果。为了完成所有这些,请从stm32f1xx-hal仓库复制 .cargo/config 和 memory.x 到您的项目中。
cargo build
如果一切顺利,您的项目应该可以无错误地构建。
编程微控制器
现在是时候在实际硬件上运行代码了。要做到这一点,请将您的调试探头插入到蓝色药丸中,并使用以下方法启动 openocd
。
openocd -f interface/stlink-v3.cfg -f target/stm32f1x.cfg
如果您不是使用stlink V3,请相应地更改接口。更多信息,请参阅 embeddonomicon。
如果一切顺利,它应该检测到您的微控制器并显示 Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
。请在后台保持其运行。
我们将使用gdb将编译的二进制文件上传到微控制器并进行调试。由于您之前添加的 .cargo/config,Cargo将自动启动 gdb
。gdb
还需要被通知连接到 openocd,这是通过将 .gdbinit 复制到您项目的根目录来完成的。
您可能还需要告诉 gdb
从工作目录加载 .gdbinit
是安全的。
- Linux
echo "set auto-load safe-path $(pwd)" >> ~/.gdbinit
- Windows
echo set auto-load safe-path %CD% >> %USERPROFILE%\.gdbinit
如果一切顺利,cargo应该编译您的项目,启动gdb,加载您的程序并为您提供提示。如果您在gdb提示符中输入 continue
,则您的程序应该启动,蓝色药丸上的绿色LED应该开始闪烁。
进一步学习
从现在开始,您可以开始向您的项目添加更多代码,使其执行更有趣的操作。有关crate文档,请参阅 docs.rs/stm32f1xx-hal。还有许多其他 示例 可用。如果文档或示例中的某些内容不清楚,请打开一个问题,我们将努力改进它。
选择微控制器
此crate支持stm32f1系列中的多个微控制器。您想要构建的具体微控制器需要通过功能指定,例如 stm32f103
。
如果没有指定微控制器,crate将无法编译。
您可能还需要使用 medium
、high
或 xl
指定设备的密度以启用某些外围设备。通常,密度可以通过设备名称中的数字后的第二个字符确定(例如,对于STM32F103C6U,6表示低密度设备),但请务必查看数据表或CubeMX以确认。
- 4, 6 => 低密度,无需功能
- 8, B =>
medium
功能 - C, D, E =>
high
功能 - F, G =>
xl
功能
对于 connectivity line
的微控制器(stm32f105
和 stm32f107
),无需指定密度功能。
支持的微控制器
stm32f100
stm32f101
stm32f103
stm32f105
stm32f107
尝试运行示例
您可能需要给 cargo
授予权限,以便从工作目录调用 gdb
。
- Linux
echo "set auto-load safe-path $(pwd)" >> ~/.gdbinit
- Windows
echo set auto-load safe-path %CD% >> %USERPROFILE%\.gdbinit
编译、加载并启动硬件调试器。
$ rustup target add thumbv7m-none-eabi
# on another terminal
$ openocd -f interface/$INTERFACE.cfg -f target/stm32f1x.cfg
# flash and debug the "Hello, world" example. Change stm32f103 to match your hardware
$ cargo run --features stm32f103 --example hello
$INTERFACE
应根据您的调试硬件设置。如果您使用的是 stlink V2,请使用 stlink-v2.cfg
。更多信息,请参阅 embeddonomicon。
作为依赖项使用
当将此包作为项目依赖项使用时,可以在 Cargo.toml
定义中将微控制器指定为部分。
[dependencies.stm32f1xx-hal]
version = "0.6.1"
features = ["stm32f100", "rt"]
文档
文档可以在 docs.rs 找到。
许可证
根据您的选择,许可协议为
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在本作品中的任何贡献,均将根据上述方式双重许可,没有任何附加条款或条件。
依赖项
~19MB
~535K SLoC