如何将 stm32f3discovery API 传递给函数?
Posted
技术标签:
【中文标题】如何将 stm32f3discovery API 传递给函数?【英文标题】:How to pass a stm32f3discovery API into a function? 【发布时间】:2020-08-28 14:07:09 【问题描述】:我正在尝试创建一个单独的文件/模块,该文件/模块具有可以处理 stm32f3discovery 的 LED 或陀螺仪的功能。我正在尝试将保存所有寄存器的 stm32f3 API 传递到一个函数中,然后在其中使用。
当我运行此代码时,我收到一条错误消息,提示“类型 '##' 上没有字段 '###'”。我该怎么做?
main.rs
#![no_std]
#![no_main]
use stm32f3::stm32f303;
mod my_api;
#[entry]
fn main() -> !
let periph = stm32f303::Peripherals::take().unwrap();
let gpioe = periph.GPIOE;
let rcc = periph.RCC;
my_api::led::setup_led(&gpioe, &rcc);
loop
my_api::led::all_led_on(&gpioe);
my_api.rs
pub mod led
pub fn setup_led<G, R>(gpio: &G, rcc: &R)
*rcc.ahbenr.modify(|_, w| w.iopeen().set_bit()); //enables clock
*gpio.moder.modify(|_, w|
w.moder8().bits(0b01);
w.moder9().bits(0b01);
w.moder10().bits(0b01);
w.moder11().bits(0b01);
w.moder12().bits(0b01);
w.moder13().bits(0b01);
w.moder14().bits(0b01);
w.moder15().bits(0b01)
);
pub fn all_led_on<G>(gpio: &G)
*gpio.odr.modify(|_, w|
w.odr8().set_bit();
w.odr9().set_bit();
w.odr10().set_bit();
w.odr11().set_bit();
w.odr12().set_bit();
w.odr13().set_bit();
w.odr14().set_bit();
w.odr15().set_bit()
);
pub fn all_led_off<G>(gpio: &G)
*gpio.odr.modify(|_, w|
w.odr8().clear_bit();
w.odr9().clear_bit();
w.odr10().clear_bit();
w.odr11().clear_bit();
w.odr12().clear_bit();
w.odr13().clear_bit();
w.odr14().clear_bit();
w.odr15().clear_bit()
);
错误
error[E0609]: no field `odr` on type `&G`
--> src/my_api.rs:30:15
|
29 | pub fn all_led_off <G> (gpio: &G)
| - type parameter 'G' declared here
30 | *gpio.odr.modify(|_,w|
| ^^^
对任何寄存器的所有调用都会出现此错误
【问题讨论】:
你为什么输入pub fn setup_led<G, R>
?
看来Is it possible to access struct fields from within a trait? 的答案可能会回答您的问题。如果没有,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
当然,因为我没有使用任何与特征或任何类型的 OOP 相关的东西,只是试图传递新函数使用的 api,以便我可以多次运行一位代码次,那么它与其他帖子没有太大关系,尽管如果我错了请纠正我,因为你肯定会比我有更多的经验
你为什么输入pub fn setup_led<G, R>
?
因为我不知道 api 将返回的类型,因为我用它来尝试绕过它?你会推荐什么?
【参考方案1】:
不要使用泛型来尝试强制我们传入一个你不知道的类型,而是使用类似的东西:
让 my_name: () = 39.2;
它会给出一个错误,告诉你右边的值是什么,你可以用它来计算你可以传递给函数的数据类型。如图printing variable type in rust
【讨论】:
以上是关于如何将 stm32f3discovery API 传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章
我的 EXTI0 中断处理程序没有被覆盖/工作正常(STM32F3Discovery)