2

我想使用 rust 和 the cortex-m-rtand crates 为 STM32F3Discovery 板编写一个程序stm32f30x。更准确地说,我想实现一个我想使用该#[interrupt]属性的外部中断。但是转出口似乎有问题。

cortex-m-rt 关于中断的文档说该#[interrupt]属性不应直接使用,而应使用设备箱中的重新导出:

extern crate device;

// the attribute comes from the device crate not from cortex-m-rt
use device::interrupt;

#[interrupt]
fn USART1() {
    // ..
}

事实上,stm32f3x crate的文档显示 cortex-m-rt crate 中的这个属性被重新导出。但是,编译:

#![no_main]
#![no_std]

use cortex_m_rt::entry;
extern crate stm32f30x;
use stm32f30x::interrupt;

或者

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use stm32f30x::interrupt;

给出错误

error[E0432]: unresolved import `stm32f30x::interrupt`
 --> src\main.rs:9:5
  |
9 | use stm32f30x::interrupt;
  |     ^^^^^^^^^^^---------
  |     |          |
  |     |          help: a similar name exists in the module (notice the capitalization): `Interrupt`
  |     no `interrupt` in the root

我不知道为什么会发生这种情况,因为我遵循的示例也是如此。我在 Cargo.toml 中的依赖项如下所示:

[dependencies]
stm32f30x = "0.8.0"
cortex-m-rt = "0.6.3"
cortex-m = "0.6.3"

我很感激任何帮助:)

4

1 回答 1

2

您需要启用cratert的功能。stm32f30x

简而言之,像这样更改您的依赖项:

[dependencies]
stm32f30x = { version = "0.8.0", features = ["rt"] }
cortex-m-rt = "0.6.3"
cortex-m = "0.6.3"

功能未出现在“功能标志”页面上的原因是因为该版本比“功能标志”本身更早(PR #1144),这就是页面提到“功能标志数据不可用”的原因对于这个版本”。

如果文档没有提到功能。然后是“最简单”的方法来了解问题是否由功能引起。是检查Cargo.toml 是否stm32f30x包含任何功能。然后,寻找任何功能门。在这种情况下,如果您在lib.rs 中查看 re-export,您将看到以下内容:

#[cfg(feature = "rt")]
pub use self::Interrupt as interrupt;
于 2021-01-12T20:31:41.283 回答