如何从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-rt
和 stm32f30x
板条箱为 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