This commit is contained in:
Gustav Toft
2024-04-11 09:07:38 +02:00
18 changed files with 68 additions and 68 deletions
embassy-stm32/src/adc
examples
stm32f0
src
stm32f1
src
stm32f334
stm32f4
src
stm32f7
src
stm32g4
src
stm32h7
src
stm32l0
src
stm32l4
src
tests/stm32/src/bin

@ -3,8 +3,8 @@ use core::marker::PhantomData;
use core::task::Poll; use core::task::Poll;
use embassy_hal_internal::into_ref; use embassy_hal_internal::into_ref;
use embedded_hal_02::blocking::delay::DelayUs;
use super::blocking_delay_us;
use crate::adc::{Adc, AdcPin, Instance, SampleTime}; use crate::adc::{Adc, AdcPin, Instance, SampleTime};
use crate::time::Hertz; use crate::time::Hertz;
use crate::{interrupt, Peripheral}; use crate::{interrupt, Peripheral};
@ -48,14 +48,14 @@ impl<T: Instance> super::SealedAdcPin<T> for Temperature {
} }
impl<'d, T: Instance> Adc<'d, T> { impl<'d, T: Instance> Adc<'d, T> {
pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
into_ref!(adc); into_ref!(adc);
T::enable_and_reset(); T::enable_and_reset();
T::regs().cr2().modify(|reg| reg.set_adon(true)); T::regs().cr2().modify(|reg| reg.set_adon(true));
// 11.4: Before starting a calibration, the ADC must have been in power-on state (ADON bit = 1) // 11.4: Before starting a calibration, the ADC must have been in power-on state (ADON bit = 1)
// for at least two ADC clock cycles // for at least two ADC clock cycles.
delay.delay_us((1_000_000 * 2) / Self::freq().0 + 1); blocking_delay_us((1_000_000 * 2) / Self::freq().0 + 1);
// Reset calibration // Reset calibration
T::regs().cr2().modify(|reg| reg.set_rstcal(true)); T::regs().cr2().modify(|reg| reg.set_rstcal(true));
@ -70,7 +70,7 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
// One cycle after calibration // One cycle after calibration
delay.delay_us((1_000_000) / Self::freq().0 + 1); blocking_delay_us((1_000_000 * 1) / Self::freq().0 + 1);
Self { Self {
adc, adc,
@ -95,7 +95,7 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
} }
pub fn enable_vref(&self, _delay: &mut impl DelayUs<u32>) -> Vref { pub fn enable_vref(&self) -> Vref {
T::regs().cr2().modify(|reg| { T::regs().cr2().modify(|reg| {
reg.set_tsvrefe(true); reg.set_tsvrefe(true);
}); });

@ -3,8 +3,8 @@ use core::marker::PhantomData;
use core::task::Poll; use core::task::Poll;
use embassy_hal_internal::into_ref; use embassy_hal_internal::into_ref;
use embedded_hal_02::blocking::delay::DelayUs;
use super::blocking_delay_us;
use crate::adc::{Adc, AdcPin, Instance, SampleTime}; use crate::adc::{Adc, AdcPin, Instance, SampleTime};
use crate::interrupt::typelevel::Interrupt; use crate::interrupt::typelevel::Interrupt;
use crate::time::Hertz; use crate::time::Hertz;
@ -58,7 +58,6 @@ impl<'d, T: Instance> Adc<'d, T> {
pub fn new( pub fn new(
adc: impl Peripheral<P = T> + 'd, adc: impl Peripheral<P = T> + 'd,
_irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd, _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
delay: &mut impl DelayUs<u32>,
) -> Self { ) -> Self {
use crate::pac::adc::vals; use crate::pac::adc::vals;
@ -71,7 +70,7 @@ impl<'d, T: Instance> Adc<'d, T> {
T::regs().cr().modify(|w| w.set_advregen(vals::Advregen::ENABLED)); T::regs().cr().modify(|w| w.set_advregen(vals::Advregen::ENABLED));
// Wait for the regulator to stabilize // Wait for the regulator to stabilize
delay.delay_us(10); blocking_delay_us(10);
assert!(!T::regs().cr().read().aden()); assert!(!T::regs().cr().read().aden());
@ -81,8 +80,8 @@ impl<'d, T: Instance> Adc<'d, T> {
while T::regs().cr().read().adcal() {} while T::regs().cr().read().adcal() {}
// Wait more than 4 clock cycles after adcal is cleared (RM0364 p. 223) // Wait more than 4 clock cycles after adcal is cleared (RM0364 p. 223).
delay.delay_us(1 + (6 * 1_000_000 / Self::freq().0)); blocking_delay_us((1_000_000 * 4) / Self::freq().0 + 1);
// Enable the adc // Enable the adc
T::regs().cr().modify(|w| w.set_aden(true)); T::regs().cr().modify(|w| w.set_aden(true));
@ -117,7 +116,7 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
} }
pub fn enable_vref(&self, _delay: &mut impl DelayUs<u32>) -> Vref { pub fn enable_vref(&self) -> Vref {
T::common_regs().ccr().modify(|w| w.set_vrefen(true)); T::common_regs().ccr().modify(|w| w.set_vrefen(true));
Vref {} Vref {}

@ -69,6 +69,15 @@ trait SealedInternalChannel<T> {
fn channel(&self) -> u8; fn channel(&self) -> u8;
} }
/// Performs a busy-wait delay for a specified number of microseconds.
#[allow(unused)]
pub(crate) fn blocking_delay_us(us: u32) {
#[cfg(time)]
embassy_time::block_for(embassy_time::Duration::from_micros(us));
#[cfg(not(time))]
cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 * us / 1_000_000);
}
/// ADC instance. /// ADC instance.
#[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)))] #[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)))]
#[allow(private_bounds)] #[allow(private_bounds)]

@ -3,10 +3,10 @@ use core::marker::PhantomData;
use core::task::Poll; use core::task::Poll;
use embassy_hal_internal::into_ref; use embassy_hal_internal::into_ref;
use embedded_hal_02::blocking::delay::DelayUs;
#[cfg(adc_l0)] #[cfg(adc_l0)]
use stm32_metapac::adc::vals::Ckmode; use stm32_metapac::adc::vals::Ckmode;
use super::blocking_delay_us;
use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
use crate::interrupt::typelevel::Interrupt; use crate::interrupt::typelevel::Interrupt;
use crate::peripherals::ADC; use crate::peripherals::ADC;
@ -65,7 +65,6 @@ impl<'d, T: Instance> Adc<'d, T> {
pub fn new( pub fn new(
adc: impl Peripheral<P = T> + 'd, adc: impl Peripheral<P = T> + 'd,
_irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd, _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
delay: &mut impl DelayUs<u32>,
) -> Self { ) -> Self {
into_ref!(adc); into_ref!(adc);
T::enable_and_reset(); T::enable_and_reset();
@ -74,7 +73,7 @@ impl<'d, T: Instance> Adc<'d, T> {
// //
// Table 57. ADC characteristics // Table 57. ADC characteristics
// tstab = 14 * 1/fadc // tstab = 14 * 1/fadc
delay.delay_us(1); blocking_delay_us(1);
// set default PCKL/2 on L0s because HSI is disabled in the default clock config // set default PCKL/2 on L0s because HSI is disabled in the default clock config
#[cfg(adc_l0)] #[cfg(adc_l0)]
@ -114,7 +113,7 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
#[cfg(not(adc_l0))] #[cfg(not(adc_l0))]
pub fn enable_vbat(&self, _delay: &mut impl DelayUs<u32>) -> Vbat { pub fn enable_vbat(&self) -> Vbat {
// SMP must be ≥ 56 ADC clock cycles when using HSI14. // SMP must be ≥ 56 ADC clock cycles when using HSI14.
// //
// 6.3.20 Vbat monitoring characteristics // 6.3.20 Vbat monitoring characteristics
@ -123,22 +122,22 @@ impl<'d, T: Instance> Adc<'d, T> {
Vbat Vbat
} }
pub fn enable_vref(&self, delay: &mut impl DelayUs<u32>) -> Vref { pub fn enable_vref(&self) -> Vref {
// Table 28. Embedded internal reference voltage // Table 28. Embedded internal reference voltage
// tstart = 10μs // tstart = 10μs
T::regs().ccr().modify(|reg| reg.set_vrefen(true)); T::regs().ccr().modify(|reg| reg.set_vrefen(true));
delay.delay_us(10); blocking_delay_us(10);
Vref Vref
} }
pub fn enable_temperature(&self, delay: &mut impl DelayUs<u32>) -> Temperature { pub fn enable_temperature(&self) -> Temperature {
// SMP must be ≥ 56 ADC clock cycles when using HSI14. // SMP must be ≥ 56 ADC clock cycles when using HSI14.
// //
// 6.3.19 Temperature sensor characteristics // 6.3.19 Temperature sensor characteristics
// tstart ≤ 10μs // tstart ≤ 10μs
// ts_temp ≥ 4μs // ts_temp ≥ 4μs
T::regs().ccr().modify(|reg| reg.set_tsen(true)); T::regs().ccr().modify(|reg| reg.set_tsen(true));
delay.delay_us(10); blocking_delay_us(10);
Temperature Temperature
} }

@ -1,6 +1,6 @@
use embassy_hal_internal::into_ref; use embassy_hal_internal::into_ref;
use embedded_hal_02::blocking::delay::DelayUs;
use super::blocking_delay_us;
use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
use crate::peripherals::ADC1; use crate::peripherals::ADC1;
use crate::time::Hertz; use crate::time::Hertz;
@ -11,9 +11,6 @@ pub const VREF_DEFAULT_MV: u32 = 3300;
/// VREF voltage used for factory calibration of VREFINTCAL register. /// VREF voltage used for factory calibration of VREFINTCAL register.
pub const VREF_CALIB_MV: u32 = 3300; pub const VREF_CALIB_MV: u32 = 3300;
/// ADC turn-on time
pub const ADC_POWERUP_TIME_US: u32 = 3;
pub struct VrefInt; pub struct VrefInt;
impl AdcPin<ADC1> for VrefInt {} impl AdcPin<ADC1> for VrefInt {}
impl super::SealedAdcPin<ADC1> for VrefInt { impl super::SealedAdcPin<ADC1> for VrefInt {
@ -97,7 +94,7 @@ impl<'d, T> Adc<'d, T>
where where
T: Instance, T: Instance,
{ {
pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
into_ref!(adc); into_ref!(adc);
T::enable_and_reset(); T::enable_and_reset();
@ -107,7 +104,7 @@ where
reg.set_adon(true); reg.set_adon(true);
}); });
delay.delay_us(ADC_POWERUP_TIME_US); blocking_delay_us(3);
Self { Self {
adc, adc,

@ -1,7 +1,7 @@
use cfg_if::cfg_if; use cfg_if::cfg_if;
use embassy_hal_internal::into_ref; use embassy_hal_internal::into_ref;
use embedded_hal_02::blocking::delay::DelayUs;
use super::blocking_delay_us;
use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
use crate::Peripheral; use crate::Peripheral;
@ -74,7 +74,7 @@ cfg_if! {
} }
impl<'d, T: Instance> Adc<'d, T> { impl<'d, T: Instance> Adc<'d, T> {
pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
into_ref!(adc); into_ref!(adc);
T::enable_and_reset(); T::enable_and_reset();
T::regs().cr().modify(|reg| { T::regs().cr().modify(|reg| {
@ -88,7 +88,7 @@ impl<'d, T: Instance> Adc<'d, T> {
reg.set_chselrmod(false); reg.set_chselrmod(false);
}); });
delay.delay_us(20); blocking_delay_us(20);
T::regs().cr().modify(|reg| { T::regs().cr().modify(|reg| {
reg.set_adcal(true); reg.set_adcal(true);
@ -98,7 +98,7 @@ impl<'d, T: Instance> Adc<'d, T> {
// spin // spin
} }
delay.delay_us(1); blocking_delay_us(1);
Self { Self {
adc, adc,
@ -106,7 +106,7 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
} }
pub fn enable_vrefint(&self, delay: &mut impl DelayUs<u32>) -> VrefInt { pub fn enable_vrefint(&self) -> VrefInt {
#[cfg(not(adc_g0))] #[cfg(not(adc_g0))]
T::common_regs().ccr().modify(|reg| { T::common_regs().ccr().modify(|reg| {
reg.set_vrefen(true); reg.set_vrefen(true);
@ -117,10 +117,8 @@ impl<'d, T: Instance> Adc<'d, T> {
}); });
// "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us // "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us
// to stabilize the internal voltage reference, we wait a little more. // to stabilize the internal voltage reference.
// TODO: delay 15us blocking_delay_us(15);
//cortex_m::asm::delay(20_000_000);
delay.delay_us(15);
VrefInt {} VrefInt {}
} }

@ -1,9 +1,8 @@
use embedded_hal_02::blocking::delay::DelayUs;
#[allow(unused)] #[allow(unused)]
use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel};
use pac::adccommon::vals::Presc; use pac::adccommon::vals::Presc;
use super::{Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime}; use super::{blocking_delay_us, Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime};
use crate::time::Hertz; use crate::time::Hertz;
use crate::{pac, Peripheral}; use crate::{pac, Peripheral};
@ -129,7 +128,7 @@ impl Prescaler {
impl<'d, T: Instance> Adc<'d, T> { impl<'d, T: Instance> Adc<'d, T> {
/// Create a new ADC driver. /// Create a new ADC driver.
pub fn new(adc: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u16>) -> Self { pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
embassy_hal_internal::into_ref!(adc); embassy_hal_internal::into_ref!(adc);
T::enable_and_reset(); T::enable_and_reset();
@ -161,11 +160,11 @@ impl<'d, T: Instance> Adc<'d, T> {
adc, adc,
sample_time: SampleTime::from_bits(0), sample_time: SampleTime::from_bits(0),
}; };
s.power_up(delay); s.power_up();
s.configure_differential_inputs(); s.configure_differential_inputs();
s.calibrate(); s.calibrate();
delay.delay_us(1); blocking_delay_us(1);
s.enable(); s.enable();
s.configure(); s.configure();
@ -173,13 +172,13 @@ impl<'d, T: Instance> Adc<'d, T> {
s s
} }
fn power_up(&mut self, delay: &mut impl DelayUs<u16>) { fn power_up(&mut self) {
T::regs().cr().modify(|reg| { T::regs().cr().modify(|reg| {
reg.set_deeppwd(false); reg.set_deeppwd(false);
reg.set_advregen(true); reg.set_advregen(true);
}); });
delay.delay_us(10); blocking_delay_us(10);
} }
fn configure_differential_inputs(&mut self) { fn configure_differential_inputs(&mut self) {

@ -6,7 +6,7 @@ use embassy_executor::Spawner;
use embassy_stm32::adc::{Adc, SampleTime}; use embassy_stm32::adc::{Adc, SampleTime};
use embassy_stm32::peripherals::ADC; use embassy_stm32::peripherals::ADC;
use embassy_stm32::{adc, bind_interrupts}; use embassy_stm32::{adc, bind_interrupts};
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -18,11 +18,11 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC, Irqs, &mut Delay); let mut adc = Adc::new(p.ADC, Irqs);
adc.set_sample_time(SampleTime::CYCLES71_5); adc.set_sample_time(SampleTime::CYCLES71_5);
let mut pin = p.PA1; let mut pin = p.PA1;
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref();
let vrefint_sample = adc.read(&mut vrefint).await; let vrefint_sample = adc.read(&mut vrefint).await;
let convert_to_millivolts = |sample| { let convert_to_millivolts = |sample| {
// From https://www.st.com/resource/en/datasheet/stm32f031c6.pdf // From https://www.st.com/resource/en/datasheet/stm32f031c6.pdf

@ -6,7 +6,7 @@ use embassy_executor::Spawner;
use embassy_stm32::adc::Adc; use embassy_stm32::adc::Adc;
use embassy_stm32::peripherals::ADC1; use embassy_stm32::peripherals::ADC1;
use embassy_stm32::{adc, bind_interrupts}; use embassy_stm32::{adc, bind_interrupts};
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -18,10 +18,10 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC1, &mut Delay); let mut adc = Adc::new(p.ADC1);
let mut pin = p.PB1; let mut pin = p.PB1;
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref();
let vrefint_sample = adc.read(&mut vrefint).await; let vrefint_sample = adc.read(&mut vrefint).await;
let convert_to_millivolts = |sample| { let convert_to_millivolts = |sample| {
// From http://www.st.com/resource/en/datasheet/CD00161566.pdf // From http://www.st.com/resource/en/datasheet/CD00161566.pdf

@ -7,7 +7,7 @@ use embassy_stm32::adc::{Adc, SampleTime};
use embassy_stm32::peripherals::ADC1; use embassy_stm32::peripherals::ADC1;
use embassy_stm32::time::mhz; use embassy_stm32::time::mhz;
use embassy_stm32::{adc, bind_interrupts, Config}; use embassy_stm32::{adc, bind_interrupts, Config};
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -38,13 +38,13 @@ async fn main(_spawner: Spawner) -> ! {
info!("create adc..."); info!("create adc...");
let mut adc = Adc::new(p.ADC1, Irqs, &mut Delay); let mut adc = Adc::new(p.ADC1, Irqs);
adc.set_sample_time(SampleTime::CYCLES601_5); adc.set_sample_time(SampleTime::CYCLES601_5);
info!("enable vrefint..."); info!("enable vrefint...");
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref();
let mut temperature = adc.enable_temperature(); let mut temperature = adc.enable_temperature();
loop { loop {

@ -8,7 +8,7 @@ use embassy_stm32::opamp::{OpAmp, OpAmpGain};
use embassy_stm32::peripherals::ADC2; use embassy_stm32::peripherals::ADC2;
use embassy_stm32::time::mhz; use embassy_stm32::time::mhz;
use embassy_stm32::{adc, bind_interrupts, Config}; use embassy_stm32::{adc, bind_interrupts, Config};
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -39,14 +39,14 @@ async fn main(_spawner: Spawner) -> ! {
info!("create adc..."); info!("create adc...");
let mut adc = Adc::new(p.ADC2, Irqs, &mut Delay); let mut adc = Adc::new(p.ADC2, Irqs);
let mut opamp = OpAmp::new(p.OPAMP2); let mut opamp = OpAmp::new(p.OPAMP2);
adc.set_sample_time(SampleTime::CYCLES601_5); adc.set_sample_time(SampleTime::CYCLES601_5);
info!("enable vrefint..."); info!("enable vrefint...");
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref();
let mut temperature = adc.enable_temperature(); let mut temperature = adc.enable_temperature();
let mut buffer = opamp.buffer_ext(&mut p.PA7, &mut p.PA6, OpAmpGain::Mul1); let mut buffer = opamp.buffer_ext(&mut p.PA7, &mut p.PA6, OpAmpGain::Mul1);

@ -14,7 +14,7 @@ async fn main(_spawner: Spawner) {
info!("Hello World!"); info!("Hello World!");
let mut delay = Delay; let mut delay = Delay;
let mut adc = Adc::new(p.ADC1, &mut delay); let mut adc = Adc::new(p.ADC1);
let mut pin = p.PC1; let mut pin = p.PC1;
let mut vrefint = adc.enable_vrefint(); let mut vrefint = adc.enable_vrefint();

@ -4,7 +4,7 @@
use defmt::*; use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::adc::Adc; use embassy_stm32::adc::Adc;
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
#[embassy_executor::main] #[embassy_executor::main]
@ -12,7 +12,7 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC1, &mut Delay); let mut adc = Adc::new(p.ADC1);
let mut pin = p.PA3; let mut pin = p.PA3;
let mut vrefint = adc.enable_vrefint(); let mut vrefint = adc.enable_vrefint();

@ -5,7 +5,7 @@ use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::adc::{Adc, SampleTime}; use embassy_stm32::adc::{Adc, SampleTime};
use embassy_stm32::Config; use embassy_stm32::Config;
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
#[embassy_executor::main] #[embassy_executor::main]
@ -28,7 +28,7 @@ async fn main(_spawner: Spawner) {
let mut p = embassy_stm32::init(config); let mut p = embassy_stm32::init(config);
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC2, &mut Delay); let mut adc = Adc::new(p.ADC2);
adc.set_sample_time(SampleTime::CYCLES32_5); adc.set_sample_time(SampleTime::CYCLES32_5);
loop { loop {

@ -5,7 +5,7 @@ use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::adc::{Adc, SampleTime}; use embassy_stm32::adc::{Adc, SampleTime};
use embassy_stm32::Config; use embassy_stm32::Config;
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
#[embassy_executor::main] #[embassy_executor::main]
@ -44,7 +44,7 @@ async fn main(_spawner: Spawner) {
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC3, &mut Delay); let mut adc = Adc::new(p.ADC3);
adc.set_sample_time(SampleTime::CYCLES32_5); adc.set_sample_time(SampleTime::CYCLES32_5);

@ -6,7 +6,7 @@ use embassy_executor::Spawner;
use embassy_stm32::adc::{Adc, SampleTime}; use embassy_stm32::adc::{Adc, SampleTime};
use embassy_stm32::peripherals::ADC; use embassy_stm32::peripherals::ADC;
use embassy_stm32::{adc, bind_interrupts}; use embassy_stm32::{adc, bind_interrupts};
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -18,11 +18,11 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC, Irqs, &mut Delay); let mut adc = Adc::new(p.ADC, Irqs);
adc.set_sample_time(SampleTime::CYCLES79_5); adc.set_sample_time(SampleTime::CYCLES79_5);
let mut pin = p.PA1; let mut pin = p.PA1;
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref();
let vrefint_sample = adc.read(&mut vrefint).await; let vrefint_sample = adc.read(&mut vrefint).await;
let convert_to_millivolts = |sample| { let convert_to_millivolts = |sample| {
// From https://www.st.com/resource/en/datasheet/stm32l051c6.pdf // From https://www.st.com/resource/en/datasheet/stm32l051c6.pdf

@ -4,7 +4,6 @@
use defmt::*; use defmt::*;
use embassy_stm32::adc::{Adc, Resolution}; use embassy_stm32::adc::{Adc, Resolution};
use embassy_stm32::Config; use embassy_stm32::Config;
use embassy_time::Delay;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
#[cortex_m_rt::entry] #[cortex_m_rt::entry]
@ -18,7 +17,7 @@ fn main() -> ! {
} }
let p = embassy_stm32::init(config); let p = embassy_stm32::init(config);
let mut adc = Adc::new(p.ADC1, &mut Delay); let mut adc = Adc::new(p.ADC1);
//adc.enable_vref(); //adc.enable_vref();
adc.set_resolution(Resolution::BITS8); adc.set_resolution(Resolution::BITS8);
let mut channel = p.PC0; let mut channel = p.PC0;

@ -13,7 +13,7 @@ use embassy_executor::Spawner;
use embassy_stm32::adc::Adc; use embassy_stm32::adc::Adc;
use embassy_stm32::dac::{DacCh1, Value}; use embassy_stm32::dac::{DacCh1, Value};
use embassy_stm32::dma::NoDma; use embassy_stm32::dma::NoDma;
use embassy_time::{Delay, Timer}; use embassy_time::Timer;
use micromath::F32Ext; use micromath::F32Ext;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
@ -28,7 +28,7 @@ async fn main(_spawner: Spawner) {
let mut adc_pin = unsafe { core::ptr::read(&dac_pin) }; let mut adc_pin = unsafe { core::ptr::read(&dac_pin) };
let mut dac = DacCh1::new(dac, NoDma, dac_pin); let mut dac = DacCh1::new(dac, NoDma, dac_pin);
let mut adc = Adc::new(adc, &mut Delay); let mut adc = Adc::new(adc);
#[cfg(feature = "stm32h755zi")] #[cfg(feature = "stm32h755zi")]
let normalization_factor = 256; let normalization_factor = 256;