Как передать API stm32f3discovery в функцию?

Я пытаюсь создать отдельный файл / модуль с функциями, которые могут работать со светодиодами или гироскопом для stm32f3discovery. Я пытаюсь передать API stm32f3, который содержит все регистры, в функцию, чтобы затем использовать ее внутри.

Когда я запускаю этот код, я получаю сообщение об ошибке: "Нет поля '###' для типа '##'". Как я могу это сделать?

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| {
   |               ^^^

У него есть эта ошибка для всех вызовов любого из регистров

1 ответ

Вместо того, чтобы использовать общий тип, чтобы попытаться заставить нас передать тип, которого вы не знаете, используйте что-то вроде:

пусть my_name: () = 39,2;

Это выдаст ошибку, которая сообщит вам, какое значение имеет значение справа, и вы можете использовать это, чтобы определить, какой тип данных вы можете передать в функцию. Как показано при печати типа переменной в ржавчине

Другие вопросы по тегам