This commit is contained in:
Dion Dokter 2024-04-14 00:04:13 +02:00
parent 5f23e39052
commit b659e3d529
3 changed files with 33 additions and 15 deletions

View File

@ -10,7 +10,7 @@
#[cfg_attr(adc_v1, path = "v1.rs")] #[cfg_attr(adc_v1, path = "v1.rs")]
#[cfg_attr(adc_l0, path = "v1.rs")] #[cfg_attr(adc_l0, path = "v1.rs")]
#[cfg_attr(adc_v2, path = "v2.rs")] #[cfg_attr(adc_v2, path = "v2.rs")]
#[cfg_attr(any(adc_v3, adc_g0, adc_h5), path = "v3.rs")] #[cfg_attr(any(adc_v3, adc_g0, adc_h5, adc_u0), path = "v3.rs")]
#[cfg_attr(adc_v4, path = "v4.rs")] #[cfg_attr(adc_v4, path = "v4.rs")]
#[cfg_attr(adc_g4, path = "g4.rs")] #[cfg_attr(adc_g4, path = "g4.rs")]
mod _version; mod _version;
@ -91,6 +91,7 @@ pub(crate) fn blocking_delay_us(us: u32) {
adc_f3, adc_f3,
adc_f3_v1_1, adc_f3_v1_1,
adc_g0, adc_g0,
adc_u0,
adc_h5 adc_h5
)))] )))]
#[allow(private_bounds)] #[allow(private_bounds)]
@ -109,6 +110,7 @@ pub trait Instance: SealedInstance + crate::Peripheral<P = Self> {
adc_f3, adc_f3,
adc_f3_v1_1, adc_f3_v1_1,
adc_g0, adc_g0,
adc_u0,
adc_h5 adc_h5
))] ))]
#[allow(private_bounds)] #[allow(private_bounds)]

View File

@ -19,6 +19,8 @@ impl<T: Instance> super::SealedAdcPin<T> for VrefInt {
let val = 13; let val = 13;
} else if #[cfg(adc_h5)] { } else if #[cfg(adc_h5)] {
let val = 17; let val = 17;
} else if #[cfg(adc_u0)] {
let val = 12;
} else { } else {
let val = 0; let val = 0;
} }
@ -36,6 +38,8 @@ impl<T: Instance> super::SealedAdcPin<T> for Temperature {
let val = 12; let val = 12;
} else if #[cfg(adc_h5)] { } else if #[cfg(adc_h5)] {
let val = 16; let val = 16;
} else if #[cfg(adc_u0)] {
let val = 11;
} else { } else {
let val = 17; let val = 17;
} }
@ -53,6 +57,8 @@ impl<T: Instance> super::SealedAdcPin<T> for Vbat {
let val = 14; let val = 14;
} else if #[cfg(adc_h5)] { } else if #[cfg(adc_h5)] {
let val = 2; let val = 2;
} else if #[cfg(adc_h5)] {
let val = 13;
} else { } else {
let val = 18; let val = 18;
} }
@ -73,17 +79,29 @@ cfg_if! {
} }
} }
cfg_if! {
if #[cfg(adc_u0)] {
pub struct DacOut;
impl<T: Instance> AdcPin<T> for DacOut {}
impl<T: Instance> super::SealedAdcPin<T> for DacOut {
fn channel(&self) -> u8 {
19
}
}
}
}
impl<'d, T: Instance> Adc<'d, T> { impl<'d, T: Instance> Adc<'d, T> {
pub fn new(adc: impl Peripheral<P = T> + 'd) -> 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| {
#[cfg(not(adc_g0))] #[cfg(not(any(adc_g0, adc_u0)))]
reg.set_deeppwd(false); reg.set_deeppwd(false);
reg.set_advregen(true); reg.set_advregen(true);
}); });
#[cfg(adc_g0)] #[cfg(any(adc_g0, adc_u0))]
T::regs().cfgr1().modify(|reg| { T::regs().cfgr1().modify(|reg| {
reg.set_chselrmod(false); reg.set_chselrmod(false);
}); });
@ -107,11 +125,11 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
pub fn enable_vrefint(&self) -> VrefInt { pub fn enable_vrefint(&self) -> VrefInt {
#[cfg(not(adc_g0))] #[cfg(not(any(adc_g0, adc_u0)))]
T::common_regs().ccr().modify(|reg| { T::common_regs().ccr().modify(|reg| {
reg.set_vrefen(true); reg.set_vrefen(true);
}); });
#[cfg(adc_g0)] #[cfg(any(adc_g0, adc_u0))]
T::regs().ccr().modify(|reg| { T::regs().ccr().modify(|reg| {
reg.set_vrefen(true); reg.set_vrefen(true);
}); });
@ -125,7 +143,7 @@ impl<'d, T: Instance> Adc<'d, T> {
pub fn enable_temperature(&self) -> Temperature { pub fn enable_temperature(&self) -> Temperature {
cfg_if! { cfg_if! {
if #[cfg(adc_g0)] { if #[cfg(any(adc_g0, adc_u0))] {
T::regs().ccr().modify(|reg| { T::regs().ccr().modify(|reg| {
reg.set_tsen(true); reg.set_tsen(true);
}); });
@ -145,7 +163,7 @@ impl<'d, T: Instance> Adc<'d, T> {
pub fn enable_vbat(&self) -> Vbat { pub fn enable_vbat(&self) -> Vbat {
cfg_if! { cfg_if! {
if #[cfg(adc_g0)] { if #[cfg(any(adc_g0, adc_u0))] {
T::regs().ccr().modify(|reg| { T::regs().ccr().modify(|reg| {
reg.set_vbaten(true); reg.set_vbaten(true);
}); });
@ -168,9 +186,9 @@ impl<'d, T: Instance> Adc<'d, T> {
} }
pub fn set_resolution(&mut self, resolution: Resolution) { pub fn set_resolution(&mut self, resolution: Resolution) {
#[cfg(not(adc_g0))] #[cfg(not(any(adc_g0, adc_u0)))]
T::regs().cfgr().modify(|reg| reg.set_res(resolution.into())); T::regs().cfgr().modify(|reg| reg.set_res(resolution.into()));
#[cfg(adc_g0)] #[cfg(any(adc_g0, adc_u0))]
T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into())); T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into()));
} }
@ -231,9 +249,9 @@ impl<'d, T: Instance> Adc<'d, T> {
Self::set_channel_sample_time(pin.channel(), self.sample_time); Self::set_channel_sample_time(pin.channel(), self.sample_time);
// Select channel // Select channel
#[cfg(not(adc_g0))] #[cfg(not(any(adc_g0, adc_u0)))]
T::regs().sqr1().write(|reg| reg.set_sq(0, pin.channel())); T::regs().sqr1().write(|reg| reg.set_sq(0, pin.channel()));
#[cfg(adc_g0)] #[cfg(any(adc_g0, adc_u0))]
T::regs().chselr().write(|reg| reg.set_chsel(1 << pin.channel())); T::regs().chselr().write(|reg| reg.set_chsel(1 << pin.channel()));
// Some models are affected by an erratum: // Some models are affected by an erratum:
@ -261,7 +279,7 @@ impl<'d, T: Instance> Adc<'d, T> {
fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) { fn set_channel_sample_time(_ch: u8, sample_time: SampleTime) {
cfg_if! { cfg_if! {
if #[cfg(adc_g0)] { if #[cfg(any(adc_g0, adc_u0))] {
T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into())); T::regs().smpr().modify(|reg| reg.set_smp1(sample_time.into()));
} else if #[cfg(adc_h5)] { } else if #[cfg(adc_h5)] {
match _ch { match _ch {

View File

@ -26,8 +26,6 @@ fn main() -> ! {
loop { loop {
let v = adc.read(&mut channel); let v = adc.read(&mut channel);
info!("--> {}", v); info!("--> {}", v);
let v = adc.read(&mut temp); embassy_time::block_for(Duration::from_millis(200));
info!("Temp: --> {}", v);
embassy_time::block_for(Duration::from_millis(1000));
} }
} }