如何将 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&lt;G, R&gt; 看来Is it possible to access struct fields from within a trait? 的答案可能会回答您的问题。如果没有,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。 当然,因为我没有使用任何与特征或任何类型的 OOP 相关的东西,只是试图传递新函数使用的 api,以便我可以多次运行一位代码次,那么它与其他帖子没有太大关系,尽管如果我错了请纠正我,因为你肯定会比我有更多的经验 你为什么输入pub fn setup_led&lt;G, R&gt; 因为我不知道 api 将返回的类型,因为我用它来尝试绕过它?你会推荐什么? 【参考方案1】:

不要使用泛型来尝试强制我们传入一个你不知道的类型,而是使用类似的东西:

让 my_name: () = 39.2;

它会给出一个错误,告诉你右边的值是什么,你可以用它来计算你可以传递给函数的数据类型。如图printing variable type in rust

【讨论】:

以上是关于如何将 stm32f3discovery API 传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

我的 EXTI0 中断处理程序没有被覆盖/工作正常(STM32F3Discovery)

STM32F3 DISCOVERY USART 不工作

STM32F3 发现 - 实现 GPIO 中断

配置为使用外部振荡器的 STM32F3 器件上的 RCC 振荡器配置错误

STM32发现F3 SPI环回RXFIFO收不到数据

如何将带有 SPL 的 STM32F3 代码移植到 STM32F7