aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/adc/mod.rs6
-rw-r--r--embassy-stm32/src/adc/resolution.rs8
-rw-r--r--embassy-stm32/src/adc/sample_time.rs2
-rw-r--r--embassy-stm32/src/adc/v3.rs123
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")]
15mod _version; 15mod _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)))]
83pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> {} 83pub 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))]
86pub trait Instance: sealed::Instance + crate::Peripheral<P = Self> + crate::rcc::RccPeripheral {} 86pub 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))]
6pub enum Resolution { 6pub enum Resolution {
@@ -25,7 +25,7 @@ pub enum Resolution {
25 25
26impl Default for Resolution { 26impl 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))]
71impl_sample_time!( 71impl_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 @@
1use cfg_if::cfg_if;
1use embassy_hal_internal::into_ref; 2use embassy_hal_internal::into_ref;
2use embedded_hal_02::blocking::delay::DelayUs; 3use embedded_hal_02::blocking::delay::DelayUs;
3 4
@@ -13,10 +14,15 @@ pub struct VrefInt;
13impl<T: Instance> AdcPin<T> for VrefInt {} 14impl<T: Instance> AdcPin<T> for VrefInt {}
14impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { 15impl<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;
25impl<T: Instance> AdcPin<T> for Temperature {} 31impl<T: Instance> AdcPin<T> for Temperature {}
26impl<T: Instance> super::sealed::AdcPin<T> for Temperature { 32impl<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;
37impl<T: Instance> AdcPin<T> for Vbat {} 48impl<T: Instance> AdcPin<T> for Vbat {}
38impl<T: Instance> super::sealed::AdcPin<T> for Vbat { 49impl<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
64cfg_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
48impl<'d, T: Instance> Adc<'d, T> { 76impl<'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}