aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-11 11:14:21 -0600
committerxoviat <[email protected]>2025-11-11 11:14:21 -0600
commit769941980442ada1524ee4f60f1d003735caff4b (patch)
treec4895854fc681b43fba37057729ad5698732acda
parentaecff11b662c8232e7c848962c6c9ccda0cd9bf3 (diff)
adc: seal special channels
-rw-r--r--embassy-stm32/src/adc/c0.rs4
-rw-r--r--embassy-stm32/src/adc/f1.rs6
-rw-r--r--embassy-stm32/src/adc/f3.rs6
-rw-r--r--embassy-stm32/src/adc/g4.rs32
-rw-r--r--embassy-stm32/src/adc/mod.rs43
-rw-r--r--embassy-stm32/src/adc/v1.rs8
-rw-r--r--embassy-stm32/src/adc/v2.rs8
-rw-r--r--embassy-stm32/src/adc/v3.rs24
-rw-r--r--embassy-stm32/src/adc/v4.rs16
-rw-r--r--examples/stm32g4/src/bin/adc.rs5
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;
24const CHSELR_SQ_MAX_CHANNEL: u8 = 14; 24const CHSELR_SQ_MAX_CHANNEL: u8 = 14;
25const CHSELR_SQ_SEQUENCE_END_MARKER: u8 = 0b1111; 25const CHSELR_SQ_SEQUENCE_END_MARKER: u8 = 0b1111;
26 26
27impl<T: Instance> super::VrefConverter for T { 27impl<T: Instance> super::SealedSpecialConverter<super::VrefInt> for T {
28 const CHANNEL: u8 = 10; 28 const CHANNEL: u8 = 10;
29} 29}
30 30
31impl<T: Instance> super::TemperatureConverter for T { 31impl<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;
3use core::task::Poll; 3use core::task::Poll;
4 4
5use super::blocking_delay_us; 5use super::blocking_delay_us;
6use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; 6use crate::adc::{Adc, AdcChannel, Instance, SampleTime, VrefInt};
7use crate::interrupt::typelevel::Interrupt; 7use crate::interrupt::typelevel::Interrupt;
8use crate::interrupt::{self}; 8use crate::interrupt::{self};
9use crate::time::Hertz; 9use crate::time::Hertz;
@@ -28,11 +28,11 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
28 } 28 }
29} 29}
30 30
31impl<T: Instance> super::VrefConverter for T { 31impl<T: Instance> super::SealedSpecialConverter<VrefInt> for T {
32 const CHANNEL: u8 = 17; 32 const CHANNEL: u8 = 17;
33} 33}
34 34
35impl<T: Instance> super::TemperatureConverter for T { 35impl<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;
3use core::task::Poll; 3use core::task::Poll;
4 4
5use super::blocking_delay_us; 5use super::blocking_delay_us;
6use crate::adc::{Adc, AdcChannel, Instance, SampleTime}; 6use crate::adc::{Adc, AdcChannel, Instance, SampleTime, VrefInt};
7use crate::interrupt::typelevel::Interrupt; 7use crate::interrupt::typelevel::Interrupt;
8use crate::time::Hertz; 8use crate::time::Hertz;
9use crate::{Peri, interrupt, rcc}; 9use crate::{Peri, interrupt, rcc};
@@ -29,11 +29,11 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
29 } 29 }
30} 30}
31 31
32impl<T: Instance> super::VrefConverter for T { 32impl<T: Instance> super::SealedSpecialConverter<VrefInt> for T {
33 const CHANNEL: u8 = 18; 33 const CHANNEL: u8 = 18;
34} 34}
35 35
36impl<T: Instance> super::TemperatureConverter for T { 36impl<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)]
768mod g4 { 768mod 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)]
816mod h7 { 816mod 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 108pub(self) trait SpecialChannel {}
109pub trait TemperatureConverter { 109
110 const CHANNEL: u8; 110/// Implemented for ADCs that have a special channel
111} 111trait SealedSpecialConverter<T: SpecialChannel + Sized> {
112/// Implemented for ADCs that have a Vref channel
113pub trait VrefConverter {
114 const CHANNEL: u8;
115}
116/// Implemented for ADCs that have a VBat channel
117pub 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. 116pub trait SpecialConverter<T: SpecialChannel + Sized>: SealedSpecialConverter<T> {}
123pub struct VrefInt; 117
124impl<T: Instance + VrefConverter> AdcChannel<T> for VrefInt {} 118impl<C: SpecialChannel + Sized, T: SealedSpecialConverter<C>> SpecialConverter<C> for T {}
125impl<T: Instance + VrefConverter> SealedAdcChannel<T> for VrefInt { 119
120impl<C: SpecialChannel, T: Instance + SealedSpecialConverter<C>> AdcChannel<T> for C {}
121impl<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
127pub struct VrefInt;
128impl SpecialChannel for VrefInt {}
129
131impl VrefInt { 130impl 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.
140pub struct Temperature; 139pub struct Temperature;
141impl<T: Instance + TemperatureConverter> AdcChannel<T> for Temperature {} 140impl SpecialChannel for Temperature {}
142impl<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.
149pub struct Vbat; 143pub struct Vbat;
150impl<T: Instance + VBatConverter> AdcChannel<T> for Vbat {} 144impl SpecialChannel for Vbat {}
151impl<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))]
46impl super::VBatConverter for crate::peripherals::ADC1 { 46impl 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))]
51impl super::VrefConverter for crate::peripherals::ADC1 { 51impl 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)]
56impl super::VrefConverter for crate::peripherals::ADC1 { 56impl 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))]
61impl super::TemperatureConverter for crate::peripherals::ADC1 { 61impl 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.
23pub const VREF_CALIB_MV: u32 = 3300; 23pub const VREF_CALIB_MV: u32 = 3300;
24 24
25impl super::VrefConverter for crate::peripherals::ADC1 { 25impl 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))]
30impl super::TemperatureConverter for crate::peripherals::ADC1 { 30impl 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)))]
35impl super::TemperatureConverter for crate::peripherals::ADC1 { 35impl super::SealedSpecialConverter<super::Temperature> for crate::peripherals::ADC1 {
36 const CHANNEL: u8 = 18; 36 const CHANNEL: u8 = 18;
37} 37}
38 38
39impl super::VBatConverter for crate::peripherals::ADC1 { 39impl 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;
36const SAMPLE_TIMES_CAPACITY: usize = 2; 36const SAMPLE_TIMES_CAPACITY: usize = 2;
37 37
38#[cfg(adc_g0)] 38#[cfg(adc_g0)]
39impl<T: Instance> super::VrefConverter for T { 39impl<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))]
43impl<T: Instance> super::VrefConverter for T { 43impl<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)]
47impl<T: Instance> super::VrefConverter for T { 47impl<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)))]
51impl<T: Instance> super::VrefConverter for T { 51impl<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)]
56impl<T: Instance> super::TemperatureConverter for T { 56impl<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))]
60impl<T: Instance> super::TemperatureConverter for T { 60impl<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)]
64impl<T: Instance> super::TemperatureConverter for T { 64impl<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)))]
68impl<T: Instance> super::TemperatureConverter for T { 68impl<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)]
73impl<T: Instance> super::VBatConverter for T { 73impl<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))]
77impl<T: Instance> super::VBatConverter for T { 77impl<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)]
81impl<T: Instance> super::VBatConverter for T { 81impl<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)))]
85impl<T: Instance> super::VBatConverter for T { 85impl<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);
26const MAX_ADC_CLK_FREQ: Hertz = Hertz::mhz(55); 26const MAX_ADC_CLK_FREQ: Hertz = Hertz::mhz(55);
27 27
28#[cfg(stm32g4)] 28#[cfg(stm32g4)]
29impl<T: Instance> super::VrefConverter for T { 29impl<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)]
33impl<T: Instance> super::TemperatureConverter for T { 33impl<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)]
38impl<T: Instance> super::VrefConverter for T { 38impl<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)]
42impl<T: Instance> super::TemperatureConverter for T { 42impl<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))]
48impl<T: Instance> super::VBatConverter for T { 48impl<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)]
53impl<T: Instance> super::VrefConverter for T { 53impl<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)]
57impl<T: Instance> super::TemperatureConverter for T { 57impl<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)]
61impl<T: Instance> super::VBatConverter for T { 61impl<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}