STM32 opamp: use impl Peripheral instead of directly taking pins

This commit is contained in:
Adam Greig 2023-11-20 21:35:05 +00:00
parent 2386619f1f
commit d1af696605
No known key found for this signature in database
GPG Key ID: 8B3FE5477B1DD9A0
2 changed files with 21 additions and 27 deletions

View File

@ -31,12 +31,9 @@ impl From<OpAmpSpeed> for crate::pac::opamp::vals::OpampCsrOpahsm {
/// OpAmp external outputs, wired to a GPIO pad. /// OpAmp external outputs, wired to a GPIO pad.
/// ///
/// The GPIO output pad is held by this struct to ensure it cannot be used elsewhere.
///
/// This struct can also be used as an ADC input. /// This struct can also be used as an ADC input.
pub struct OpAmpOutput<'d, 'p, T: Instance, P: OutputPin<T>> { pub struct OpAmpOutput<'d, T: Instance> {
_inner: &'d OpAmp<'d, T>, _inner: &'d OpAmp<'d, T>,
_output: &'p mut P,
} }
/// OpAmp internal outputs, wired directly to ADC inputs. /// OpAmp internal outputs, wired directly to ADC inputs.
@ -76,16 +73,14 @@ impl<'d, T: Instance> OpAmp<'d, T> {
/// preventing it being used elsewhere. The `OpAmpOutput` can then be /// preventing it being used elsewhere. The `OpAmpOutput` can then be
/// directly used as an ADC input. The opamp will be disabled when the /// directly used as an ADC input. The opamp will be disabled when the
/// [`OpAmpOutput`] is dropped. /// [`OpAmpOutput`] is dropped.
pub fn buffer_ext<'a, 'b, IP, OP>( pub fn buffer_ext(
&'a mut self, &'d mut self,
in_pin: &IP, in_pin: impl Peripheral<P = impl NonInvertingPin<T> + crate::gpio::sealed::Pin>,
out_pin: &'b mut OP, out_pin: impl Peripheral<P = impl OutputPin<T> + crate::gpio::sealed::Pin> + 'd,
gain: OpAmpGain, gain: OpAmpGain,
) -> OpAmpOutput<'a, 'b, T, OP> ) -> OpAmpOutput<'d, T> {
where into_ref!(in_pin);
IP: NonInvertingPin<T> + crate::gpio::sealed::Pin, into_ref!(out_pin);
OP: OutputPin<T> + crate::gpio::sealed::Pin,
{
in_pin.set_as_analog(); in_pin.set_as_analog();
out_pin.set_as_analog(); out_pin.set_as_analog();
@ -116,10 +111,7 @@ impl<'d, T: Instance> OpAmp<'d, T> {
w.set_opaen(true); w.set_opaen(true);
}); });
OpAmpOutput { OpAmpOutput { _inner: self }
_inner: self,
_output: out_pin,
}
} }
/// Configure the OpAmp as a buffer for the provided input pin, /// Configure the OpAmp as a buffer for the provided input pin,
@ -131,10 +123,12 @@ impl<'d, T: Instance> OpAmp<'d, T> {
/// The returned `OpAmpInternalOutput` struct may be used as an ADC input. /// The returned `OpAmpInternalOutput` struct may be used as an ADC input.
/// The opamp output will be disabled when it is dropped. /// The opamp output will be disabled when it is dropped.
#[cfg(opamp_g4)] #[cfg(opamp_g4)]
pub fn buffer_int<'a, P>(&'a mut self, pin: &P, gain: OpAmpGain) -> OpAmpInternalOutput<'a, T> pub fn buffer_int(
where &'d mut self,
P: NonInvertingPin<T> + crate::gpio::sealed::Pin, pin: impl Peripheral<P = impl NonInvertingPin<T> + crate::gpio::sealed::Pin>,
{ gain: OpAmpGain,
) -> OpAmpInternalOutput<'d, T> {
into_ref!(pin);
pin.set_as_analog(); pin.set_as_analog();
let (vm_sel, pga_gain) = match gain { let (vm_sel, pga_gain) = match gain {
@ -158,7 +152,7 @@ impl<'d, T: Instance> OpAmp<'d, T> {
} }
} }
impl<'d, 'p, T: Instance, P: OutputPin<T>> Drop for OpAmpOutput<'d, 'p, T, P> { impl<'d, T: Instance> Drop for OpAmpOutput<'d, T> {
fn drop(&mut self) { fn drop(&mut self) {
#[cfg(opamp_f3)] #[cfg(opamp_f3)]
T::regs().opampcsr().modify(|w| { T::regs().opampcsr().modify(|w| {
@ -212,16 +206,16 @@ macro_rules! impl_opamp_external_output {
($inst:ident, $adc:ident, $ch:expr) => { ($inst:ident, $adc:ident, $ch:expr) => {
foreach_adc!( foreach_adc!(
($adc, $common_inst:ident, $adc_clock:ident) => { ($adc, $common_inst:ident, $adc_clock:ident) => {
impl<'d, 'p, P: OutputPin<crate::peripherals::$inst>> crate::adc::sealed::AdcPin<crate::peripherals::$adc> impl<'d> crate::adc::sealed::AdcPin<crate::peripherals::$adc>
for OpAmpOutput<'d, 'p, crate::peripherals::$inst, P> for OpAmpOutput<'d, crate::peripherals::$inst>
{ {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
$ch $ch
} }
} }
impl<'d, 'p, P: OutputPin<crate::peripherals::$inst>> crate::adc::AdcPin<crate::peripherals::$adc> impl<'d> crate::adc::AdcPin<crate::peripherals::$adc>
for OpAmpOutput<'d, 'p, crate::peripherals::$inst, P> for OpAmpOutput<'d, crate::peripherals::$inst>
{ {
} }
}; };

View File

@ -39,7 +39,7 @@ async fn main(_spawner: Spawner) -> ! {
let mut vrefint = adc.enable_vref(&mut Delay); let mut vrefint = adc.enable_vref(&mut Delay);
let mut temperature = adc.enable_temperature(); let mut temperature = adc.enable_temperature();
let mut buffer = opamp.buffer_ext(&p.PA7, &mut p.PA6, OpAmpGain::Mul1); let mut buffer = opamp.buffer_ext(&mut p.PA7, &mut p.PA6, OpAmpGain::Mul1);
loop { loop {
let vref = adc.read(&mut vrefint).await; let vref = adc.read(&mut vrefint).await;