pub trait Peripheral: Sized + Sealed {
type P;
// Required method
unsafe fn clone_unchecked(&self) -> Self::P;
// Provided methods
fn into_ref<'a>(self) -> PeripheralRef<'a, Self::P>
where Self: 'a { ... }
fn map_into<U>(self) -> U
where Self::P: Into<U>,
U: Peripheral<P = U> { ... }
fn map<U>(self, transform: impl FnOnce(Self::P) -> U) -> U
where U: Peripheral<P = U> { ... }
}
Expand description
Trait for any type that can be used as a peripheral of type P
.
This is used in driver constructors, to allow passing either owned
peripherals (e.g. UART0
), or borrowed peripherals (e.g. &mut UART0
).
For example, if you have a driver with a constructor like this:
impl<'d, T> Uart<'d, T, Blocking> {
pub fn new<TX: PeripheralOutput, RX: PeripheralInput>(
uart: impl Peripheral<P = T> + 'd,
rx: impl Peripheral<P = RX> + 'd,
tx: impl Peripheral<P = TX> + 'd,
) -> Result<Self, Error> {
Ok(Self { .. })
}
}
You may call it with owned peripherals, which yields an instance that can
live forever ('static
):
let mut uart: Uart<'static, ...> = Uart::new(p.UART0, p.GPIO0, p.GPIO1);
Or you may call it with borrowed peripherals, which yields an instance that can only live for as long as the borrows last:
let mut uart: Uart<'_, ...> = Uart::new(&mut p.UART0, &mut p.GPIO0, &mut p.GPIO1);
§Implementation details, for HAL authors
When writing a HAL, the intended way to use this trait is to take impl Peripheral<P = ..>
in the HAL’s public API (such as driver constructors),
calling .into_ref()
to obtain a PeripheralRef
, and storing that in the
driver struct.
.into_ref()
on an owned T
yields a PeripheralRef<'static, T>
.
.into_ref()
on an &'a mut T
yields a PeripheralRef<'a, T>
.
Required Associated Types§
Required Methods§
Sourceunsafe fn clone_unchecked(&self) -> Self::P
unsafe fn clone_unchecked(&self) -> Self::P
Unsafely clone (duplicate) a peripheral singleton.
§Safety
This returns an owned clone of the peripheral. You must manually ensure
only one copy of the peripheral is in use at a time. For example, don’t
create two SPI drivers on SPI1
, because they will “fight” each other.
You should strongly prefer using into_ref()
instead. It returns a
PeripheralRef
, which allows the borrow checker to enforce this at
compile time.
Provided Methods§
Sourcefn into_ref<'a>(self) -> PeripheralRef<'a, Self::P>where
Self: 'a,
fn into_ref<'a>(self) -> PeripheralRef<'a, Self::P>where
Self: 'a,
Convert a value into a PeripheralRef
.
When called on an owned T
, yields a PeripheralRef<'static, T>
.
When called on an &'a mut T
, yields a PeripheralRef<'a, T>
.
Sourcefn map_into<U>(self) -> Uwhere
Self::P: Into<U>,
U: Peripheral<P = U>,
fn map_into<U>(self) -> Uwhere
Self::P: Into<U>,
U: Peripheral<P = U>,
Map the peripheral using Into
.
This converts from Peripheral<P = T>
to Peripheral<P = U>
,
using an Into
impl to convert from T
to U
.
Sourcefn map<U>(self, transform: impl FnOnce(Self::P) -> U) -> Uwhere
U: Peripheral<P = U>,
fn map<U>(self, transform: impl FnOnce(Self::P) -> U) -> Uwhere
U: Peripheral<P = U>,
Map the peripheral using Into
.
This converts from Peripheral<P = T>
to Peripheral<P = U>
,
using an Into
impl to convert from T
to U
.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl<T, P> Peripheral for &mut Twhere
T: Peripheral<P = P>,
impl<T, P> Peripheral for &mut Twhere
T: Peripheral<P = P>,
Implementors§
Source§impl Peripheral for AnyI2sDmaChannel
Available on crate feature unstable
only.
impl Peripheral for AnyI2sDmaChannel
unstable
only.type P = AnyI2sDmaChannel
Source§impl Peripheral for AnyI2sDmaRxChannel
Available on crate feature unstable
only.
impl Peripheral for AnyI2sDmaRxChannel
unstable
only.type P = AnyI2sDmaRxChannel
Source§impl Peripheral for AnyI2sDmaTxChannel
Available on crate feature unstable
only.
impl Peripheral for AnyI2sDmaTxChannel
unstable
only.type P = AnyI2sDmaTxChannel
Source§impl Peripheral for AnySpiDmaChannel
Available on crate feature unstable
only.
impl Peripheral for AnySpiDmaChannel
unstable
only.type P = AnySpiDmaChannel
Source§impl Peripheral for AnySpiDmaRxChannel
Available on crate feature unstable
only.
impl Peripheral for AnySpiDmaRxChannel
unstable
only.type P = AnySpiDmaRxChannel
Source§impl Peripheral for AnySpiDmaTxChannel
Available on crate feature unstable
only.
impl Peripheral for AnySpiDmaTxChannel
unstable
only.type P = AnySpiDmaTxChannel
Source§impl Peripheral for I2s0DmaChannel
Available on crate feature unstable
only.
impl Peripheral for I2s0DmaChannel
unstable
only.type P = I2s0DmaChannel
Source§impl Peripheral for I2s1DmaChannel
Available on crate feature unstable
only.
impl Peripheral for I2s1DmaChannel
unstable
only.type P = I2s1DmaChannel
Source§impl Peripheral for Spi2DmaChannel
Available on crate feature unstable
only.
impl Peripheral for Spi2DmaChannel
unstable
only.type P = Spi2DmaChannel
Source§impl Peripheral for Spi3DmaChannel
Available on crate feature unstable
only.
impl Peripheral for Spi3DmaChannel
unstable
only.type P = Spi3DmaChannel
Source§impl Peripheral for InputConnection
Available on crate feature unstable
only.
impl Peripheral for InputConnection
unstable
only.type P = InputConnection
Source§impl Peripheral for InputSignal
Available on crate feature unstable
only.
impl Peripheral for InputSignal
unstable
only.type P = InputSignal
Source§impl Peripheral for OutputConnection
Available on crate feature unstable
only.
impl Peripheral for OutputConnection
unstable
only.type P = OutputConnection
Source§impl Peripheral for OutputSignal
Available on crate feature unstable
only.
impl Peripheral for OutputSignal
unstable
only.type P = OutputSignal
Source§impl Peripheral for esp_hal::i2s::master::AnyI2s
Available on crate feature unstable
only.
impl Peripheral for esp_hal::i2s::master::AnyI2s
unstable
only.Source§impl Peripheral for esp_hal::i2s::parallel::AnyI2s
Available on crate feature unstable
only.
impl Peripheral for esp_hal::i2s::parallel::AnyI2s
unstable
only.Source§impl Peripheral for FLASH_ENCRYPTION
impl Peripheral for FLASH_ENCRYPTION
type P = FLASH_ENCRYPTION
Source§impl Peripheral for SW_INTERRUPT
impl Peripheral for SW_INTERRUPT
type P = SW_INTERRUPT
Source§impl Peripheral for AnyTimer
Available on crate feature unstable
only.
impl Peripheral for AnyTimer
unstable
only.Source§impl<'d> Peripheral for OutputOpenDrain<'d>
impl<'d> Peripheral for OutputOpenDrain<'d>
Source§impl<T: Peripheral> Peripheral for PeripheralRef<'_, T>
impl<T: Peripheral> Peripheral for PeripheralRef<'_, T>
type P = <T as Peripheral>::P
Source§impl<const GPIONUM: u8> Peripheral for GpioPin<GPIONUM>where
Self: Pin,
impl<const GPIONUM: u8> Peripheral for GpioPin<GPIONUM>where
Self: Pin,
Source§impl<const NUM: u8> Peripheral for SoftwareInterrupt<NUM>
Available on crate feature unstable
only.
impl<const NUM: u8> Peripheral for SoftwareInterrupt<NUM>
unstable
only.