diff options
| author | xoviat <[email protected]> | 2025-11-11 11:14:21 -0600 |
|---|---|---|
| committer | xoviat <[email protected]> | 2025-11-11 11:14:21 -0600 |
| commit | 769941980442ada1524ee4f60f1d003735caff4b (patch) | |
| tree | c4895854fc681b43fba37057729ad5698732acda | |
| parent | aecff11b662c8232e7c848962c6c9ccda0cd9bf3 (diff) | |
adc: seal special channels
| -rw-r--r-- | embassy-stm32/src/adc/c0.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/f1.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/f3.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/g4.rs | 32 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/mod.rs | 43 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v1.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v2.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 24 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v4.rs | 16 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/adc.rs | 5 |
10 files changed, 73 insertions, 79 deletions
diff --git a/embassy-stm32/src/adc/c0.rs b/embassy-stm32/src/adc/c0.rs index 1869993a5..bc97a7c4b 100644 --- a/embassy-stm32/src/adc/c0.rs +++ b/embassy-stm32/src/adc/c0.rs | |||
| @@ -24,11 +24,11 @@ const CHSELR_SQ_SIZE: usize = 8; | |||
| 24 | const CHSELR_SQ_MAX_CHANNEL: u8 = 14; | 24 | const CHSELR_SQ_MAX_CHANNEL: u8 = 14; |
| 25 | const CHSELR_SQ_SEQUENCE_END_MARKER: u8 = 0b1111; | 25 | const CHSELR_SQ_SEQUENCE_END_MARKER: u8 = 0b1111; |
| 26 | 26 | ||
| 27 | impl<T: Instance> super::VrefConverter for T { | 27 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 28 | const CHANNEL: u8 = 10; | 28 | const CHANNEL: u8 = 10; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | impl<T: Instance> super::TemperatureConverter for T { | 31 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 32 | const CHANNEL: u8 = 9; | 32 | const CHANNEL: u8 = 9; |
| 33 | } | 33 | } |
| 34 | 34 | ||
diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs index 835cc8c63..f6220de78 100644 --- a/embassy-stm32/src/adc/f1.rs +++ b/embassy-stm32/src/adc/f1.rs | |||
| @@ -3,7 +3,7 @@ use core::marker::PhantomData; | |||
| 3 | use core::task::Poll; | 3 | use core::task::Poll; |
| 4 | 4 | ||
| 5 | use super::blocking_delay_us; | 5 | use super::blocking_delay_us; |
| 6 | use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; | 6 | use crate::adc::{Adc, AdcChannel, Instance, SampleTime, VrefInt}; |
| 7 | use crate::interrupt::typelevel::Interrupt; | 7 | use crate::interrupt::typelevel::Interrupt; |
| 8 | use crate::interrupt::{self}; | 8 | use crate::interrupt::{self}; |
| 9 | use crate::time::Hertz; | 9 | use crate::time::Hertz; |
| @@ -28,11 +28,11 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 28 | } | 28 | } |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | impl<T: Instance> super::VrefConverter for T { | 31 | impl<T: Instance> super::SealedSpecialConverter<VrefInt> for T { |
| 32 | const CHANNEL: u8 = 17; | 32 | const CHANNEL: u8 = 17; |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | impl<T: Instance> super::TemperatureConverter for T { | 35 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 36 | const CHANNEL: u8 = 16; | 36 | const CHANNEL: u8 = 16; |
| 37 | } | 37 | } |
| 38 | 38 | ||
diff --git a/embassy-stm32/src/adc/f3.rs b/embassy-stm32/src/adc/f3.rs index f6a4e1209..4a77f3c5b 100644 --- a/embassy-stm32/src/adc/f3.rs +++ b/embassy-stm32/src/adc/f3.rs | |||
| @@ -3,7 +3,7 @@ use core::marker::PhantomData; | |||
| 3 | use core::task::Poll; | 3 | use core::task::Poll; |
| 4 | 4 | ||
| 5 | use super::blocking_delay_us; | 5 | use super::blocking_delay_us; |
| 6 | use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; | 6 | use crate::adc::{Adc, AdcChannel, Instance, SampleTime, VrefInt}; |
| 7 | use crate::interrupt::typelevel::Interrupt; | 7 | use crate::interrupt::typelevel::Interrupt; |
| 8 | use crate::time::Hertz; | 8 | use crate::time::Hertz; |
| 9 | use crate::{Peri, interrupt, rcc}; | 9 | use crate::{Peri, interrupt, rcc}; |
| @@ -29,11 +29,11 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 29 | } | 29 | } |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | impl<T: Instance> super::VrefConverter for T { | 32 | impl<T: Instance> super::SealedSpecialConverter<VrefInt> for T { |
| 33 | const CHANNEL: u8 = 18; | 33 | const CHANNEL: u8 = 18; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | impl<T: Instance> super::TemperatureConverter for T { | 36 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 37 | const CHANNEL: u8 = 16; | 37 | const CHANNEL: u8 = 16; |
| 38 | } | 38 | } |
| 39 | 39 | ||
diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs index e622e2a23..6430b0243 100644 --- a/embassy-stm32/src/adc/g4.rs +++ b/embassy-stm32/src/adc/g4.rs | |||
| @@ -208,7 +208,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 208 | /// Enable reading the voltage reference internal channel. | 208 | /// Enable reading the voltage reference internal channel. |
| 209 | pub fn enable_vrefint(&self) -> super::VrefInt | 209 | pub fn enable_vrefint(&self) -> super::VrefInt |
| 210 | where | 210 | where |
| 211 | T: super::VrefConverter, | 211 | T: super::SpecialConverter<super::VrefInt>, |
| 212 | { | 212 | { |
| 213 | T::common_regs().ccr().modify(|reg| { | 213 | T::common_regs().ccr().modify(|reg| { |
| 214 | reg.set_vrefen(true); | 214 | reg.set_vrefen(true); |
| @@ -220,7 +220,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 220 | /// Enable reading the temperature internal channel. | 220 | /// Enable reading the temperature internal channel. |
| 221 | pub fn enable_temperature(&self) -> super::Temperature | 221 | pub fn enable_temperature(&self) -> super::Temperature |
| 222 | where | 222 | where |
| 223 | T: super::TemperatureConverter, | 223 | T: super::SpecialConverter<super::Temperature>, |
| 224 | { | 224 | { |
| 225 | T::common_regs().ccr().modify(|reg| { | 225 | T::common_regs().ccr().modify(|reg| { |
| 226 | reg.set_vsenseen(true); | 226 | reg.set_vsenseen(true); |
| @@ -232,7 +232,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 232 | /// Enable reading the vbat internal channel. | 232 | /// Enable reading the vbat internal channel. |
| 233 | pub fn enable_vbat(&self) -> super::Vbat | 233 | pub fn enable_vbat(&self) -> super::Vbat |
| 234 | where | 234 | where |
| 235 | T: super::VBatConverter, | 235 | T: super::SpecialConverter<super::Vbat>, |
| 236 | { | 236 | { |
| 237 | T::common_regs().ccr().modify(|reg| { | 237 | T::common_regs().ccr().modify(|reg| { |
| 238 | reg.set_vbaten(true); | 238 | reg.set_vbaten(true); |
| @@ -766,47 +766,47 @@ impl<T: Instance, const N: usize> InjectedAdc<T, N> { | |||
| 766 | 766 | ||
| 767 | #[cfg(stm32g4)] | 767 | #[cfg(stm32g4)] |
| 768 | mod g4 { | 768 | mod g4 { |
| 769 | use crate::adc::{TemperatureConverter, VBatConverter, VrefConverter}; | 769 | use crate::adc::{SealedSpecialConverter, Temperature, Vbat, VrefInt}; |
| 770 | 770 | ||
| 771 | impl TemperatureConverter for crate::peripherals::ADC1 { | 771 | impl SealedSpecialConverter<Temperature> for crate::peripherals::ADC1 { |
| 772 | const CHANNEL: u8 = 16; | 772 | const CHANNEL: u8 = 16; |
| 773 | } | 773 | } |
| 774 | 774 | ||
| 775 | impl VrefConverter for crate::peripherals::ADC1 { | 775 | impl SealedSpecialConverter<VrefInt> for crate::peripherals::ADC1 { |
| 776 | const CHANNEL: u8 = 18; | 776 | const CHANNEL: u8 = 18; |
| 777 | } | 777 | } |
| 778 | 778 | ||
| 779 | impl VBatConverter for crate::peripherals::ADC1 { | 779 | impl SealedSpecialConverter<Vbat> for crate::peripherals::ADC1 { |
| 780 | const CHANNEL: u8 = 17; | 780 | const CHANNEL: u8 = 17; |
| 781 | } | 781 | } |
| 782 | 782 | ||
| 783 | #[cfg(peri_adc3_common)] | 783 | #[cfg(peri_adc3_common)] |
| 784 | impl VrefConverter for crate::peripherals::ADC3 { | 784 | impl SealedSpecialConverter<VrefInt> for crate::peripherals::ADC3 { |
| 785 | const CHANNEL: u8 = 18; | 785 | const CHANNEL: u8 = 18; |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | #[cfg(peri_adc3_common)] | 788 | #[cfg(peri_adc3_common)] |
| 789 | impl VBatConverter for crate::peripherals::ADC3 { | 789 | impl SealedSpecialConverter<Vbat> for crate::peripherals::ADC3 { |
| 790 | const CHANNEL: u8 = 17; | 790 | const CHANNEL: u8 = 17; |
| 791 | } | 791 | } |
| 792 | 792 | ||
| 793 | #[cfg(not(stm32g4x1))] | 793 | #[cfg(not(stm32g4x1))] |
| 794 | impl VrefConverter for crate::peripherals::ADC4 { | 794 | impl SealedSpecialConverter<VrefInt> for crate::peripherals::ADC4 { |
| 795 | const CHANNEL: u8 = 18; | 795 | const CHANNEL: u8 = 18; |
| 796 | } | 796 | } |
| 797 | 797 | ||
| 798 | #[cfg(not(stm32g4x1))] | 798 | #[cfg(not(stm32g4x1))] |
| 799 | impl TemperatureConverter for crate::peripherals::ADC5 { | 799 | impl SealedSpecialConverter<Temperature> for crate::peripherals::ADC5 { |
| 800 | const CHANNEL: u8 = 4; | 800 | const CHANNEL: u8 = 4; |
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | #[cfg(not(stm32g4x1))] | 803 | #[cfg(not(stm32g4x1))] |
| 804 | impl VrefConverter for crate::peripherals::ADC5 { | 804 | impl SealedSpecialConverter<VrefInt> for crate::peripherals::ADC5 { |
| 805 | const CHANNEL: u8 = 18; | 805 | const CHANNEL: u8 = 18; |
| 806 | } | 806 | } |
| 807 | 807 | ||
| 808 | #[cfg(not(stm32g4x1))] | 808 | #[cfg(not(stm32g4x1))] |
| 809 | impl VBatConverter for crate::peripherals::ADC5 { | 809 | impl SealedSpecialConverter<Vbat> for crate::peripherals::ADC5 { |
| 810 | const CHANNEL: u8 = 17; | 810 | const CHANNEL: u8 = 17; |
| 811 | } | 811 | } |
| 812 | } | 812 | } |
| @@ -814,13 +814,13 @@ mod g4 { | |||
| 814 | // TODO this should look at each ADC individually and impl the correct channels | 814 | // TODO this should look at each ADC individually and impl the correct channels |
| 815 | #[cfg(stm32h7)] | 815 | #[cfg(stm32h7)] |
| 816 | mod h7 { | 816 | mod h7 { |
| 817 | impl<T: Instance> TemperatureConverter for T { | 817 | impl<T: Instance> SealedSpecialConverter<Temperature> for T { |
| 818 | const CHANNEL: u8 = 18; | 818 | const CHANNEL: u8 = 18; |
| 819 | } | 819 | } |
| 820 | impl<T: Instance> VrefConverter for T { | 820 | impl<T: Instance> SealedSpecialConverter<VrefInt> for T { |
| 821 | const CHANNEL: u8 = 19; | 821 | const CHANNEL: u8 = 19; |
| 822 | } | 822 | } |
| 823 | impl<T: Instance> VBatConverter for T { | 823 | impl<T: Instance> SealedSpecialConverter<Vbat> for T { |
| 824 | // TODO this should be 14 for H7a/b/35 | 824 | // TODO this should be 14 for H7a/b/35 |
| 825 | const CHANNEL: u8 = 17; | 825 | const CHANNEL: u8 = 17; |
| 826 | } | 826 | } |
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index a11e0c1b4..e321c4fa1 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs | |||
| @@ -105,29 +105,28 @@ pub(crate) fn blocking_delay_us(us: u32) { | |||
| 105 | } | 105 | } |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | /// Implemented for ADCs that have a Temperature channel | 108 | pub(self) trait SpecialChannel {} |
| 109 | pub trait TemperatureConverter { | 109 | |
| 110 | const CHANNEL: u8; | 110 | /// Implemented for ADCs that have a special channel |
| 111 | } | 111 | trait SealedSpecialConverter<T: SpecialChannel + Sized> { |
| 112 | /// Implemented for ADCs that have a Vref channel | ||
| 113 | pub trait VrefConverter { | ||
| 114 | const CHANNEL: u8; | ||
| 115 | } | ||
| 116 | /// Implemented for ADCs that have a VBat channel | ||
| 117 | pub trait VBatConverter { | ||
| 118 | const CHANNEL: u8; | 112 | const CHANNEL: u8; |
| 119 | } | 113 | } |
| 120 | 114 | ||
| 121 | // 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 | 115 | #[allow(private_bounds)] |
| 122 | /// Internal voltage reference channel. | 116 | pub trait SpecialConverter<T: SpecialChannel + Sized>: SealedSpecialConverter<T> {} |
| 123 | pub struct VrefInt; | 117 | |
| 124 | impl<T: Instance + VrefConverter> AdcChannel<T> for VrefInt {} | 118 | impl<C: SpecialChannel + Sized, T: SealedSpecialConverter<C>> SpecialConverter<C> for T {} |
| 125 | impl<T: Instance + VrefConverter> SealedAdcChannel<T> for VrefInt { | 119 | |
| 120 | impl<C: SpecialChannel, T: Instance + SealedSpecialConverter<C>> AdcChannel<T> for C {} | ||
| 121 | impl<C: SpecialChannel, T: Instance + SealedSpecialConverter<C>> SealedAdcChannel<T> for C { | ||
| 126 | fn channel(&self) -> u8 { | 122 | fn channel(&self) -> u8 { |
| 127 | T::CHANNEL | 123 | T::CHANNEL |
| 128 | } | 124 | } |
| 129 | } | 125 | } |
| 130 | 126 | ||
| 127 | pub struct VrefInt; | ||
| 128 | impl SpecialChannel for VrefInt {} | ||
| 129 | |||
| 131 | impl VrefInt { | 130 | impl VrefInt { |
| 132 | #[cfg(any(adc_f3v1, adc_f3v2))] | 131 | #[cfg(any(adc_f3v1, adc_f3v2))] |
| 133 | /// The value that vref would be if vdda was at 3300mv | 132 | /// The value that vref would be if vdda was at 3300mv |
| @@ -138,21 +137,11 @@ impl VrefInt { | |||
| 138 | 137 | ||
| 139 | /// Internal temperature channel. | 138 | /// Internal temperature channel. |
| 140 | pub struct Temperature; | 139 | pub struct Temperature; |
| 141 | impl<T: Instance + TemperatureConverter> AdcChannel<T> for Temperature {} | 140 | impl SpecialChannel for Temperature {} |
| 142 | impl<T: Instance + TemperatureConverter> SealedAdcChannel<T> for Temperature { | ||
| 143 | fn channel(&self) -> u8 { | ||
| 144 | T::CHANNEL | ||
| 145 | } | ||
| 146 | } | ||
| 147 | 141 | ||
| 148 | /// Internal battery voltage channel. | 142 | /// Internal battery voltage channel. |
| 149 | pub struct Vbat; | 143 | pub struct Vbat; |
| 150 | impl<T: Instance + VBatConverter> AdcChannel<T> for Vbat {} | 144 | impl SpecialChannel for Vbat {} |
| 151 | impl<T: Instance + VBatConverter> SealedAdcChannel<T> for Vbat { | ||
| 152 | fn channel(&self) -> u8 { | ||
| 153 | T::CHANNEL | ||
| 154 | } | ||
| 155 | } | ||
| 156 | 145 | ||
| 157 | /// ADC instance. | 146 | /// ADC instance. |
| 158 | #[cfg(not(any( | 147 | #[cfg(not(any( |
diff --git a/embassy-stm32/src/adc/v1.rs b/embassy-stm32/src/adc/v1.rs index 97557ee8a..58c30935f 100644 --- a/embassy-stm32/src/adc/v1.rs +++ b/embassy-stm32/src/adc/v1.rs | |||
| @@ -43,22 +43,22 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | #[cfg(not(adc_l0))] | 45 | #[cfg(not(adc_l0))] |
| 46 | impl super::VBatConverter for crate::peripherals::ADC1 { | 46 | impl super::SealedSpecialConverter<super::Vbat> for crate::peripherals::ADC1 { |
| 47 | const CHANNEL: u8 = 18; | 47 | const CHANNEL: u8 = 18; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | #[cfg(not(adc_l0))] | 50 | #[cfg(not(adc_l0))] |
| 51 | impl super::VrefConverter for crate::peripherals::ADC1 { | 51 | impl super::SealedSpecialConverter<super::VrefInt> for crate::peripherals::ADC1 { |
| 52 | const CHANNEL: u8 = 17; | 52 | const CHANNEL: u8 = 17; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | #[cfg(adc_l0)] | 55 | #[cfg(adc_l0)] |
| 56 | impl super::VrefConverter for crate::peripherals::ADC1 { | 56 | impl super::SealedSpecialConverter<super::VrefInt> for crate::peripherals::ADC1 { |
| 57 | const CHANNEL: u8 = 18; | 57 | const CHANNEL: u8 = 18; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | #[cfg(not(adc_l0))] | 60 | #[cfg(not(adc_l0))] |
| 61 | impl super::TemperatureConverter for crate::peripherals::ADC1 { | 61 | impl super::SealedSpecialConverter<super::Temperature> for crate::peripherals::ADC1 { |
| 62 | const CHANNEL: u8 = 16; | 62 | const CHANNEL: u8 = 16; |
| 63 | } | 63 | } |
| 64 | 64 | ||
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs index 88a8b96ed..efa1cc68c 100644 --- a/embassy-stm32/src/adc/v2.rs +++ b/embassy-stm32/src/adc/v2.rs | |||
| @@ -22,21 +22,21 @@ pub const VREF_DEFAULT_MV: u32 = 3300; | |||
| 22 | /// VREF voltage used for factory calibration of VREFINTCAL register. | 22 | /// VREF voltage used for factory calibration of VREFINTCAL register. |
| 23 | pub const VREF_CALIB_MV: u32 = 3300; | 23 | pub const VREF_CALIB_MV: u32 = 3300; |
| 24 | 24 | ||
| 25 | impl super::VrefConverter for crate::peripherals::ADC1 { | 25 | impl super::SealedSpecialConverter<super::VrefInt> for crate::peripherals::ADC1 { |
| 26 | const CHANNEL: u8 = 17; | 26 | const CHANNEL: u8 = 17; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | #[cfg(any(stm32f2, stm32f40x, stm32f41x))] | 29 | #[cfg(any(stm32f2, stm32f40x, stm32f41x))] |
| 30 | impl super::TemperatureConverter for crate::peripherals::ADC1 { | 30 | impl super::SealedSpecialConverter<super::Temperature> for crate::peripherals::ADC1 { |
| 31 | const CHANNEL: u8 = 16; | 31 | const CHANNEL: u8 = 16; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | #[cfg(not(any(stm32f2, stm32f40x, stm32f41x)))] | 34 | #[cfg(not(any(stm32f2, stm32f40x, stm32f41x)))] |
| 35 | impl super::TemperatureConverter for crate::peripherals::ADC1 { | 35 | impl super::SealedSpecialConverter<super::Temperature> for crate::peripherals::ADC1 { |
| 36 | const CHANNEL: u8 = 18; | 36 | const CHANNEL: u8 = 18; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | impl super::VBatConverter for crate::peripherals::ADC1 { | 39 | impl super::SealedSpecialConverter<super::Vbat> for crate::peripherals::ADC1 { |
| 40 | const CHANNEL: u8 = 18; | 40 | const CHANNEL: u8 = 18; |
| 41 | } | 41 | } |
| 42 | 42 | ||
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index e816907d1..cbc217545 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -36,53 +36,53 @@ pub const VREF_CALIB_MV: u32 = 3000; | |||
| 36 | const SAMPLE_TIMES_CAPACITY: usize = 2; | 36 | const SAMPLE_TIMES_CAPACITY: usize = 2; |
| 37 | 37 | ||
| 38 | #[cfg(adc_g0)] | 38 | #[cfg(adc_g0)] |
| 39 | impl<T: Instance> super::VrefConverter for T { | 39 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 40 | const CHANNEL: u8 = 13; | 40 | const CHANNEL: u8 = 13; |
| 41 | } | 41 | } |
| 42 | #[cfg(any(adc_h5, adc_h7rs))] | 42 | #[cfg(any(adc_h5, adc_h7rs))] |
| 43 | impl<T: Instance> super::VrefConverter for T { | 43 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 44 | const CHANNEL: u8 = 17; | 44 | const CHANNEL: u8 = 17; |
| 45 | } | 45 | } |
| 46 | #[cfg(adc_u0)] | 46 | #[cfg(adc_u0)] |
| 47 | impl<T: Instance> super::VrefConverter for T { | 47 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 48 | const CHANNEL: u8 = 12; | 48 | const CHANNEL: u8 = 12; |
| 49 | } | 49 | } |
| 50 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] | 50 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] |
| 51 | impl<T: Instance> super::VrefConverter for T { | 51 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 52 | const CHANNEL: u8 = 0; | 52 | const CHANNEL: u8 = 0; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | #[cfg(adc_g0)] | 55 | #[cfg(adc_g0)] |
| 56 | impl<T: Instance> super::TemperatureConverter for T { | 56 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 57 | const CHANNEL: u8 = 12; | 57 | const CHANNEL: u8 = 12; |
| 58 | } | 58 | } |
| 59 | #[cfg(any(adc_h5, adc_h7rs))] | 59 | #[cfg(any(adc_h5, adc_h7rs))] |
| 60 | impl<T: Instance> super::TemperatureConverter for T { | 60 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 61 | const CHANNEL: u8 = 16; | 61 | const CHANNEL: u8 = 16; |
| 62 | } | 62 | } |
| 63 | #[cfg(adc_u0)] | 63 | #[cfg(adc_u0)] |
| 64 | impl<T: Instance> super::TemperatureConverter for T { | 64 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 65 | const CHANNEL: u8 = 11; | 65 | const CHANNEL: u8 = 11; |
| 66 | } | 66 | } |
| 67 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] | 67 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] |
| 68 | impl<T: Instance> super::TemperatureConverter for T { | 68 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 69 | const CHANNEL: u8 = 17; | 69 | const CHANNEL: u8 = 17; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | #[cfg(adc_g0)] | 72 | #[cfg(adc_g0)] |
| 73 | impl<T: Instance> super::VBatConverter for T { | 73 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 74 | const CHANNEL: u8 = 14; | 74 | const CHANNEL: u8 = 14; |
| 75 | } | 75 | } |
| 76 | #[cfg(any(adc_h5, adc_h7rs))] | 76 | #[cfg(any(adc_h5, adc_h7rs))] |
| 77 | impl<T: Instance> super::VBatConverter for T { | 77 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 78 | const CHANNEL: u8 = 2; | 78 | const CHANNEL: u8 = 2; |
| 79 | } | 79 | } |
| 80 | #[cfg(adc_u0)] | 80 | #[cfg(adc_u0)] |
| 81 | impl<T: Instance> super::VBatConverter for T { | 81 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 82 | const CHANNEL: u8 = 13; | 82 | const CHANNEL: u8 = 13; |
| 83 | } | 83 | } |
| 84 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] | 84 | #[cfg(not(any(adc_g0, adc_h5, adc_h7rs, adc_u0)))] |
| 85 | impl<T: Instance> super::VBatConverter for T { | 85 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 86 | const CHANNEL: u8 = 18; | 86 | const CHANNEL: u8 = 18; |
| 87 | } | 87 | } |
| 88 | 88 | ||
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs index 2f7baf3bf..1d5d3fb92 100644 --- a/embassy-stm32/src/adc/v4.rs +++ b/embassy-stm32/src/adc/v4.rs | |||
| @@ -26,39 +26,39 @@ const MAX_ADC_CLK_FREQ: Hertz = Hertz::mhz(50); | |||
| 26 | const MAX_ADC_CLK_FREQ: Hertz = Hertz::mhz(55); | 26 | const MAX_ADC_CLK_FREQ: Hertz = Hertz::mhz(55); |
| 27 | 27 | ||
| 28 | #[cfg(stm32g4)] | 28 | #[cfg(stm32g4)] |
| 29 | impl<T: Instance> super::VrefConverter for T { | 29 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 30 | const CHANNEL: u8 = 18; | 30 | const CHANNEL: u8 = 18; |
| 31 | } | 31 | } |
| 32 | #[cfg(stm32g4)] | 32 | #[cfg(stm32g4)] |
| 33 | impl<T: Instance> super::TemperatureConverter for T { | 33 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 34 | const CHANNEL: u8 = 16; | 34 | const CHANNEL: u8 = 16; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | #[cfg(stm32h7)] | 37 | #[cfg(stm32h7)] |
| 38 | impl<T: Instance> super::VrefConverter for T { | 38 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 39 | const CHANNEL: u8 = 19; | 39 | const CHANNEL: u8 = 19; |
| 40 | } | 40 | } |
| 41 | #[cfg(stm32h7)] | 41 | #[cfg(stm32h7)] |
| 42 | impl<T: Instance> super::TemperatureConverter for T { | 42 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 43 | const CHANNEL: u8 = 18; | 43 | const CHANNEL: u8 = 18; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | // TODO this should be 14 for H7a/b/35 | 46 | // TODO this should be 14 for H7a/b/35 |
| 47 | #[cfg(not(stm32u5))] | 47 | #[cfg(not(stm32u5))] |
| 48 | impl<T: Instance> super::VBatConverter for T { | 48 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 49 | const CHANNEL: u8 = 17; | 49 | const CHANNEL: u8 = 17; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | #[cfg(stm32u5)] | 52 | #[cfg(stm32u5)] |
| 53 | impl<T: Instance> super::VrefConverter for T { | 53 | impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T { |
| 54 | const CHANNEL: u8 = 0; | 54 | const CHANNEL: u8 = 0; |
| 55 | } | 55 | } |
| 56 | #[cfg(stm32u5)] | 56 | #[cfg(stm32u5)] |
| 57 | impl<T: Instance> super::TemperatureConverter for T { | 57 | impl<T: Instance> super::SealedSpecialConverter<super::Temperature> for T { |
| 58 | const CHANNEL: u8 = 19; | 58 | const CHANNEL: u8 = 19; |
| 59 | } | 59 | } |
| 60 | #[cfg(stm32u5)] | 60 | #[cfg(stm32u5)] |
| 61 | impl<T: Instance> super::VBatConverter for T { | 61 | impl<T: Instance> super::SealedSpecialConverter<super::Vbat> for T { |
| 62 | const CHANNEL: u8 = 18; | 62 | const CHANNEL: u8 = 18; |
| 63 | } | 63 | } |
| 64 | 64 | ||
diff --git a/examples/stm32g4/src/bin/adc.rs b/examples/stm32g4/src/bin/adc.rs index 695f37115..94315141c 100644 --- a/examples/stm32g4/src/bin/adc.rs +++ b/examples/stm32g4/src/bin/adc.rs | |||
| @@ -30,9 +30,14 @@ async fn main(_spawner: Spawner) { | |||
| 30 | 30 | ||
| 31 | let mut adc = Adc::new(p.ADC2); | 31 | let mut adc = Adc::new(p.ADC2); |
| 32 | 32 | ||
| 33 | let mut adc_temp = Adc::new(p.ADC1); | ||
| 34 | let mut temperature = adc_temp.enable_temperature(); | ||
| 35 | |||
| 33 | loop { | 36 | loop { |
| 34 | let measured = adc.blocking_read(&mut p.PA7, SampleTime::CYCLES24_5); | 37 | let measured = adc.blocking_read(&mut p.PA7, SampleTime::CYCLES24_5); |
| 38 | let temperature = adc_temp.blocking_read(&mut temperature, SampleTime::CYCLES24_5); | ||
| 35 | info!("measured: {}", measured); | 39 | info!("measured: {}", measured); |
| 40 | info!("temperature: {}", temperature); | ||
| 36 | Timer::after_millis(500).await; | 41 | Timer::after_millis(500).await; |
| 37 | } | 42 | } |
| 38 | } | 43 | } |
