diff options
| author | xoviat <[email protected]> | 2025-11-14 19:31:19 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-11-14 19:31:19 +0000 |
| commit | 6c659b613d209b2c150199f548bcdf2dc3eb0f36 (patch) | |
| tree | 7ee310be1632812020f6975968710de68e8e7824 | |
| parent | 709b157620dd1f2f270ae9b874f62ac8b810da22 (diff) | |
| parent | a2c5a0d9480b99cdb09940637354bc61405ed7bd (diff) | |
Merge pull request #4887 from xoviat/adc-g4
adc: fix g4 injected sequence
| -rw-r--r-- | embassy-stm32/src/adc/g4.rs | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs index 514734017..bd8ccbf17 100644 --- a/embassy-stm32/src/adc/g4.rs +++ b/embassy-stm32/src/adc/g4.rs | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | #[cfg(stm32g4)] | ||
| 2 | use pac::adc::regs::Difsel as DifselReg; | ||
| 1 | #[allow(unused)] | 3 | #[allow(unused)] |
| 2 | #[cfg(stm32h7)] | 4 | #[cfg(stm32h7)] |
| 3 | use pac::adc::vals::{Adcaldif, Difsel, Exten}; | 5 | use pac::adc::vals::{Adcaldif, Difsel, Exten}; |
| @@ -179,6 +181,9 @@ impl<T: Instance> super::SealedAnyInstance for T { | |||
| 179 | w.set_l(sequence.len() as u8 - 1); | 181 | w.set_l(sequence.len() as u8 - 1); |
| 180 | }); | 182 | }); |
| 181 | 183 | ||
| 184 | #[cfg(stm32g4)] | ||
| 185 | let mut difsel = DifselReg::default(); | ||
| 186 | |||
| 182 | // Configure channels and ranks | 187 | // Configure channels and ranks |
| 183 | for (_i, ((ch, is_differential), sample_time)) in sequence.enumerate() { | 188 | for (_i, ((ch, is_differential), sample_time)) in sequence.enumerate() { |
| 184 | let sample_time = sample_time.into(); | 189 | let sample_time = sample_time.into(); |
| @@ -214,10 +219,8 @@ impl<T: Instance> super::SealedAnyInstance for T { | |||
| 214 | 219 | ||
| 215 | #[cfg(stm32g4)] | 220 | #[cfg(stm32g4)] |
| 216 | { | 221 | { |
| 217 | T::regs().cr().modify(|w| w.set_aden(false)); // disable adc | 222 | if ch < 18 { |
| 218 | 223 | difsel.set_difsel( | |
| 219 | T::regs().difsel().modify(|w| { | ||
| 220 | w.set_difsel( | ||
| 221 | ch.into(), | 224 | ch.into(), |
| 222 | if is_differential { | 225 | if is_differential { |
| 223 | Difsel::DIFFERENTIAL | 226 | Difsel::DIFFERENTIAL |
| @@ -225,11 +228,16 @@ impl<T: Instance> super::SealedAnyInstance for T { | |||
| 225 | Difsel::SINGLE_ENDED | 228 | Difsel::SINGLE_ENDED |
| 226 | }, | 229 | }, |
| 227 | ); | 230 | ); |
| 228 | }); | 231 | } |
| 229 | |||
| 230 | T::regs().cr().modify(|w| w.set_aden(true)); // enable adc | ||
| 231 | } | 232 | } |
| 232 | } | 233 | } |
| 234 | |||
| 235 | #[cfg(stm32g4)] | ||
| 236 | { | ||
| 237 | T::regs().cr().modify(|w| w.set_aden(false)); | ||
| 238 | T::regs().difsel().write_value(difsel); | ||
| 239 | T::enable(); | ||
| 240 | } | ||
| 233 | } | 241 | } |
| 234 | } | 242 | } |
| 235 | 243 | ||
| @@ -412,7 +420,6 @@ impl<'d, T: Instance + AnyInstance> Adc<'d, T> { | |||
| 412 | NR_INJECTED_RANKS | 420 | NR_INJECTED_RANKS |
| 413 | ); | 421 | ); |
| 414 | 422 | ||
| 415 | T::stop(); | ||
| 416 | T::enable(); | 423 | T::enable(); |
| 417 | 424 | ||
| 418 | T::regs().jsqr().modify(|w| w.set_jl(N as u8 - 1)); | 425 | T::regs().jsqr().modify(|w| w.set_jl(N as u8 - 1)); |
