#hal #stm32-hal #cortex-m #stm32 #arm

no-std stm32f1xx-hal

STM32F1xx系列微控制器的HAL库

16个版本 (9个重大更新)

0.10.0 2022年12月13日
0.9.0 2022年3月3日
0.8.0 2021年12月29日
0.7.0 2020年10月17日
0.1.1 2018年12月17日

#47 in 嵌入式开发

Download history 697/week @ 2024-03-13 669/week @ 2024-03-20 816/week @ 2024-03-27 708/week @ 2024-04-03 556/week @ 2024-04-10 845/week @ 2024-04-17 775/week @ 2024-04-24 573/week @ 2024-05-01 519/week @ 2024-05-08 566/week @ 2024-05-15 597/week @ 2024-05-22 649/week @ 2024-05-29 469/week @ 2024-06-05 498/week @ 2024-06-12 536/week @ 2024-06-19 385/week @ 2024-06-26

1,986 每月下载量
用于 36 个软件包 (33 直接使用)

MIT/Apache

550KB
8K SLoC

stm32f1xx-hal

HAL for the STM32F1 family of microcontrollers

Continuous integration crates.io Released API docs

快速入门指南

嵌入式Rust开发需要比普通开发更多的设置。对于本指南,我们假设您正在使用stm32 blue pill板(如下所示),但如果您有其他f1微控制器,您应该能够进行适配。

blue pill pinout

您还需要一个调试器,例如用于编程和调试的 stlink v3 mini。 (市场上有很多不同的STLink调试器,它们都应该与以下说明一起使用,其他JTAG或SWD调试器也可以使用,但可能需要不同的软件或配置)。

安装软件

要编程微控制器,您需要安装

  • openocd
  • gdb-multiarch (在某些平台上,您可能需要使用 gdb-arm-none-eabi,请确保更新 .cargo/config 以反映此更改)

最后,您需要为Rust编译器安装arm目标支持。为此,请运行

rustup target install thumbv7m-none-eabi

设置您的项目

像往常一样使用 cargo init 创建一个新的Rust项目。嵌入式开发的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 如何链接我们的可执行文件以及如何在内存中布局结果。为了完成所有这些,将 .cargo/configmemory.x 从stm32f1xx-hal存储库复制到您的项目中。

cargo build

如果一切顺利,您的项目应该可以无错误地构建。

编程微控制器

现在是时候在硬件上实际运行代码了。要做到这一点,将您的调试探针插入蓝莓板并使用

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将无法编译。

您可能还需要使用 mediumhighxl 来指定设备的密度以启用某些外设。通常,密度可以通过设备名称中的数字后的第二个字符确定(例如,对于STM32F103C6U,6表示低密度设备),但请检查数据表或CubeMX以确定。

  • 4, 6 => 低密度,无需功能
  • 8, B => medium 功能
  • C, D, E => high 功能
  • F, G => xl 功能

对于 connectivity linestm32f105stm32f107)的微控制器,无需指定密度功能。

支持的微控制器

  • 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

作为依赖项使用

当将此crate作为项目依赖项时,微控制器可以作为 Cargo.toml 定义的一部分指定。

[dependencies.stm32f1xx-hal]
version = "0.9.0"
features = ["stm32f100", "rt"]

文档

文档可以在 docs.rs 找到。

许可证

许可如下之一

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交的任何旨在包含在本作品中的有意贡献,应按照上述双重许可,没有任何附加条款或条件。

依赖项

~18MB
~515K SLoC