diff --git a/src/adc.rs b/src/adc.rs index 98366bf..f4dadcb 100755 --- a/src/adc.rs +++ b/src/adc.rs @@ -123,6 +123,23 @@ impl Adc { self.precision = precision; } + /// Trigger internal ADC calibration + /// + /// This process is documented in Reference Manual RM377, section 13.3.3 + /// Calibration (ADCAL) + pub fn calibrate(&mut self) -> Result<(), Error> { + if self._state != Ready + || self.rb.cr.read().aden().bit_is_set() + || self.rb.cfgr1.read().dmaen().bit_is_set() + { + return Err(Error::InvalidAdcState); + } + + self.rb.cr.modify(|_, w| w.adcal().set_bit()); + while self.rb.cr.read().adcal().bit_is_set() {} + Ok(()) + } + /// Starts a continuous conversion process /// /// The `channel` argument specifies which channel should be converted. @@ -321,6 +338,7 @@ where } /// Indicates that the ADC peripheral is ready +#[derive(PartialEq)] pub struct Ready; /// Indicates that the ADC peripheral is performing conversions @@ -615,6 +633,9 @@ pub enum Error { /// just keeps writing more values. It does mean that some values in the /// buffer were overwritten though. BufferOverrun, + + /// Invalid ADC state for requested operation + InvalidAdcState, } macro_rules! int_adc {