diff options
| author | Olle Sandberg <[email protected]> | 2023-09-05 12:10:31 +0200 |
|---|---|---|
| committer | Olle Sandberg <[email protected]> | 2023-09-06 06:57:28 +0200 |
| commit | bb2d6c854273ea57eb7d898c0f67dd9f8020f3e7 (patch) | |
| tree | fa96b342a589787922dccd07067cc2a90c17cd36 | |
| parent | a05afc54262e180fbbbe5b9369246c5275a5c4a3 (diff) | |
adc_v3: replace cfg(stm32g0) + friends with cfg(adc_g0)
Since any MCU (not just STM32G0) using adc_g0 should probably be handled the same way.
| -rw-r--r-- | embassy-stm32/src/adc/mod.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 39 |
2 files changed, 29 insertions, 14 deletions
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index 0eeadfa93..013debca8 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs | |||
| @@ -33,7 +33,7 @@ pub struct Adc<'d, T: Instance> { | |||
| 33 | pub(crate) mod sealed { | 33 | pub(crate) mod sealed { |
| 34 | pub trait Instance { | 34 | pub trait Instance { |
| 35 | fn regs() -> crate::pac::adc::Adc; | 35 | fn regs() -> crate::pac::adc::Adc; |
| 36 | #[cfg(not(any(adc_f1, adc_v1, adc_f3_v2)))] | 36 | #[cfg(not(any(adc_f1, adc_v1, adc_f3_v2, adc_g0)))] |
| 37 | fn common_regs() -> crate::pac::adccommon::AdcCommon; | 37 | fn common_regs() -> crate::pac::adccommon::AdcCommon; |
| 38 | #[cfg(adc_f3)] | 38 | #[cfg(adc_f3)] |
| 39 | fn frequency() -> crate::time::Hertz; | 39 | fn frequency() -> crate::time::Hertz; |
| @@ -63,7 +63,7 @@ foreach_peripheral!( | |||
| 63 | fn regs() -> crate::pac::adc::Adc { | 63 | fn regs() -> crate::pac::adc::Adc { |
| 64 | crate::pac::$inst | 64 | crate::pac::$inst |
| 65 | } | 65 | } |
| 66 | #[cfg(not(any(adc_f1, adc_v1, adc_f3_v2)))] | 66 | #[cfg(not(any(adc_f1, adc_v1, adc_f3_v2, adc_g0)))] |
| 67 | fn common_regs() -> crate::pac::adccommon::AdcCommon { | 67 | fn common_regs() -> crate::pac::adccommon::AdcCommon { |
| 68 | foreach_peripheral!{ | 68 | foreach_peripheral!{ |
| 69 | (adccommon, $common_inst:ident) => { | 69 | (adccommon, $common_inst:ident) => { |
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index 821cc7f6a..7d63b0cee 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -26,9 +26,9 @@ pub struct VrefInt; | |||
| 26 | impl<T: Instance> AdcPin<T> for VrefInt {} | 26 | impl<T: Instance> AdcPin<T> for VrefInt {} |
| 27 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { | 27 | impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { |
| 28 | fn channel(&self) -> u8 { | 28 | fn channel(&self) -> u8 { |
| 29 | #[cfg(not(stm32g0))] | 29 | #[cfg(not(adc_g0))] |
| 30 | let val = 0; | 30 | let val = 0; |
| 31 | #[cfg(stm32g0)] | 31 | #[cfg(adc_g0)] |
| 32 | let val = 13; | 32 | let val = 13; |
| 33 | val | 33 | val |
| 34 | } | 34 | } |
| @@ -38,9 +38,9 @@ pub struct Temperature; | |||
| 38 | impl<T: Instance> AdcPin<T> for Temperature {} | 38 | impl<T: Instance> AdcPin<T> for Temperature {} |
| 39 | impl<T: Instance> super::sealed::AdcPin<T> for Temperature { | 39 | impl<T: Instance> super::sealed::AdcPin<T> for Temperature { |
| 40 | fn channel(&self) -> u8 { | 40 | fn channel(&self) -> u8 { |
| 41 | #[cfg(not(stm32g0))] | 41 | #[cfg(not(adc_g0))] |
| 42 | let val = 17; | 42 | let val = 17; |
| 43 | #[cfg(stm32g0)] | 43 | #[cfg(adc_g0)] |
| 44 | let val = 12; | 44 | let val = 12; |
| 45 | val | 45 | val |
| 46 | } | 46 | } |
| @@ -50,9 +50,9 @@ pub struct Vbat; | |||
| 50 | impl<T: Instance> AdcPin<T> for Vbat {} | 50 | impl<T: Instance> AdcPin<T> for Vbat {} |
| 51 | impl<T: Instance> super::sealed::AdcPin<T> for Vbat { | 51 | impl<T: Instance> super::sealed::AdcPin<T> for Vbat { |
| 52 | fn channel(&self) -> u8 { | 52 | fn channel(&self) -> u8 { |
| 53 | #[cfg(not(stm32g0))] | 53 | #[cfg(not(adc_g0))] |
| 54 | let val = 18; | 54 | let val = 18; |
| 55 | #[cfg(stm32g0)] | 55 | #[cfg(adc_g0)] |
| 56 | let val = 14; | 56 | let val = 14; |
| 57 | val | 57 | val |
| 58 | } | 58 | } |
| @@ -92,9 +92,14 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | pub fn enable_vrefint(&self, delay: &mut impl DelayUs<u32>) -> VrefInt { | 94 | pub fn enable_vrefint(&self, delay: &mut impl DelayUs<u32>) -> VrefInt { |
| 95 | #[cfg(not(adc_g0))] | ||
| 95 | T::common_regs().ccr().modify(|reg| { | 96 | T::common_regs().ccr().modify(|reg| { |
| 96 | reg.set_vrefen(true); | 97 | reg.set_vrefen(true); |
| 97 | }); | 98 | }); |
| 99 | #[cfg(adc_g0)] | ||
| 100 | T::regs().ccr().modify(|reg| { | ||
| 101 | reg.set_vrefen(true); | ||
| 102 | }); | ||
| 98 | 103 | ||
| 99 | // "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us | 104 | // "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us |
| 100 | // to stabilize the internal voltage reference, we wait a little more. | 105 | // to stabilize the internal voltage reference, we wait a little more. |
| @@ -106,17 +111,27 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 106 | } | 111 | } |
| 107 | 112 | ||
| 108 | pub fn enable_temperature(&self) -> Temperature { | 113 | pub fn enable_temperature(&self) -> Temperature { |
| 114 | #[cfg(not(adc_g0))] | ||
| 109 | T::common_regs().ccr().modify(|reg| { | 115 | T::common_regs().ccr().modify(|reg| { |
| 110 | reg.set_ch17sel(true); | 116 | reg.set_ch17sel(true); |
| 111 | }); | 117 | }); |
| 118 | #[cfg(adc_g0)] | ||
| 119 | T::regs().ccr().modify(|reg| { | ||
| 120 | reg.set_tsen(true); | ||
| 121 | }); | ||
| 112 | 122 | ||
| 113 | Temperature {} | 123 | Temperature {} |
| 114 | } | 124 | } |
| 115 | 125 | ||
| 116 | pub fn enable_vbat(&self) -> Vbat { | 126 | pub fn enable_vbat(&self) -> Vbat { |
| 127 | #[cfg(not(adc_g0))] | ||
| 117 | T::common_regs().ccr().modify(|reg| { | 128 | T::common_regs().ccr().modify(|reg| { |
| 118 | reg.set_ch18sel(true); | 129 | reg.set_ch18sel(true); |
| 119 | }); | 130 | }); |
| 131 | #[cfg(adc_g0)] | ||
| 132 | T::regs().ccr().modify(|reg| { | ||
| 133 | reg.set_vbaten(true); | ||
| 134 | }); | ||
| 120 | 135 | ||
| 121 | Vbat {} | 136 | Vbat {} |
| 122 | } | 137 | } |
| @@ -126,9 +141,9 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 126 | } | 141 | } |
| 127 | 142 | ||
| 128 | pub fn set_resolution(&mut self, resolution: Resolution) { | 143 | pub fn set_resolution(&mut self, resolution: Resolution) { |
| 129 | #[cfg(not(stm32g0))] | 144 | #[cfg(not(adc_g0))] |
| 130 | T::regs().cfgr().modify(|reg| reg.set_res(resolution.into())); | 145 | T::regs().cfgr().modify(|reg| reg.set_res(resolution.into())); |
| 131 | #[cfg(stm32g0)] | 146 | #[cfg(adc_g0)] |
| 132 | T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into())); | 147 | T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into())); |
| 133 | } | 148 | } |
| 134 | 149 | ||
| @@ -182,9 +197,9 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 182 | Self::set_channel_sample_time(pin.channel(), self.sample_time); | 197 | Self::set_channel_sample_time(pin.channel(), self.sample_time); |
| 183 | 198 | ||
| 184 | // Select channel | 199 | // Select channel |
| 185 | #[cfg(not(stm32g0))] | 200 | #[cfg(not(adc_g0))] |
| 186 | T::regs().sqr1().write(|reg| reg.set_sq(0, pin.channel())); | 201 | T::regs().sqr1().write(|reg| reg.set_sq(0, pin.channel())); |
| 187 | #[cfg(stm32g0)] | 202 | #[cfg(adc_g0)] |
| 188 | T::regs().chselr().write(|reg| reg.set_chsel(1 << pin.channel())); | 203 | T::regs().chselr().write(|reg| reg.set_chsel(1 << pin.channel())); |
| 189 | 204 | ||
| 190 | // Some models are affected by an erratum: | 205 | // Some models are affected by an erratum: |
| @@ -203,12 +218,12 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 203 | val | 218 | val |
| 204 | } | 219 | } |
| 205 | 220 | ||
| 206 | #[cfg(stm32g0)] | 221 | #[cfg(adc_g0)] |
| 207 | fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { | 222 | fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { |
| 208 | T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); | 223 | T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); |
| 209 | } | 224 | } |
| 210 | 225 | ||
| 211 | #[cfg(not(stm32g0))] | 226 | #[cfg(not(adc_g0))] |
| 212 | fn set_channel_sample_time(ch: u8, sample_time: SampleTime) { | 227 | fn set_channel_sample_time(ch: u8, sample_time: SampleTime) { |
| 213 | let sample_time = sample_time.into(); | 228 | let sample_time = sample_time.into(); |
| 214 | T::regs() | 229 | T::regs() |
