【问题标题】:the trait `_embedded_hal_digital_InputPin` is not implemented for `PE2<Output<OpenDrain>>``PE2<Output<OpenDrain>>` 没有实现特征 `_embedded_hal_digital_InputPin`
【发布时间】:2021-06-23 08:40:21
【问题描述】:

我正在尝试为我的 STM32F303VC 使用 DHT11

我收到错误:

error[E0277]: trait bound `PE2>: _embedded_hal_digital_InputPin` 不满足
  --> src/DHT11/auxiliary/src/lib.rs:51:32
   |
51 |  让 mut dht11 = Dht11::new(pin);
   |  ^^^ 特性 `_embedded_hal_digital_InputPin` 没有为 `PE2>` 实现
   |
   = :因为对 `PE2>` 的 `embedded_hal::digital::v2::InputPin` 的 impl 有要求,所以需要
   = 注意:`Dht11::::new` 需要

My Error Image:

我的代码在辅助模块是:

    //! Initialization code

#![no_std]

#[allow(unused_extern_crates)] //  bug rust-lang/rust#53964
extern crate panic_itm; // panic handler

pub use cortex_m::{asm::bkpt, iprint, iprintln};
pub use cortex_m_rt::entry;
pub use f3::hal::{delay::Delay, prelude, stm32f30x::i2c1};
pub use f3::led::{Direction, Leds};
pub use m::Float as _0;
pub use f3::hal::stm32f30x::{gpioc, rcc};
pub use dht11::{self,Measurement,Dht11};
pub use stm32f30x_hal::gpio;
use f3::hal::stm32f30x::{self, GPIOE, RCC};
pub use embedded_hal::digital::v2::OutputPin;
pub use embedded_hal::digital::v2::InputPin;

use cortex_m::peripheral::ITM;
use f3::{
    hal::{
        i2c::I2c,
        prelude::*,
    },
    Lsm303dlhc,
};

pub fn init() -> (Delay, ITM, Leds, Dht11<GPIOE>) {
    (stm32f30x::Peripherals::take().unwrap());
    let cp = cortex_m::Peripherals::take().unwrap();
    let dp = stm32f30x::Peripherals::take().unwrap();

    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();

    let clocks = rcc.cfgr.freeze(&mut flash.acr);
    
    let gpioe = dp.GPIOE.split(&mut rcc.ahb);
    let leds = Leds::new(gpioe);

    let mut gpiob = dp.GPIOB.split(&mut rcc.ahb);
    let scl = gpiob.pb6.into_af4(&mut gpiob.moder, &mut gpiob.afrl);
    let sda = gpiob.pb7.into_af4(&mut gpiob.moder, &mut gpiob.afrl);

    let i2c = I2c::i2c1(dp.I2C1, (scl, sda), 400.khz(), clocks, &mut rcc.apb1);
    let pin = gpioe.pe2.into_open_drain_output(&mut gpioe.moder,&mut gpioe.otyper);

    let delay = Delay::new(cp.SYST, clocks);
    
    let mut dht11 = Dht11::new(pin);

    (delay, cp.ITM, leds, dht11)
}

我的 main.rs 代码是:

    #![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux19::{entry, iprint, iprintln, prelude::*, Direction};
use aux19::{prelude::_embedded_hal_blocking_delay_DelayMs};
use m::Float;
// Slave address
const MAGNETOMETER: u8 = 0b001_1110;


#[entry]
fn main() -> ! {
    let (mut delay, mut itm,mut leds,mut dth11) = aux18::init();

    loop {
        match dht11.perform_measurement(&mut delay) {
            Ok(meas) => iprintln!(&mut itm.stim[0],"Temp: {} Hum: {}", meas.temperature, meas.humidity).unwrap(),
            Err(e) => iprintln!(&mut itm.stim[0],"Error: {:?}", e).unwrap(),
        };

        delay.delay_ms(2_000_u16);
    }
}

【问题讨论】:

    标签: rust compiler-errors embedded stm32


    【解决方案1】:

    Dht11::new 期望引脚是输入引脚,即实现 embedded_hal::digital::v2::InputPin 的类型。在您的辅助模块中,您将引脚配置为输出引脚,这与您需要做的相反:

    let pin = gpioe.pe2.into_open_drain_output(&mut gpioe.moder,&mut gpioe.otyper);
    

    您使用的 HAL 库有多种方法可以将引脚置于输入模式。 into_floating_input 可能适用于您的用例。如果需要上拉或下拉电阻,还有into_pull_down_inputinto_pull_up_input。见reference documentation(出于某种原因,您需要通过单击“+”来展开实现块以查看方法;这也使我无法直接链接到它们)。

    使用其中一个应该可以解决此错误。

    【讨论】:

    • Hanno Braun 感谢您的快速响应。我已经尝试了所有输入法,现在输入和输出出现两个错误imgur.com/7wxeG5Y 此外,Dht11 已为 InputPin 和 OutputPin docs.rs/dht11/0.3.1/dht11/struct.Dht11.html#method.new 实现,我该如何实现?
    • 嗯,我不知道。这是一个奇怪的要求,而且我还没有见过这么远的司机。我不确定大多数 HAL 库是否能够满足该要求。想法: 1. 创建一个enum MyPin,其中包含输入和输出的变体。每个变体都将您的引脚(在各自的状态)作为一个字段。 2. 为您的枚举实现InputPinOutputPin。在这些特征实现中,如有必要,请切换引脚的模式。另一种方法是搜索Dht11 的其他用法示例,看看他们是如何做到的。不知道为什么会出现这两个错误。
    猜你喜欢
    • 2021-07-18
    • 2022-01-26
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2023-04-04
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多