使用Rust编写嵌入式固件入门教程


微控制器 (MCU) 在现代电子产品中无处不在。这些组合硬件/软件的设备称为嵌入式设备,它们的软件通常是用 C 或 C++ 编写的。Rust是一种现代语言,最近成为一种可行的替代方案。本文探讨了 Rust 在嵌入式方面的功能,并为使用它编写固件提供了一个起点。它包含您可能已经熟悉的有关嵌入式编程和 Rust 的介绍性信息;您可能希望向下滚动并跳至代码示例。
入门

  • 安装Rust
  • 为您的 MCU 安装编译目标。即,运行rustup target add thumbv7em-none-eabihf。
  • 安装闪存和调试工具:cargo install flip-link, cargo install probe-run. 请注意,您也可以使用 OpenOCD,尽管我们认为此处的 Knurling 工具更易于使用。
  • 克隆STM32-HAL 快速入门存储库:git clone https://github.com/David-OConnor/stm32-hal-quickstart。请注意,这是对Knurling App Template的薄包装。此处使用的特定硬件抽象层 (HAL) 库将有助于我们处理更高级别的示例,但对前几个示例没有任何影响。

或者,您可以使用 创建一个新项目cargo new --lib projectname,并添加所需的代码。使用上述模板的一个优点是它提供了一些与嵌入式一起使用所需的样板,例如.config.TOML指定编译器目标,以及memory.x指定 MCU 的闪存和 RAM 量。您很可能最终会得到自己的模板或针对您的特定用例或 MCU 量身定制的模板。
主程序代码位于src/main.rs. 它包括使您的程序与 Knurling 调试和闪存工具一起工作的设置代码,以及我们将在本文后面使用的高级 API 的示例导入。
您不需要特殊的 IDE 来使用 Rust 编写和闪存嵌入:您可以在您选择的代码编辑器中编写,并使用终端来编译和闪存您的代码(运行cargo run --release)。在的IntelliJ Rust插件是非常好的,并且与所有的IntelliJ IDE,包括克利翁和PyCharm兼容。带有rust-analyzer插件的VsCode是另一个不错的选择。
 
刷机调试
使用上面创建的设置时,要编译和刷写,请运行cargo run --release. 或简写:cargo r --release. 
与不使用release相比,使用发布release模式需要更长的编译时间,但使用非发布模式固件会导致性能和内存问题。
这是由于我们安装了探针运行工具: cargo/config.toml以及模板中提供的文件。
要为生产刷写最终的固件,您可能需要创建一个独立的二进制文件。要做到这一点的方法之一是cargo binutils
你可以用这个命令来安装:cargo install cargo-binutils。
然后,您可以用此命编译一个独立的二进制文件:cargo objcopy --release -- -O binary target/firmware.bin。
然后,您可以使用 Stm32CubeProgrammer 或 dfu-util 之类的工具来刷新 MCU。
要使用上述设置打印到终端,我们可以使用如下defmt命令:defmt::println!("Pin state: {}", pin_state);, 或defmt::error!("Oh no!");。
有关调试功能的详细信息,请查看Defmt 的官方指南
 
直接写寄存器
本示例中的主要程序逻辑将位于上面直接创建的项目中,在src/main.rs. 它使用Cortex-M 库作为主干,并且可以执行计算。为了与世界交互(输入/输出),您通常会使用 MCU 上的外设,包括通用输入/输出 (GPIO) 引脚、模数和数模(ADC 和 DAC)外设,以及SPI、I²C 和 UART 等通信协议外设。
...
更多点击标题见原文