From 79fbf214ccc7be89d8d656cf0c5b5ffe5425bece Mon Sep 17 00:00:00 2001 From: clubby789 Date: Sun, 20 Jul 2025 15:38:42 +0100 Subject: [PATCH] Enable oversampling for ADC v3 --- embassy-stm32/src/adc/v3.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index 313244e19..fd74d5318 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs @@ -1,5 +1,7 @@ use cfg_if::cfg_if; use pac::adc::vals::Dmacfg; +#[cfg(adc_v3)] +use pac::adc::vals::{OversamplingRatio, OversamplingShift, Rovsm, Trovs}; use super::{ blocking_delay_us, Adc, AdcChannel, AnyAdcChannel, Instance, Resolution, RxDma, SampleTime, SealedAdcChannel, @@ -470,6 +472,23 @@ impl<'d, T: Instance> Adc<'d, T> { T::regs().cfgr2().modify(|reg| reg.set_ovse(enable)); } + #[cfg(adc_v3)] + pub fn enable_regular_oversampling_mode(&mut self, mode: Rovsm, trig_mode: Trovs, enable: bool) { + T::regs().cfgr2().modify(|reg| reg.set_trovs(trig_mode)); + T::regs().cfgr2().modify(|reg| reg.set_rovsm(mode)); + T::regs().cfgr2().modify(|reg| reg.set_rovse(enable)); + } + + #[cfg(adc_v3)] + pub fn set_oversampling_ratio(&mut self, ratio: OversamplingRatio) { + T::regs().cfgr2().modify(|reg| reg.set_ovsr(ratio)); + } + + #[cfg(adc_v3)] + pub fn set_oversampling_shift(&mut self, shift: OversamplingShift) { + T::regs().cfgr2().modify(|reg| reg.set_ovss(shift)); + } + fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { cfg_if! { if #[cfg(any(adc_g0, adc_u0))] {