如何从stm32f30x中的cortex-m-rt获取中断重新导出以运行

Posted

技术标签:

【中文标题】如何从stm32f30x中的cortex-m-rt获取中断重新导出以运行【英文标题】:How to get the interrupt reexport from cortex-m-rt in stm32f30x to run 【发布时间】:2021-04-17 20:23:52 【问题描述】:

我想使用 rust 和 cortex-m-rtstm32f30x 板条箱为 STM32F3Discovery 板编写程序。更准确地说,我想实现一个外部中断,我想为其使用#[interrupt] 属性。但是转出口好像有问题。

cortex-m-rt documentation on interrupts 表示不应直接使用 #[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 板条箱中的此属性已重新导出。但是,编译:

#![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

我不知道为什么会发生这种情况,因为 example I followed 也是这样做的。我在 Cargo.toml 中的依赖项如下所示:

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

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

您需要启用stm32f30x crate 的rt 功能。

简而言之,像这样改变你的依赖:

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

功能没有出现在 "Features flags" page 上的原因是因为该版本比“功能标志”本身 (PR #1144) 更早,这就是为什么页面提到“功能标志数据不是可用于此版本”。

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

#[cfg(feature = "rt")]
pub use self::Interrupt as interrupt;

【讨论】:

谢谢,该解决方案对我有用 :) 但它让我想到为什么这里没有记录该功能:docs.rs/crate/stm32f30x/0.8.0/features? 不客气! :) 我已经更新了答案以对此有所了解

以上是关于如何从stm32f30x中的cortex-m-rt获取中断重新导出以运行的主要内容,如果未能解决你的问题,请参考以下文章

如何让STM32F429NI中的bootloader跳转到外部Nor Flash

如何在 stm32f107 芯片上禁用/启用中断?

STM32F4 上的 USB 音频输入

stm32f4 如何往外部存储sram写数据

STM32F103RB - 如何知道使用哪个引脚发送触发信号

STM32F0 DMA“输入溢出”