diff options
| -rw-r--r-- | embassy-stm32/src/adc/mod.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/resolution.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/sample_time.rs | 2 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 123 |
4 files changed, 93 insertions, 46 deletions
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index 51b4b5fcc..b273c6394 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | #[cfg_attr(adc_v1, path = "v1.rs")] | 10 | #[cfg_attr(adc_v1, path = "v1.rs")] |
| 11 | #[cfg_attr(adc_l0, path = "v1.rs")] | 11 | #[cfg_attr(adc_l0, path = "v1.rs")] |
| 12 | #[cfg_attr(adc_v2, path = "v2.rs")] | 12 | #[cfg_attr(adc_v2, path = "v2.rs")] |
| 13 | #[cfg_attr(any(adc_v3, adc_g0), path = "v3.rs")] | 13 | #[cfg_attr(any(adc_v3, adc_g0, adc_h5), path = "v3.rs")] |
| 14 | #[cfg_attr(adc_v4, path = "v4.rs")] | 14 | #[cfg_attr(adc_v4, path = "v4.rs")] |
| 15 | mod _version; | 15 | mod _version; |
| 16 | 16 | ||
| @@ -79,10 +79,10 @@ pub(crate) mod sealed { | |||
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | /// ADC instance. | 81 | /// ADC instance. |
| 82 | #[cfg(not(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0)))] | 82 | #[cfg(not(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0, adc_h5)))] |
| 83 | pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> {} | 83 | pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> {} |
| 84 | /// ADC instance. | 84 | /// ADC instance. |
| 85 | #[cfg(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0))] | 85 | #[cfg(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0, adc_h5))] |
| 86 | pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> + crate::rcc::RccPeripheral {} | 86 | pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> + crate::rcc::RccPeripheral {} |
| 87 | 87 | ||
| 88 | /// ADC pin. | 88 | /// ADC pin. |
diff --git a/embassy-stm32/src/adc/resolution.rs b/embassy-stm32/src/adc/resolution.rs index 0e6c45c65..37788cd77 100644 --- a/embassy-stm32/src/adc/resolution.rs +++ b/embassy-stm32/src/adc/resolution.rs | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /// ADC resolution | 1 | /// ADC resolution |
| 2 | #[allow(missing_docs)] | 2 | #[allow(missing_docs)] |
| 3 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1))] | 3 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1, adc_h5))] |
| 4 | #[derive(Clone, Copy, Debug, Eq, PartialEq)] | 4 | #[derive(Clone, Copy, Debug, Eq, PartialEq)] |
| 5 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 5 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 6 | pub enum Resolution { | 6 | pub enum Resolution { |
| @@ -25,7 +25,7 @@ pub enum Resolution { | |||
| 25 | 25 | ||
| 26 | impl Default for Resolution { | 26 | impl Default for Resolution { |
| 27 | fn default() -> Self { | 27 | fn default() -> Self { |
| 28 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1))] | 28 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1, adc_h5))] |
| 29 | { | 29 | { |
| 30 | Self::TwelveBit | 30 | Self::TwelveBit |
| 31 | } | 31 | } |
| @@ -46,7 +46,7 @@ impl From<Resolution> for crate::pac::adc::vals::Res { | |||
| 46 | Resolution::TwelveBit => crate::pac::adc::vals::Res::TWELVEBIT, | 46 | Resolution::TwelveBit => crate::pac::adc::vals::Res::TWELVEBIT, |
| 47 | Resolution::TenBit => crate::pac::adc::vals::Res::TENBIT, | 47 | Resolution::TenBit => crate::pac::adc::vals::Res::TENBIT, |
| 48 | Resolution::EightBit => crate::pac::adc::vals::Res::EIGHTBIT, | 48 | Resolution::EightBit => crate::pac::adc::vals::Res::EIGHTBIT, |
| 49 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1))] | 49 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1, adc_h5))] |
| 50 | Resolution::SixBit => crate::pac::adc::vals::Res::SIXBIT, | 50 | Resolution::SixBit => crate::pac::adc::vals::Res::SIXBIT, |
| 51 | } | 51 | } |
| 52 | } | 52 | } |
| @@ -65,7 +65,7 @@ impl Resolution { | |||
| 65 | Resolution::TwelveBit => (1 << 12) - 1, | 65 | Resolution::TwelveBit => (1 << 12) - 1, |
| 66 | Resolution::TenBit => (1 << 10) - 1, | 66 | Resolution::TenBit => (1 << 10) - 1, |
| 67 | Resolution::EightBit => (1 << 8) - 1, | 67 | Resolution::EightBit => (1 << 8) - 1, |
| 68 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1))] | 68 | #[cfg(any(adc_v1, adc_v2, adc_v3, adc_l0, adc_g0, adc_f3, adc_f3_v1_1, adc_h5))] |
| 69 | Resolution::SixBit => (1 << 6) - 1, | 69 | Resolution::SixBit => (1 << 6) - 1, |
| 70 | } | 70 | } |
| 71 | } | 71 | } |
diff --git a/embassy-stm32/src/adc/sample_time.rs b/embassy-stm32/src/adc/sample_time.rs index f4b22b462..19bc22938 100644 --- a/embassy-stm32/src/adc/sample_time.rs +++ b/embassy-stm32/src/adc/sample_time.rs | |||
| @@ -67,7 +67,7 @@ impl_sample_time!( | |||
| 67 | ) | 67 | ) |
| 68 | ); | 68 | ); |
| 69 | 69 | ||
| 70 | #[cfg(adc_v3)] | 70 | #[cfg(any(adc_v3, adc_h5))] |
| 71 | impl_sample_time!( | 71 | impl_sample_time!( |
| 72 | "2.5", | 72 | "2.5", |
| 73 | Cycles2_5, | 73 | Cycles2_5, |
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index 281a99f72..0c44e4400 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | use cfg_if::cfg_if; | ||
| 1 | use embassy_hal_internal::into_ref; | 2 | use embassy_hal_internal::into_ref; |
| 2 | use embedded_hal_02::blocking::delay::DelayUs; | 3 | use embedded_hal_02::blocking::delay::DelayUs; |
| 3 | 4 | ||
| @@ -13,10 +14,15 @@ pub struct VrefInt; | |||
| 13 | impl<T: Instance> AdcPin<T> for VrefInt {} | 14 | impl<T: Instance> AdcPin<T> for VrefInt {} |
| 14 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { | 15 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { |
| 15 | fn channel(&self) -> u8 { | 16 | fn channel(&self) -> u8 { |
| 16 | #[cfg(not(adc_g0))] | 17 | cfg_if! { |
| 17 | let val = 0; | 18 | if #[cfg(adc_g0)] { |
| 18 | #[cfg(adc_g0)] | 19 | let val = 13; |
| 19 | let val = 13; | 20 | } else if #[cfg(adc_h5)] { |
| 21 | let val = 17; | ||
| 22 | } else { | ||
| 23 | let val = 0; | ||
| 24 | } | ||
| 25 | } | ||
| 20 | val | 26 | val |
| 21 | } | 27 | } |
| 22 | } | 28 | } |
| @@ -25,10 +31,15 @@ pub struct Temperature; | |||
| 25 | impl<T: Instance> AdcPin<T> for Temperature {} | 31 | impl<T: Instance> AdcPin<T> for Temperature {} |
| 26 | impl<T: Instance> super::sealed::AdcPin<T> for Temperature { | 32 | impl<T: Instance> super::sealed::AdcPin<T> for Temperature { |
| 27 | fn channel(&self) -> u8 { | 33 | fn channel(&self) -> u8 { |
| 28 | #[cfg(not(adc_g0))] | 34 | cfg_if! { |
| 29 | let val = 17; | 35 | if #[cfg(adc_g0)] { |
| 30 | #[cfg(adc_g0)] | 36 | let val = 12; |
| 31 | let val = 12; | 37 | } else if #[cfg(adc_h5)] { |
| 38 | let val = 16; | ||
| 39 | } else { | ||
| 40 | let val = 17; | ||
| 41 | } | ||
| 42 | } | ||
| 32 | val | 43 | val |
| 33 | } | 44 | } |
| 34 | } | 45 | } |
| @@ -37,14 +48,31 @@ pub struct Vbat; | |||
| 37 | impl<T: Instance> AdcPin<T> for Vbat {} | 48 | impl<T: Instance> AdcPin<T> for Vbat {} |
| 38 | impl<T: Instance> super::sealed::AdcPin<T> for Vbat { | 49 | impl<T: Instance> super::sealed::AdcPin<T> for Vbat { |
| 39 | fn channel(&self) -> u8 { | 50 | fn channel(&self) -> u8 { |
| 40 | #[cfg(not(adc_g0))] | 51 | cfg_if! { |
| 41 | let val = 18; | 52 | if #[cfg(adc_g0)] { |
| 42 | #[cfg(adc_g0)] | 53 | let val = 14; |
| 43 | let val = 14; | 54 | } else if #[cfg(adc_h5)] { |
| 55 | let val = 2; | ||
| 56 | } else { | ||
| 57 | let val = 18; | ||
| 58 | } | ||
| 59 | } | ||
| 44 | val | 60 | val |
| 45 | } | 61 | } |
| 46 | } | 62 | } |
| 47 | 63 | ||
| 64 | cfg_if! { | ||
| 65 | if #[cfg(adc_h5)] { | ||
| 66 | pub struct VddCore; | ||
| 67 | impl<T: Instance> AdcPin<T> for VddCore {} | ||
| 68 | impl<T: Instance> super::sealed::AdcPin<T> for VddCore { | ||
| 69 | fn channel(&self) -> u8 { | ||
| 70 | 6 | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 48 | impl<'d, T: Instance> Adc<'d, T> { | 76 | impl<'d, T: Instance> Adc<'d, T> { |
| 49 | pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { | 77 | pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { |
| 50 | into_ref!(adc); | 78 | into_ref!(adc); |
| @@ -98,27 +126,41 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 98 | } | 126 | } |
| 99 | 127 | ||
| 100 | pub fn enable_temperature(&self) -> Temperature { | 128 | pub fn enable_temperature(&self) -> Temperature { |
| 101 | #[cfg(not(adc_g0))] | 129 | cfg_if! { |
| 102 | T::common_regs().ccr().modify(|reg| { | 130 | if #[cfg(adc_g0)] { |
| 103 | reg.set_ch17sel(true); | 131 | T::regs().ccr().modify(|reg| { |
| 104 | }); | 132 | reg.set_tsen(true); |
| 105 | #[cfg(adc_g0)] | 133 | }); |
| 106 | T::regs().ccr().modify(|reg| { | 134 | } else if #[cfg(adc_h5)] { |
| 107 | reg.set_tsen(true); | 135 | T::common_regs().ccr().modify(|reg| { |
| 108 | }); | 136 | reg.set_tsen(true); |
| 137 | }); | ||
| 138 | } else { | ||
| 139 | T::common_regs().ccr().modify(|reg| { | ||
| 140 | reg.set_ch17sel(true); | ||
| 141 | }); | ||
| 142 | } | ||
| 143 | } | ||
| 109 | 144 | ||
| 110 | Temperature {} | 145 | Temperature {} |
| 111 | } | 146 | } |
| 112 | 147 | ||
| 113 | pub fn enable_vbat(&self) -> Vbat { | 148 | pub fn enable_vbat(&self) -> Vbat { |
| 114 | #[cfg(not(adc_g0))] | 149 | cfg_if! { |
| 115 | T::common_regs().ccr().modify(|reg| { | 150 | if #[cfg(adc_g0)] { |
| 116 | reg.set_ch18sel(true); | 151 | T::regs().ccr().modify(|reg| { |
| 117 | }); | 152 | reg.set_vbaten(true); |
| 118 | #[cfg(adc_g0)] | 153 | }); |
| 119 | T::regs().ccr().modify(|reg| { | 154 | } else if #[cfg(adc_h5)] { |
| 120 | reg.set_vbaten(true); | 155 | T::common_regs().ccr().modify(|reg| { |
| 121 | }); | 156 | reg.set_vbaten(true); |
| 157 | }); | ||
| 158 | } else { | ||
| 159 | T::common_regs().ccr().modify(|reg| { | ||
| 160 | reg.set_ch18sel(true); | ||
| 161 | }); | ||
| 162 | } | ||
| 163 | } | ||
| 122 | 164 | ||
| 123 | Vbat {} | 165 | Vbat {} |
| 124 | } | 166 | } |
| @@ -205,16 +247,21 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 205 | val | 247 | val |
| 206 | } | 248 | } |
| 207 | 249 | ||
| 208 | #[cfg(adc_g0)] | ||
| 209 | fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { | 250 | fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { |
| 210 | T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); | 251 | cfg_if! { |
| 211 | } | 252 | if #[cfg(adc_g0)] { |
| 212 | 253 | T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); | |
| 213 | #[cfg(not(adc_g0))] | 254 | } else if #[cfg(adc_h5)] { |
| 214 | fn set_channel_sample_time(ch: u8, sample_time: SampleTime) { | 255 | match _ch { |
| 215 | let sample_time = sample_time.into(); | 256 | 0..=9 => T::regs().smpr1().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())), |
| 216 | T::regs() | 257 | _ => T::regs().smpr2().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())), |
| 217 | .smpr(ch as usize / 10) | 258 | } |
| 218 | .modify(|reg| reg.set_smp(ch as usize % 10, sample_time)); | 259 | } else { |
| 260 | let sample_time = sample_time.into(); | ||
| 261 | T::regs() | ||
| 262 | .smpr(ch as usize / 10) | ||
| 263 | .modify(|reg| reg.set_smp(ch as usize % 10, sample_time)); | ||
| 264 | } | ||
| 265 | } | ||
| 219 | } | 266 | } |
| 220 | } | 267 | } |
