parent
							
								
									8d108d8753
								
							
						
					
					
						commit
						18d94a7d01
					
				@ -18,10 +18,10 @@ use pac::{saadc, SAADC};
 | 
				
			|||||||
// We treat the positive and negative channels with the same enum values to keep our type tidy and given they are the same
 | 
					// We treat the positive and negative channels with the same enum values to keep our type tidy and given they are the same
 | 
				
			||||||
pub(crate) use saadc::ch::pselp::PSELP_A as InputChannel;
 | 
					pub(crate) use saadc::ch::pselp::PSELP_A as InputChannel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use saadc::{
 | 
					use saadc::{
 | 
				
			||||||
    ch::config::{GAIN_A as Gain, REFSEL_A as Reference, RESP_A as Resistor, TACQ_A as Time},
 | 
					    ch::config::{GAIN_A, REFSEL_A, RESP_A, TACQ_A},
 | 
				
			||||||
    oversample::OVERSAMPLE_A as Oversample,
 | 
					    oversample::OVERSAMPLE_A,
 | 
				
			||||||
    resolution::VAL_A as Resolution,
 | 
					    resolution::VAL_A,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
					#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
				
			||||||
@ -161,8 +161,9 @@ impl<'d, const N: usize> Saadc<'d, N> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Configure channels
 | 
					        // Configure channels
 | 
				
			||||||
        r.enable.write(|w| w.enable().enabled());
 | 
					        r.enable.write(|w| w.enable().enabled());
 | 
				
			||||||
        r.resolution.write(|w| w.val().variant(resolution));
 | 
					        r.resolution.write(|w| w.val().variant(resolution.into()));
 | 
				
			||||||
        r.oversample.write(|w| w.oversample().variant(oversample));
 | 
					        r.oversample
 | 
				
			||||||
 | 
					            .write(|w| w.oversample().variant(oversample.into()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i, cc) in channel_configs.iter().enumerate() {
 | 
					        for (i, cc) in channel_configs.iter().enumerate() {
 | 
				
			||||||
            r.ch[i].pselp.write(|w| w.pselp().variant(cc.p_channel));
 | 
					            r.ch[i].pselp.write(|w| w.pselp().variant(cc.p_channel));
 | 
				
			||||||
@ -172,15 +173,15 @@ impl<'d, const N: usize> Saadc<'d, N> {
 | 
				
			|||||||
                    .write(|w| unsafe { w.pseln().bits(n_channel as u8) });
 | 
					                    .write(|w| unsafe { w.pseln().bits(n_channel as u8) });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            r.ch[i].config.write(|w| {
 | 
					            r.ch[i].config.write(|w| {
 | 
				
			||||||
                w.refsel().variant(cc.reference);
 | 
					                w.refsel().variant(cc.reference.into());
 | 
				
			||||||
                w.gain().variant(cc.gain);
 | 
					                w.gain().variant(cc.gain.into());
 | 
				
			||||||
                w.tacq().variant(cc.time);
 | 
					                w.tacq().variant(cc.time.into());
 | 
				
			||||||
                if cc.n_channel.is_none() {
 | 
					                if cc.n_channel.is_none() {
 | 
				
			||||||
                    w.mode().se();
 | 
					                    w.mode().se();
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    w.mode().diff();
 | 
					                    w.mode().diff();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                w.resp().variant(cc.resistor);
 | 
					                w.resp().variant(cc.resistor.into());
 | 
				
			||||||
                w.resn().bypass();
 | 
					                w.resn().bypass();
 | 
				
			||||||
                if !matches!(oversample, Oversample::BYPASS) {
 | 
					                if !matches!(oversample, Oversample::BYPASS) {
 | 
				
			||||||
                    w.burst().enabled();
 | 
					                    w.burst().enabled();
 | 
				
			||||||
@ -405,6 +406,183 @@ impl<'d, const N: usize> Drop for Saadc<'d, N> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Gain> for GAIN_A {
 | 
				
			||||||
 | 
					    fn from(gain: Gain) -> Self {
 | 
				
			||||||
 | 
					        match gain {
 | 
				
			||||||
 | 
					            Gain::GAIN1_6 => GAIN_A::GAIN1_6,
 | 
				
			||||||
 | 
					            Gain::GAIN1_5 => GAIN_A::GAIN1_5,
 | 
				
			||||||
 | 
					            Gain::GAIN1_4 => GAIN_A::GAIN1_4,
 | 
				
			||||||
 | 
					            Gain::GAIN1_3 => GAIN_A::GAIN1_3,
 | 
				
			||||||
 | 
					            Gain::GAIN1_2 => GAIN_A::GAIN1_2,
 | 
				
			||||||
 | 
					            Gain::GAIN1 => GAIN_A::GAIN1,
 | 
				
			||||||
 | 
					            Gain::GAIN2 => GAIN_A::GAIN2,
 | 
				
			||||||
 | 
					            Gain::GAIN4 => GAIN_A::GAIN4,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Gain control
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Gain {
 | 
				
			||||||
 | 
					    /// 1/6
 | 
				
			||||||
 | 
					    GAIN1_6 = 0,
 | 
				
			||||||
 | 
					    /// 1/5
 | 
				
			||||||
 | 
					    GAIN1_5 = 1,
 | 
				
			||||||
 | 
					    /// 1/4
 | 
				
			||||||
 | 
					    GAIN1_4 = 2,
 | 
				
			||||||
 | 
					    /// 1/3
 | 
				
			||||||
 | 
					    GAIN1_3 = 3,
 | 
				
			||||||
 | 
					    /// 1/2
 | 
				
			||||||
 | 
					    GAIN1_2 = 4,
 | 
				
			||||||
 | 
					    /// 1
 | 
				
			||||||
 | 
					    GAIN1 = 5,
 | 
				
			||||||
 | 
					    /// 2
 | 
				
			||||||
 | 
					    GAIN2 = 6,
 | 
				
			||||||
 | 
					    /// 4
 | 
				
			||||||
 | 
					    GAIN4 = 7,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Reference> for REFSEL_A {
 | 
				
			||||||
 | 
					    fn from(reference: Reference) -> Self {
 | 
				
			||||||
 | 
					        match reference {
 | 
				
			||||||
 | 
					            Reference::INTERNAL => REFSEL_A::INTERNAL,
 | 
				
			||||||
 | 
					            Reference::VDD1_4 => REFSEL_A::VDD1_4,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Reference control
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Reference {
 | 
				
			||||||
 | 
					    /// Internal reference (0.6 V)
 | 
				
			||||||
 | 
					    INTERNAL = 0,
 | 
				
			||||||
 | 
					    /// VDD/4 as reference
 | 
				
			||||||
 | 
					    VDD1_4 = 1,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Resistor> for RESP_A {
 | 
				
			||||||
 | 
					    fn from(resistor: Resistor) -> Self {
 | 
				
			||||||
 | 
					        match resistor {
 | 
				
			||||||
 | 
					            Resistor::BYPASS => RESP_A::BYPASS,
 | 
				
			||||||
 | 
					            Resistor::PULLDOWN => RESP_A::PULLDOWN,
 | 
				
			||||||
 | 
					            Resistor::PULLUP => RESP_A::PULLUP,
 | 
				
			||||||
 | 
					            Resistor::VDD1_2 => RESP_A::VDD1_2,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Positive channel resistor control
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Resistor {
 | 
				
			||||||
 | 
					    /// Bypass resistor ladder
 | 
				
			||||||
 | 
					    BYPASS = 0,
 | 
				
			||||||
 | 
					    /// Pull-down to GND
 | 
				
			||||||
 | 
					    PULLDOWN = 1,
 | 
				
			||||||
 | 
					    /// Pull-up to VDD
 | 
				
			||||||
 | 
					    PULLUP = 2,
 | 
				
			||||||
 | 
					    /// Set input at VDD/2
 | 
				
			||||||
 | 
					    VDD1_2 = 3,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Time> for TACQ_A {
 | 
				
			||||||
 | 
					    fn from(time: Time) -> Self {
 | 
				
			||||||
 | 
					        match time {
 | 
				
			||||||
 | 
					            Time::_3US => TACQ_A::_3US,
 | 
				
			||||||
 | 
					            Time::_5US => TACQ_A::_5US,
 | 
				
			||||||
 | 
					            Time::_10US => TACQ_A::_10US,
 | 
				
			||||||
 | 
					            Time::_15US => TACQ_A::_15US,
 | 
				
			||||||
 | 
					            Time::_20US => TACQ_A::_20US,
 | 
				
			||||||
 | 
					            Time::_40US => TACQ_A::_40US,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Acquisition time, the time the SAADC uses to sample the input voltage
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Time {
 | 
				
			||||||
 | 
					    /// 3 us
 | 
				
			||||||
 | 
					    _3US = 0,
 | 
				
			||||||
 | 
					    ///  5 us
 | 
				
			||||||
 | 
					    _5US = 1,
 | 
				
			||||||
 | 
					    /// 10 us
 | 
				
			||||||
 | 
					    _10US = 2,
 | 
				
			||||||
 | 
					    /// 15 us
 | 
				
			||||||
 | 
					    _15US = 3,
 | 
				
			||||||
 | 
					    /// 20 us
 | 
				
			||||||
 | 
					    _20US = 4,
 | 
				
			||||||
 | 
					    /// 40 us
 | 
				
			||||||
 | 
					    _40US = 5,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Oversample> for OVERSAMPLE_A {
 | 
				
			||||||
 | 
					    fn from(oversample: Oversample) -> Self {
 | 
				
			||||||
 | 
					        match oversample {
 | 
				
			||||||
 | 
					            Oversample::BYPASS => OVERSAMPLE_A::BYPASS,
 | 
				
			||||||
 | 
					            Oversample::OVER2X => OVERSAMPLE_A::OVER2X,
 | 
				
			||||||
 | 
					            Oversample::OVER4X => OVERSAMPLE_A::OVER4X,
 | 
				
			||||||
 | 
					            Oversample::OVER8X => OVERSAMPLE_A::OVER8X,
 | 
				
			||||||
 | 
					            Oversample::OVER16X => OVERSAMPLE_A::OVER16X,
 | 
				
			||||||
 | 
					            Oversample::OVER32X => OVERSAMPLE_A::OVER32X,
 | 
				
			||||||
 | 
					            Oversample::OVER64X => OVERSAMPLE_A::OVER64X,
 | 
				
			||||||
 | 
					            Oversample::OVER128X => OVERSAMPLE_A::OVER128X,
 | 
				
			||||||
 | 
					            Oversample::OVER256X => OVERSAMPLE_A::OVER256X,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Oversample control
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Oversample {
 | 
				
			||||||
 | 
					    /// Bypass oversampling
 | 
				
			||||||
 | 
					    BYPASS = 0,
 | 
				
			||||||
 | 
					    /// Oversample 2x
 | 
				
			||||||
 | 
					    OVER2X = 1,
 | 
				
			||||||
 | 
					    /// Oversample 4x
 | 
				
			||||||
 | 
					    OVER4X = 2,
 | 
				
			||||||
 | 
					    /// Oversample 8x
 | 
				
			||||||
 | 
					    OVER8X = 3,
 | 
				
			||||||
 | 
					    /// Oversample 16x
 | 
				
			||||||
 | 
					    OVER16X = 4,
 | 
				
			||||||
 | 
					    /// Oversample 32x
 | 
				
			||||||
 | 
					    OVER32X = 5,
 | 
				
			||||||
 | 
					    /// Oversample 64x
 | 
				
			||||||
 | 
					    OVER64X = 6,
 | 
				
			||||||
 | 
					    /// Oversample 128x
 | 
				
			||||||
 | 
					    OVER128X = 7,
 | 
				
			||||||
 | 
					    /// Oversample 256x
 | 
				
			||||||
 | 
					    OVER256X = 8,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Resolution> for VAL_A {
 | 
				
			||||||
 | 
					    fn from(resolution: Resolution) -> Self {
 | 
				
			||||||
 | 
					        match resolution {
 | 
				
			||||||
 | 
					            Resolution::_8BIT => VAL_A::_8BIT,
 | 
				
			||||||
 | 
					            Resolution::_10BIT => VAL_A::_10BIT,
 | 
				
			||||||
 | 
					            Resolution::_12BIT => VAL_A::_12BIT,
 | 
				
			||||||
 | 
					            Resolution::_14BIT => VAL_A::_14BIT,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Set the resolution
 | 
				
			||||||
 | 
					#[non_exhaustive]
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub enum Resolution {
 | 
				
			||||||
 | 
					    /// 8 bits
 | 
				
			||||||
 | 
					    _8BIT = 0,
 | 
				
			||||||
 | 
					    /// 10 bits
 | 
				
			||||||
 | 
					    _10BIT = 1,
 | 
				
			||||||
 | 
					    /// 12 bits
 | 
				
			||||||
 | 
					    _12BIT = 2,
 | 
				
			||||||
 | 
					    /// 14 bits
 | 
				
			||||||
 | 
					    _14BIT = 3,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) mod sealed {
 | 
					pub(crate) mod sealed {
 | 
				
			||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user