STM32 DAC: Use new Mode enum for setting channel mode
This commit is contained in:
parent
897663e023
commit
135f350020
@ -5,10 +5,53 @@ use core::marker::PhantomData;
|
|||||||
|
|
||||||
use embassy_hal_internal::{into_ref, PeripheralRef};
|
use embassy_hal_internal::{into_ref, PeripheralRef};
|
||||||
|
|
||||||
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
use crate::pac::dac;
|
use crate::pac::dac;
|
||||||
use crate::rcc::RccPeripheral;
|
use crate::rcc::RccPeripheral;
|
||||||
use crate::{peripherals, Peripheral};
|
use crate::{peripherals, Peripheral};
|
||||||
|
|
||||||
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
|
pub enum Mode {
|
||||||
|
/// Normal mode, channel is connected to external pin with buffer enabled.
|
||||||
|
NormalExternalBuffered,
|
||||||
|
/// Normal mode, channel is connected to external pin and internal peripherals
|
||||||
|
/// with buffer enabled.
|
||||||
|
NormalBothBuffered,
|
||||||
|
/// Normal mode, channel is connected to external pin with buffer disabled.
|
||||||
|
NormalExternalUnbuffered,
|
||||||
|
/// Normal mode, channel is connected to internal peripherals with buffer disabled.
|
||||||
|
NormalInternalUnbuffered,
|
||||||
|
/// Sample-and-hold mode, channel is connected to external pin with buffer enabled.
|
||||||
|
SampleHoldExternalBuffered,
|
||||||
|
/// Sample-and-hold mode, channel is connected to external pin and internal peripherals
|
||||||
|
/// with buffer enabled.
|
||||||
|
SampleHoldBothBuffered,
|
||||||
|
/// Sample-and-hold mode, channel is connected to external pin and internal peripherals
|
||||||
|
/// with buffer disabled.
|
||||||
|
SampleHoldBothUnbuffered,
|
||||||
|
/// Sample-and-hold mode, channel is connected to internal peripherals with buffer disabled.
|
||||||
|
SampleHoldInternalUnbuffered,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
|
impl Mode {
|
||||||
|
fn mode(&self) -> dac::vals::Mode {
|
||||||
|
match self {
|
||||||
|
Mode::NormalExternalBuffered => dac::vals::Mode::NORMAL_EXT_BUFEN,
|
||||||
|
Mode::NormalBothBuffered => dac::vals::Mode::NORMAL_EXT_INT_BUFEN,
|
||||||
|
Mode::NormalExternalUnbuffered => dac::vals::Mode::NORMAL_EXT_BUFDIS,
|
||||||
|
Mode::NormalInternalUnbuffered => dac::vals::Mode::NORMAL_INT_BUFDIS,
|
||||||
|
Mode::SampleHoldExternalBuffered => dac::vals::Mode::SAMPHOLD_EXT_BUFEN,
|
||||||
|
Mode::SampleHoldBothBuffered => dac::vals::Mode::SAMPHOLD_EXT_INT_BUFEN,
|
||||||
|
Mode::SampleHoldBothUnbuffered => dac::vals::Mode::SAMPHOLD_EXT_INT_BUFDIS,
|
||||||
|
Mode::SampleHoldInternalUnbuffered => dac::vals::Mode::SAMPHOLD_INT_BUFDIS,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
/// Custom Errors
|
/// Custom Errors
|
||||||
@ -164,10 +207,10 @@ pub trait DacChannel<T: Instance, Tx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set mode register of the given channel
|
/// Set mode register of the given channel
|
||||||
#[cfg(any(dac_v2, dac_v3))]
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
fn set_channel_mode(&mut self, val: u8) -> Result<(), Error> {
|
fn set_channel_mode(&mut self, mode: Mode) -> Result<(), Error> {
|
||||||
T::regs().mcr().modify(|reg| {
|
T::regs().mcr().modify(|reg| {
|
||||||
reg.set_mode(Self::CHANNEL.index(), val);
|
reg.set_mode(Self::CHANNEL.index(), mode.mode());
|
||||||
});
|
});
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -261,8 +304,8 @@ impl<'d, T: Instance, Tx> DacCh1<'d, T, Tx> {
|
|||||||
|
|
||||||
// Configure each activated channel. All results can be `unwrap`ed since they
|
// Configure each activated channel. All results can be `unwrap`ed since they
|
||||||
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
||||||
#[cfg(any(dac_v2, dac_v3))]
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
dac.set_channel_mode(0).unwrap();
|
dac.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
|
||||||
dac.enable_channel().unwrap();
|
dac.enable_channel().unwrap();
|
||||||
dac.set_trigger_enable(true).unwrap();
|
dac.set_trigger_enable(true).unwrap();
|
||||||
|
|
||||||
@ -374,8 +417,8 @@ impl<'d, T: Instance, Tx> DacCh2<'d, T, Tx> {
|
|||||||
|
|
||||||
// Configure each activated channel. All results can be `unwrap`ed since they
|
// Configure each activated channel. All results can be `unwrap`ed since they
|
||||||
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
||||||
#[cfg(any(dac_v2, dac_v3))]
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
dac.set_channel_mode(0).unwrap();
|
dac.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
|
||||||
dac.enable_channel().unwrap();
|
dac.enable_channel().unwrap();
|
||||||
dac.set_trigger_enable(true).unwrap();
|
dac.set_trigger_enable(true).unwrap();
|
||||||
|
|
||||||
@ -495,13 +538,13 @@ impl<'d, T: Instance, TxCh1, TxCh2> Dac<'d, T, TxCh1, TxCh2> {
|
|||||||
|
|
||||||
// Configure each activated channel. All results can be `unwrap`ed since they
|
// Configure each activated channel. All results can be `unwrap`ed since they
|
||||||
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
// will only error if the channel is not configured (i.e. ch1, ch2 are false)
|
||||||
#[cfg(any(dac_v2, dac_v3))]
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v73))]
|
||||||
dac_ch1.set_channel_mode(0).unwrap();
|
dac_ch1.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
|
||||||
dac_ch1.enable_channel().unwrap();
|
dac_ch1.enable_channel().unwrap();
|
||||||
dac_ch1.set_trigger_enable(true).unwrap();
|
dac_ch1.set_trigger_enable(true).unwrap();
|
||||||
|
|
||||||
#[cfg(any(dac_v2, dac_v3))]
|
#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
|
||||||
dac_ch2.set_channel_mode(0).unwrap();
|
dac_ch2.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
|
||||||
dac_ch2.enable_channel().unwrap();
|
dac_ch2.enable_channel().unwrap();
|
||||||
dac_ch2.set_trigger_enable(true).unwrap();
|
dac_ch2.set_trigger_enable(true).unwrap();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user