aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-04-25 00:09:13 +0200
committerDario Nieuwenhuis <[email protected]>2025-04-25 00:12:02 +0200
commit18eea73d198b4cc1bed3e034c912518ce47888cc (patch)
treef2bb6921e7e34a5ac7e035f321a84f3e555b5d90
parentb32ff0c8f790379074c38d0409a3bf7709023f8b (diff)
stm32/adc: add h7rs support.
-rw-r--r--embassy-stm32/src/adc/mod.rs4
-rw-r--r--embassy-stm32/src/adc/v3.rs20
2 files changed, 13 insertions, 11 deletions
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index 321db7431..f46e87f38 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -11,7 +11,7 @@
11#[cfg_attr(adc_v1, path = "v1.rs")] 11#[cfg_attr(adc_v1, path = "v1.rs")]
12#[cfg_attr(adc_l0, path = "v1.rs")] 12#[cfg_attr(adc_l0, path = "v1.rs")]
13#[cfg_attr(adc_v2, path = "v2.rs")] 13#[cfg_attr(adc_v2, path = "v2.rs")]
14#[cfg_attr(any(adc_v3, adc_g0, adc_h5, adc_u0), path = "v3.rs")] 14#[cfg_attr(any(adc_v3, adc_g0, adc_h5, adc_h7rs, adc_u0), path = "v3.rs")]
15#[cfg_attr(any(adc_v4, adc_u5), path = "v4.rs")] 15#[cfg_attr(any(adc_v4, adc_u5), path = "v4.rs")]
16#[cfg_attr(adc_g4, path = "g4.rs")] 16#[cfg_attr(adc_g4, path = "g4.rs")]
17#[cfg_attr(adc_c0, path = "c0.rs")] 17#[cfg_attr(adc_c0, path = "c0.rs")]
@@ -108,6 +108,7 @@ pub(crate) fn blocking_delay_us(us: u32) {
108 adc_g0, 108 adc_g0,
109 adc_u0, 109 adc_u0,
110 adc_h5, 110 adc_h5,
111 adc_h7rs,
111 adc_u5, 112 adc_u5,
112 adc_c0 113 adc_c0
113)))] 114)))]
@@ -129,6 +130,7 @@ pub trait Instance: SealedInstance + crate::PeripheralType {
129 adc_g0, 130 adc_g0,
130 adc_u0, 131 adc_u0,
131 adc_h5, 132 adc_h5,
133 adc_h7rs,
132 adc_u5, 134 adc_u5,
133 adc_c0 135 adc_c0
134))] 136))]
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs
index 2de12d1d6..1c5ad16e9 100644
--- a/embassy-stm32/src/adc/v3.rs
+++ b/embassy-stm32/src/adc/v3.rs
@@ -19,7 +19,7 @@ impl<T: Instance> SealedAdcChannel<T> for VrefInt {
19 cfg_if! { 19 cfg_if! {
20 if #[cfg(adc_g0)] { 20 if #[cfg(adc_g0)] {
21 let val = 13; 21 let val = 13;
22 } else if #[cfg(adc_h5)] { 22 } else if #[cfg(any(adc_h5, adc_h7rs))] {
23 let val = 17; 23 let val = 17;
24 } else if #[cfg(adc_u0)] { 24 } else if #[cfg(adc_u0)] {
25 let val = 12; 25 let val = 12;
@@ -38,7 +38,7 @@ impl<T: Instance> SealedAdcChannel<T> for Temperature {
38 cfg_if! { 38 cfg_if! {
39 if #[cfg(adc_g0)] { 39 if #[cfg(adc_g0)] {
40 let val = 12; 40 let val = 12;
41 } else if #[cfg(adc_h5)] { 41 } else if #[cfg(any(adc_h5, adc_h7rs))] {
42 let val = 16; 42 let val = 16;
43 } else if #[cfg(adc_u0)] { 43 } else if #[cfg(adc_u0)] {
44 let val = 11; 44 let val = 11;
@@ -57,9 +57,9 @@ impl<T: Instance> SealedAdcChannel<T> for Vbat {
57 cfg_if! { 57 cfg_if! {
58 if #[cfg(adc_g0)] { 58 if #[cfg(adc_g0)] {
59 let val = 14; 59 let val = 14;
60 } else if #[cfg(adc_h5)] { 60 } else if #[cfg(any(adc_h5, adc_h7rs))] {
61 let val = 2; 61 let val = 2;
62 } else if #[cfg(adc_h5)] { 62 } else if #[cfg(any(adc_h5, adc_h7rs))] {
63 let val = 13; 63 let val = 13;
64 } else { 64 } else {
65 let val = 18; 65 let val = 18;
@@ -70,7 +70,7 @@ impl<T: Instance> SealedAdcChannel<T> for Vbat {
70} 70}
71 71
72cfg_if! { 72cfg_if! {
73 if #[cfg(adc_h5)] { 73 if #[cfg(any(adc_h5, adc_h7rs))] {
74 pub struct VddCore; 74 pub struct VddCore;
75 impl<T: Instance> AdcChannel<T> for VddCore {} 75 impl<T: Instance> AdcChannel<T> for VddCore {}
76 impl<T: Instance> super::SealedAdcChannel<T> for VddCore { 76 impl<T: Instance> super::SealedAdcChannel<T> for VddCore {
@@ -171,7 +171,7 @@ impl<'d, T: Instance> Adc<'d, T> {
171 T::regs().ccr().modify(|reg| { 171 T::regs().ccr().modify(|reg| {
172 reg.set_tsen(true); 172 reg.set_tsen(true);
173 }); 173 });
174 } else if #[cfg(adc_h5)] { 174 } else if #[cfg(any(adc_h5, adc_h7rs))] {
175 T::common_regs().ccr().modify(|reg| { 175 T::common_regs().ccr().modify(|reg| {
176 reg.set_tsen(true); 176 reg.set_tsen(true);
177 }); 177 });
@@ -191,7 +191,7 @@ impl<'d, T: Instance> Adc<'d, T> {
191 T::regs().ccr().modify(|reg| { 191 T::regs().ccr().modify(|reg| {
192 reg.set_vbaten(true); 192 reg.set_vbaten(true);
193 }); 193 });
194 } else if #[cfg(adc_h5)] { 194 } else if #[cfg(any(adc_h5, adc_h7rs))] {
195 T::common_regs().ccr().modify(|reg| { 195 T::common_regs().ccr().modify(|reg| {
196 reg.set_vbaten(true); 196 reg.set_vbaten(true);
197 }); 197 });
@@ -414,7 +414,7 @@ impl<'d, T: Instance> Adc<'d, T> {
414 fn configure_channel(channel: &mut impl AdcChannel<T>, sample_time: SampleTime) { 414 fn configure_channel(channel: &mut impl AdcChannel<T>, sample_time: SampleTime) {
415 // RM0492, RM0481, etc. 415 // RM0492, RM0481, etc.
416 // "This option bit must be set to 1 when ADCx_INP0 or ADCx_INN1 channel is selected." 416 // "This option bit must be set to 1 when ADCx_INP0 or ADCx_INN1 channel is selected."
417 #[cfg(adc_h5)] 417 #[cfg(any(adc_h5, adc_h7rs))]
418 if channel.channel() == 0 { 418 if channel.channel() == 0 {
419 T::regs().or().modify(|reg| reg.set_op0(true)); 419 T::regs().or().modify(|reg| reg.set_op0(true));
420 } 420 }
@@ -447,7 +447,7 @@ impl<'d, T: Instance> Adc<'d, T> {
447 447
448 // RM0492, RM0481, etc. 448 // RM0492, RM0481, etc.
449 // "This option bit must be set to 1 when ADCx_INP0 or ADCx_INN1 channel is selected." 449 // "This option bit must be set to 1 when ADCx_INP0 or ADCx_INN1 channel is selected."
450 #[cfg(adc_h5)] 450 #[cfg(any(adc_h5, adc_h7rs))]
451 if channel.channel() == 0 { 451 if channel.channel() == 0 {
452 T::regs().or().modify(|reg| reg.set_op0(false)); 452 T::regs().or().modify(|reg| reg.set_op0(false));
453 } 453 }
@@ -475,7 +475,7 @@ impl<'d, T: Instance> Adc<'d, T> {
475 if #[cfg(any(adc_g0, adc_u0))] { 475 if #[cfg(any(adc_g0, adc_u0))] {
476 // On G0 and U6 all channels use the same sampling time. 476 // On G0 and U6 all channels use the same sampling time.
477 T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); 477 T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into()));
478 } else if #[cfg(adc_h5)] { 478 } else if #[cfg(any(adc_h5, adc_h7rs))] {
479 match _ch { 479 match _ch {
480 0..=9 => T::regs().smpr1().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())), 480 0..=9 => T::regs().smpr1().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())),
481 _ => T::regs().smpr2().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())), 481 _ => T::regs().smpr2().modify(|w| w.set_smp(_ch as usize % 10, sample_time.into())),