diff options
| -rw-r--r-- | embassy-stm32/src/adc/mod.rs | 5 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/resolution.rs | 59 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v2.rs | 35 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 35 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v4.rs | 38 |
5 files changed, 67 insertions, 105 deletions
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index 6232678f0..35d84f976 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs | |||
| @@ -11,8 +11,13 @@ mod _version; | |||
| 11 | #[cfg(not(adc_v1))] | 11 | #[cfg(not(adc_v1))] |
| 12 | mod sample_time; | 12 | mod sample_time; |
| 13 | 13 | ||
| 14 | #[cfg(not(any(adc_f1, adc_v1)))] | ||
| 15 | mod resolution; | ||
| 16 | |||
| 14 | #[allow(unused)] | 17 | #[allow(unused)] |
| 15 | pub use _version::*; | 18 | pub use _version::*; |
| 19 | #[cfg(not(any(adc_f1, adc_v1)))] | ||
| 20 | pub use resolution::Resolution; | ||
| 16 | #[cfg(not(adc_v1))] | 21 | #[cfg(not(adc_v1))] |
| 17 | pub use sample_time::SampleTime; | 22 | pub use sample_time::SampleTime; |
| 18 | 23 | ||
diff --git a/embassy-stm32/src/adc/resolution.rs b/embassy-stm32/src/adc/resolution.rs new file mode 100644 index 000000000..354cabfb3 --- /dev/null +++ b/embassy-stm32/src/adc/resolution.rs | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | #[cfg(any(adc_v2, adc_v3, adc_g0))] | ||
| 2 | pub enum Resolution { | ||
| 3 | TwelveBit, | ||
| 4 | TenBit, | ||
| 5 | EightBit, | ||
| 6 | SixBit, | ||
| 7 | } | ||
| 8 | |||
| 9 | #[cfg(adc_v4)] | ||
| 10 | pub enum Resolution { | ||
| 11 | SixteenBit, | ||
| 12 | FourteenBit, | ||
| 13 | TwelveBit, | ||
| 14 | TenBit, | ||
| 15 | EightBit, | ||
| 16 | } | ||
| 17 | |||
| 18 | impl Default for Resolution { | ||
| 19 | fn default() -> Self { | ||
| 20 | #[cfg(any(adc_v2, adc_v3, adc_g0))] | ||
| 21 | { | ||
| 22 | Self::TwelveBit | ||
| 23 | } | ||
| 24 | #[cfg(adc_v4)] | ||
| 25 | { | ||
| 26 | Self::SixteenBit | ||
| 27 | } | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | impl Resolution { | ||
| 32 | pub(super) fn res(&self) -> crate::pac::adc::vals::Res { | ||
| 33 | match self { | ||
| 34 | #[cfg(adc_v4)] | ||
| 35 | Resolution::SixteenBit => crate::pac::adc::vals::Res::SIXTEENBIT, | ||
| 36 | #[cfg(adc_v4)] | ||
| 37 | Resolution::FourteenBit => crate::pac::adc::vals::Res::FOURTEENBITV, | ||
| 38 | Resolution::TwelveBit => crate::pac::adc::vals::Res::TWELVEBIT, | ||
| 39 | Resolution::TenBit => crate::pac::adc::vals::Res::TENBIT, | ||
| 40 | Resolution::EightBit => crate::pac::adc::vals::Res::EIGHTBIT, | ||
| 41 | #[cfg(any(adc_v2, adc_v3, adc_g0))] | ||
| 42 | Resolution::SixBit => crate::pac::adc::vals::Res::SIXBIT, | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | pub fn to_max_count(&self) -> u32 { | ||
| 47 | match self { | ||
| 48 | #[cfg(adc_v4)] | ||
| 49 | Resolution::SixteenBit => (1 << 16) - 1, | ||
| 50 | #[cfg(adc_v4)] | ||
| 51 | Resolution::FourteenBit => (1 << 14) - 1, | ||
| 52 | Resolution::TwelveBit => (1 << 12) - 1, | ||
| 53 | Resolution::TenBit => (1 << 10) - 1, | ||
| 54 | Resolution::EightBit => (1 << 8) - 1, | ||
| 55 | #[cfg(any(adc_v2, adc_v3, adc_g0))] | ||
| 56 | Resolution::SixBit => (1 << 6) - 1, | ||
| 57 | } | ||
| 58 | } | ||
| 59 | } | ||
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs index 00d9b3077..e2678fe4a 100644 --- a/embassy-stm32/src/adc/v2.rs +++ b/embassy-stm32/src/adc/v2.rs | |||
| @@ -4,7 +4,7 @@ use embassy_hal_common::into_ref; | |||
| 4 | use embedded_hal_02::blocking::delay::DelayUs; | 4 | use embedded_hal_02::blocking::delay::DelayUs; |
| 5 | 5 | ||
| 6 | use super::InternalChannel; | 6 | use super::InternalChannel; |
| 7 | use crate::adc::{AdcPin, Instance, SampleTime}; | 7 | use crate::adc::{AdcPin, Instance, Resolution, SampleTime}; |
| 8 | use crate::peripherals::ADC1; | 8 | use crate::peripherals::ADC1; |
| 9 | use crate::time::Hertz; | 9 | use crate::time::Hertz; |
| 10 | use crate::Peripheral; | 10 | use crate::Peripheral; |
| @@ -17,39 +17,6 @@ pub const VREF_CALIB_MV: u32 = 3300; | |||
| 17 | /// ADC turn-on time | 17 | /// ADC turn-on time |
| 18 | pub const ADC_POWERUP_TIME_US: u32 = 3; | 18 | pub const ADC_POWERUP_TIME_US: u32 = 3; |
| 19 | 19 | ||
| 20 | pub enum Resolution { | ||
| 21 | TwelveBit, | ||
| 22 | TenBit, | ||
| 23 | EightBit, | ||
| 24 | SixBit, | ||
| 25 | } | ||
| 26 | |||
| 27 | impl Default for Resolution { | ||
| 28 | fn default() -> Self { | ||
| 29 | Self::TwelveBit | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | impl Resolution { | ||
| 34 | fn res(&self) -> crate::pac::adc::vals::Res { | ||
| 35 | match self { | ||
| 36 | Resolution::TwelveBit => crate::pac::adc::vals::Res::TWELVEBIT, | ||
| 37 | Resolution::TenBit => crate::pac::adc::vals::Res::TENBIT, | ||
| 38 | Resolution::EightBit => crate::pac::adc::vals::Res::EIGHTBIT, | ||
| 39 | Resolution::SixBit => crate::pac::adc::vals::Res::SIXBIT, | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| 43 | pub fn to_max_count(&self) -> u32 { | ||
| 44 | match self { | ||
| 45 | Resolution::TwelveBit => (1 << 12) - 1, | ||
| 46 | Resolution::TenBit => (1 << 10) - 1, | ||
| 47 | Resolution::EightBit => (1 << 8) - 1, | ||
| 48 | Resolution::SixBit => (1 << 6) - 1, | ||
| 49 | } | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | pub struct VrefInt; | 20 | pub struct VrefInt; |
| 54 | impl InternalChannel<ADC1> for VrefInt {} | 21 | impl InternalChannel<ADC1> for VrefInt {} |
| 55 | impl super::sealed::InternalChannel<ADC1> for VrefInt { | 22 | impl super::sealed::InternalChannel<ADC1> for VrefInt { |
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index b638e8ca5..7bc130e55 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -3,7 +3,7 @@ use core::marker::PhantomData; | |||
| 3 | use embassy_hal_common::into_ref; | 3 | use embassy_hal_common::into_ref; |
| 4 | use embedded_hal_02::blocking::delay::DelayUs; | 4 | use embedded_hal_02::blocking::delay::DelayUs; |
| 5 | 5 | ||
| 6 | use crate::adc::{AdcPin, Instance, SampleTime}; | 6 | use crate::adc::{AdcPin, Instance, Resolution, SampleTime}; |
| 7 | use crate::Peripheral; | 7 | use crate::Peripheral; |
| 8 | 8 | ||
| 9 | /// Default VREF voltage used for sample conversion to millivolts. | 9 | /// Default VREF voltage used for sample conversion to millivolts. |
| @@ -24,39 +24,6 @@ fn enable() { | |||
| 24 | }); | 24 | }); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | pub enum Resolution { | ||
| 28 | TwelveBit, | ||
| 29 | TenBit, | ||
| 30 | EightBit, | ||
| 31 | SixBit, | ||
| 32 | } | ||
| 33 | |||
| 34 | impl Default for Resolution { | ||
| 35 | fn default() -> Self { | ||
| 36 | Self::TwelveBit | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | impl Resolution { | ||
| 41 | fn res(&self) -> crate::pac::adc::vals::Res { | ||
| 42 | match self { | ||
| 43 | Resolution::TwelveBit => crate::pac::adc::vals::Res::TWELVEBIT, | ||
| 44 | Resolution::TenBit => crate::pac::adc::vals::Res::TENBIT, | ||
| 45 | Resolution::EightBit => crate::pac::adc::vals::Res::EIGHTBIT, | ||
| 46 | Resolution::SixBit => crate::pac::adc::vals::Res::SIXBIT, | ||
| 47 | } | ||
| 48 | } | ||
| 49 | |||
| 50 | pub fn to_max_count(&self) -> u32 { | ||
| 51 | match self { | ||
| 52 | Resolution::TwelveBit => (1 << 12) - 1, | ||
| 53 | Resolution::TenBit => (1 << 10) - 1, | ||
| 54 | Resolution::EightBit => (1 << 8) - 1, | ||
| 55 | Resolution::SixBit => (1 << 6) - 1, | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | pub struct VrefInt; | 27 | pub struct VrefInt; |
| 61 | impl<T: Instance> AdcPin<T> for VrefInt {} | 28 | impl<T: Instance> AdcPin<T> for VrefInt {} |
| 62 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { | 29 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { |
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs index b9222947b..9dc5318e2 100644 --- a/embassy-stm32/src/adc/v4.rs +++ b/embassy-stm32/src/adc/v4.rs | |||
| @@ -5,7 +5,7 @@ use embedded_hal_02::blocking::delay::DelayUs; | |||
| 5 | use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; | 5 | use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; |
| 6 | use pac::adccommon::vals::Presc; | 6 | use pac::adccommon::vals::Presc; |
| 7 | 7 | ||
| 8 | use super::{AdcPin, Instance, InternalChannel, SampleTime}; | 8 | use super::{AdcPin, Instance, InternalChannel, Resolution, SampleTime}; |
| 9 | use crate::time::Hertz; | 9 | use crate::time::Hertz; |
| 10 | use crate::{pac, Peripheral}; | 10 | use crate::{pac, Peripheral}; |
| 11 | 11 | ||
| @@ -14,42 +14,6 @@ pub const VREF_DEFAULT_MV: u32 = 3300; | |||
| 14 | /// VREF voltage used for factory calibration of VREFINTCAL register. | 14 | /// VREF voltage used for factory calibration of VREFINTCAL register. |
| 15 | pub const VREF_CALIB_MV: u32 = 3300; | 15 | pub const VREF_CALIB_MV: u32 = 3300; |
| 16 | 16 | ||
| 17 | pub enum Resolution { | ||
| 18 | SixteenBit, | ||
| 19 | FourteenBit, | ||
| 20 | TwelveBit, | ||
| 21 | TenBit, | ||
| 22 | EightBit, | ||
| 23 | } | ||
| 24 | |||
| 25 | impl Default for Resolution { | ||
| 26 | fn default() -> Self { | ||
| 27 | Self::SixteenBit | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | impl Resolution { | ||
| 32 | fn res(&self) -> pac::adc::vals::Res { | ||
| 33 | match self { | ||
| 34 | Resolution::SixteenBit => pac::adc::vals::Res::SIXTEENBIT, | ||
| 35 | Resolution::FourteenBit => pac::adc::vals::Res::FOURTEENBITV, | ||
| 36 | Resolution::TwelveBit => pac::adc::vals::Res::TWELVEBITV, | ||
| 37 | Resolution::TenBit => pac::adc::vals::Res::TENBIT, | ||
| 38 | Resolution::EightBit => pac::adc::vals::Res::EIGHTBIT, | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | pub fn to_max_count(&self) -> u32 { | ||
| 43 | match self { | ||
| 44 | Resolution::SixteenBit => (1 << 16) - 1, | ||
| 45 | Resolution::FourteenBit => (1 << 14) - 1, | ||
| 46 | Resolution::TwelveBit => (1 << 12) - 1, | ||
| 47 | Resolution::TenBit => (1 << 10) - 1, | ||
| 48 | Resolution::EightBit => (1 << 8) - 1, | ||
| 49 | } | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | // NOTE: Vrefint/Temperature/Vbat are only available on ADC3 on H7, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs | 17 | // NOTE: Vrefint/Temperature/Vbat are only available on ADC3 on H7, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs |
| 54 | pub struct VrefInt; | 18 | pub struct VrefInt; |
| 55 | impl<T: Instance> InternalChannel<T> for VrefInt {} | 19 | impl<T: Instance> InternalChannel<T> for VrefInt {} |
