diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs index 3822d5032..cc7ffdea8 100644 --- a/embassy-stm32/src/adc/f1.rs +++ b/embassy-stm32/src/adc/f1.rs @@ -4,7 +4,7 @@ use core::task::Poll; use embassy_hal_internal::into_ref; -use super::blocking_delay_us; +use super::{blocking_delay_us, InternalChannel}; use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; use crate::time::Hertz; use crate::{interrupt, Peripheral}; @@ -32,6 +32,8 @@ impl interrupt::typelevel::Handler for InterruptHandl } pub struct Vref; +impl InternalChannel for Vref {} +impl super::SealedInternalChannel for Vref {} impl AdcChannel for Vref {} impl super::SealedAdcChannel for Vref { fn channel(&self) -> u8 { @@ -40,6 +42,8 @@ impl super::SealedAdcChannel for Vref { } pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/f3.rs b/embassy-stm32/src/adc/f3.rs index 3f076d64b..363ddbe3a 100644 --- a/embassy-stm32/src/adc/f3.rs +++ b/embassy-stm32/src/adc/f3.rs @@ -4,7 +4,7 @@ use core::task::Poll; use embassy_hal_internal::into_ref; -use super::blocking_delay_us; +use super::{blocking_delay_us, InternalChannel}; use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; use crate::interrupt::typelevel::Interrupt; use crate::time::Hertz; @@ -32,6 +32,8 @@ impl interrupt::typelevel::Handler for InterruptHandl } pub struct Vref; +impl InternalChannel for Vref {} +impl super::SealedInternalChannel for Vref {} impl AdcChannel for Vref {} impl super::SealedAdcChannel for Vref { fn channel(&self) -> u8 { @@ -47,6 +49,8 @@ impl Vref { } pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/f3_v1_1.rs b/embassy-stm32/src/adc/f3_v1_1.rs index 106956989..73bfe4876 100644 --- a/embassy-stm32/src/adc/f3_v1_1.rs +++ b/embassy-stm32/src/adc/f3_v1_1.rs @@ -6,7 +6,7 @@ use embassy_futures::yield_now; use embassy_hal_internal::into_ref; use embassy_time::Instant; -use super::Resolution; +use super::{InternalChannel, Resolution}; use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; use crate::interrupt::typelevel::Interrupt; use crate::time::Hertz; @@ -64,6 +64,8 @@ fn update_vref(op: i8) { } pub struct Vref(core::marker::PhantomData); +impl InternalChannel for Vref {} +impl super::SealedInternalChannel for Vref {} impl AdcChannel for Vref {} impl super::SealedAdcChannel for Vref { fn channel(&self) -> u8 { @@ -123,6 +125,8 @@ impl Drop for Vref { } pub struct Temperature(core::marker::PhantomData); +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs index ce7f5db70..f9751bd92 100644 --- a/embassy-stm32/src/adc/g4.rs +++ b/embassy-stm32/src/adc/g4.rs @@ -2,7 +2,7 @@ use pac::adc::vals::{Adcaldif, Difsel, Exten}; use pac::adccommon::vals::Presc; -use super::{blocking_delay_us, Adc, AdcChannel, Instance, Resolution, SampleTime}; +use super::{blocking_delay_us, Adc, AdcChannel, Instance, InternalChannel, Resolution, SampleTime}; use crate::time::Hertz; use crate::{pac, Peripheral}; @@ -33,6 +33,8 @@ const VBAT_CHANNEL: u8 = 17; // NOTE: Vrefint/Temperature/Vbat are not available on all ADCs, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs /// Internal voltage reference channel. pub struct VrefInt; +impl InternalChannel for VrefInt {} +impl super::SealedInternalChannel for VrefInt {} impl AdcChannel for VrefInt {} impl super::SealedAdcChannel for VrefInt { fn channel(&self) -> u8 { @@ -42,6 +44,8 @@ impl super::SealedAdcChannel for VrefInt { /// Internal temperature channel. pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { @@ -51,6 +55,8 @@ impl super::SealedAdcChannel for Temperature { /// Internal battery voltage channel. pub struct Vbat; +impl InternalChannel for Vbat {} +impl super::SealedInternalChannel for Vbat {} impl AdcChannel for Vbat {} impl super::SealedAdcChannel for Vbat { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index 6a3d0f44c..3e62b6f3b 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs @@ -61,7 +61,7 @@ trait SealedInstance { } pub(crate) trait SealedAdcPin {} - +pub(crate) trait SealedInternalChannel {} pub(crate) trait SealedAdcChannel { #[cfg(any(adc_v1, adc_l0, adc_v2, adc_g4, adc_v4))] fn setup(&mut self) {} @@ -126,6 +126,9 @@ pub trait Instance: SealedInstance + crate::Peripheral

+ crate::rcc::R /// ADC pin. #[allow(private_bounds)] pub trait AdcPin: AdcChannel + SealedAdcPin {} +/// ADC internal channel. +#[allow(private_bounds)] +pub trait InternalChannel: SealedInternalChannel {} /// ADC channel. #[allow(private_bounds)] pub trait AdcChannel: SealedAdcChannel + Sized { diff --git a/embassy-stm32/src/adc/v1.rs b/embassy-stm32/src/adc/v1.rs index 090790c39..abd58952d 100644 --- a/embassy-stm32/src/adc/v1.rs +++ b/embassy-stm32/src/adc/v1.rs @@ -6,7 +6,7 @@ use embassy_hal_internal::into_ref; #[cfg(adc_l0)] use stm32_metapac::adc::vals::Ckmode; -use super::blocking_delay_us; +use super::{blocking_delay_us, InternalChannel}; use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime}; use crate::interrupt::typelevel::Interrupt; use crate::peripherals::ADC1; @@ -35,6 +35,12 @@ impl interrupt::typelevel::Handler for InterruptHandl #[cfg(not(adc_l0))] pub struct Vbat; +#[cfg(not(adc_l0))] +impl InternalChannel for Vbat {} + +#[cfg(not(adc_l0))] +impl super::SealedInternalChannel for Vbat {} + #[cfg(not(adc_l0))] impl AdcChannel for Vbat {} @@ -46,6 +52,8 @@ impl super::SealedAdcChannel for Vbat { } pub struct Vref; +impl InternalChannel for Vref {} +impl super::SealedInternalChannel for Vref {} impl AdcChannel for Vref {} impl super::SealedAdcChannel for Vref { fn channel(&self) -> u8 { @@ -54,6 +62,8 @@ impl super::SealedAdcChannel for Vref { } pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs index 033108195..f7b791903 100644 --- a/embassy-stm32/src/adc/v2.rs +++ b/embassy-stm32/src/adc/v2.rs @@ -1,6 +1,6 @@ use embassy_hal_internal::into_ref; -use super::blocking_delay_us; +use super::{blocking_delay_us, InternalChannel}; use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime}; use crate::peripherals::ADC1; use crate::time::Hertz; @@ -12,6 +12,8 @@ pub const VREF_DEFAULT_MV: u32 = 3300; pub const VREF_CALIB_MV: u32 = 3300; pub struct VrefInt; +impl InternalChannel for VrefInt {} +impl super::SealedInternalChannel for VrefInt {} impl AdcChannel for VrefInt {} impl super::SealedAdcChannel for VrefInt { fn channel(&self) -> u8 { @@ -27,6 +29,8 @@ impl VrefInt { } pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { @@ -48,6 +52,8 @@ impl Temperature { } pub struct Vbat; +impl InternalChannel for Vbat {} +impl super::SealedInternalChannel for Vbat {} impl AdcChannel for Vbat {} impl super::SealedAdcChannel for Vbat { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index be857f4dd..36e0e3df3 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs @@ -1,7 +1,7 @@ use cfg_if::cfg_if; use embassy_hal_internal::into_ref; -use super::blocking_delay_us; +use super::{blocking_delay_us, InternalChannel}; use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime}; use crate::Peripheral; @@ -11,6 +11,8 @@ pub const VREF_DEFAULT_MV: u32 = 3300; pub const VREF_CALIB_MV: u32 = 3000; pub struct VrefInt; +impl InternalChannel for VrefInt {} +impl super::SealedInternalChannel for VrefInt {} impl AdcChannel for VrefInt {} impl super::SealedAdcChannel for VrefInt { fn channel(&self) -> u8 { @@ -30,6 +32,8 @@ impl super::SealedAdcChannel for VrefInt { } pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { @@ -49,6 +53,8 @@ impl super::SealedAdcChannel for Temperature { } pub struct Vbat; +impl InternalChannel for Vbat {} +impl super::SealedInternalChannel for Vbat {} impl AdcChannel for Vbat {} impl super::SealedAdcChannel for Vbat { fn channel(&self) -> u8 { @@ -70,6 +76,8 @@ impl super::SealedAdcChannel for Vbat { cfg_if! { if #[cfg(adc_h5)] { pub struct VddCore; + impl InternalChannel for VddCore {} + impl super::SealedInternalChannel for VddCore {} impl AdcChannel for VddCore {} impl super::SealedAdcChannel for VddCore { fn channel(&self) -> u8 { @@ -82,6 +90,8 @@ cfg_if! { cfg_if! { if #[cfg(adc_u0)] { pub struct DacOut; + impl InternalChannel for DacOut {} + impl super::SealedInternalChannel for DacOut {} impl AdcChannel for DacOut {} impl super::SealedAdcChannel for DacOut { fn channel(&self) -> u8 { diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs index f564114c2..bf3a55797 100644 --- a/embassy-stm32/src/adc/v4.rs +++ b/embassy-stm32/src/adc/v4.rs @@ -2,7 +2,7 @@ use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; use pac::adccommon::vals::Presc; -use super::{blocking_delay_us, Adc, AdcChannel, Instance, Resolution, SampleTime}; +use super::{blocking_delay_us, Adc, AdcChannel, Instance, InternalChannel, Resolution, SampleTime}; use crate::time::Hertz; use crate::{pac, Peripheral}; @@ -33,6 +33,8 @@ const VBAT_CHANNEL: u8 = 17; // NOTE: Vrefint/Temperature/Vbat are not available on all ADCs, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs /// Internal voltage reference channel. pub struct VrefInt; +impl InternalChannel for VrefInt {} +impl super::SealedInternalChannel for VrefInt {} impl AdcChannel for VrefInt {} impl super::SealedAdcChannel for VrefInt { fn channel(&self) -> u8 { @@ -42,6 +44,8 @@ impl super::SealedAdcChannel for VrefInt { /// Internal temperature channel. pub struct Temperature; +impl InternalChannel for Temperature {} +impl super::SealedInternalChannel for Temperature {} impl AdcChannel for Temperature {} impl super::SealedAdcChannel for Temperature { fn channel(&self) -> u8 { @@ -51,6 +55,8 @@ impl super::SealedAdcChannel for Temperature { /// Internal battery voltage channel. pub struct Vbat; +impl InternalChannel for Vbat {} +impl super::SealedInternalChannel for Vbat {} impl AdcChannel for Vbat {} impl super::SealedAdcChannel for Vbat { fn channel(&self) -> u8 {