aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Greig <[email protected]>2023-11-19 04:29:29 +0000
committerDario Nieuwenhuis <[email protected]>2023-11-25 00:29:45 +0100
commit135f3500208cae05293fe588763edde99ed409be (patch)
treef9423adae63b8edc3a63aa401cd9db2c496c3206
parent897663e023fa0e7fc84b6023a4f190af28b57295 (diff)
STM32 DAC: Use new Mode enum for setting channel mode
-rw-r--r--embassy-stm32/src/dac/mod.rs65
1 files changed, 54 insertions, 11 deletions
diff --git a/embassy-stm32/src/dac/mod.rs b/embassy-stm32/src/dac/mod.rs
index 3d1a820ed..b87d6e490 100644
--- a/embassy-stm32/src/dac/mod.rs
+++ b/embassy-stm32/src/dac/mod.rs
@@ -5,10 +5,53 @@ use core::marker::PhantomData;
5 5
6use embassy_hal_internal::{into_ref, PeripheralRef}; 6use embassy_hal_internal::{into_ref, PeripheralRef};
7 7
8#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
8use crate::pac::dac; 9use crate::pac::dac;
9use crate::rcc::RccPeripheral; 10use crate::rcc::RccPeripheral;
10use crate::{peripherals, Peripheral}; 11use crate::{peripherals, Peripheral};
11 12
13#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
14#[derive(Debug, Copy, Clone, Eq, PartialEq)]
15#[cfg_attr(feature = "defmt", derive(defmt::Format))]
16pub enum Mode {
17 /// Normal mode, channel is connected to external pin with buffer enabled.
18 NormalExternalBuffered,
19 /// Normal mode, channel is connected to external pin and internal peripherals
20 /// with buffer enabled.
21 NormalBothBuffered,
22 /// Normal mode, channel is connected to external pin with buffer disabled.
23 NormalExternalUnbuffered,
24 /// Normal mode, channel is connected to internal peripherals with buffer disabled.
25 NormalInternalUnbuffered,
26 /// Sample-and-hold mode, channel is connected to external pin with buffer enabled.
27 SampleHoldExternalBuffered,
28 /// Sample-and-hold mode, channel is connected to external pin and internal peripherals
29 /// with buffer enabled.
30 SampleHoldBothBuffered,
31 /// Sample-and-hold mode, channel is connected to external pin and internal peripherals
32 /// with buffer disabled.
33 SampleHoldBothUnbuffered,
34 /// Sample-and-hold mode, channel is connected to internal peripherals with buffer disabled.
35 SampleHoldInternalUnbuffered,
36}
37
38#[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
39impl Mode {
40 fn mode(&self) -> dac::vals::Mode {
41 match self {
42 Mode::NormalExternalBuffered => dac::vals::Mode::NORMAL_EXT_BUFEN,
43 Mode::NormalBothBuffered => dac::vals::Mode::NORMAL_EXT_INT_BUFEN,
44 Mode::NormalExternalUnbuffered => dac::vals::Mode::NORMAL_EXT_BUFDIS,
45 Mode::NormalInternalUnbuffered => dac::vals::Mode::NORMAL_INT_BUFDIS,
46 Mode::SampleHoldExternalBuffered => dac::vals::Mode::SAMPHOLD_EXT_BUFEN,
47 Mode::SampleHoldBothBuffered => dac::vals::Mode::SAMPHOLD_EXT_INT_BUFEN,
48 Mode::SampleHoldBothUnbuffered => dac::vals::Mode::SAMPHOLD_EXT_INT_BUFDIS,
49 Mode::SampleHoldInternalUnbuffered => dac::vals::Mode::SAMPHOLD_INT_BUFDIS,
50 }
51 }
52}
53
54
12#[derive(Debug, Copy, Clone, Eq, PartialEq)] 55#[derive(Debug, Copy, Clone, Eq, PartialEq)]
13#[cfg_attr(feature = "defmt", derive(defmt::Format))] 56#[cfg_attr(feature = "defmt", derive(defmt::Format))]
14/// Custom Errors 57/// Custom Errors
@@ -164,10 +207,10 @@ pub trait DacChannel<T: Instance, Tx> {
164 } 207 }
165 208
166 /// Set mode register of the given channel 209 /// Set mode register of the given channel
167 #[cfg(any(dac_v2, dac_v3))] 210 #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
168 fn set_channel_mode(&mut self, val: u8) -> Result<(), Error> { 211 fn set_channel_mode(&mut self, mode: Mode) -> Result<(), Error> {
169 T::regs().mcr().modify(|reg| { 212 T::regs().mcr().modify(|reg| {
170 reg.set_mode(Self::CHANNEL.index(), val); 213 reg.set_mode(Self::CHANNEL.index(), mode.mode());
171 }); 214 });
172 Ok(()) 215 Ok(())
173 } 216 }
@@ -261,8 +304,8 @@ impl<'d, T: Instance, Tx> DacCh1<'d, T, Tx> {
261 304
262 // Configure each activated channel. All results can be `unwrap`ed since they 305 // Configure each activated channel. All results can be `unwrap`ed since they
263 // will only error if the channel is not configured (i.e. ch1, ch2 are false) 306 // will only error if the channel is not configured (i.e. ch1, ch2 are false)
264 #[cfg(any(dac_v2, dac_v3))] 307 #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
265 dac.set_channel_mode(0).unwrap(); 308 dac.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
266 dac.enable_channel().unwrap(); 309 dac.enable_channel().unwrap();
267 dac.set_trigger_enable(true).unwrap(); 310 dac.set_trigger_enable(true).unwrap();
268 311
@@ -374,8 +417,8 @@ impl<'d, T: Instance, Tx> DacCh2<'d, T, Tx> {
374 417
375 // Configure each activated channel. All results can be `unwrap`ed since they 418 // Configure each activated channel. All results can be `unwrap`ed since they
376 // will only error if the channel is not configured (i.e. ch1, ch2 are false) 419 // will only error if the channel is not configured (i.e. ch1, ch2 are false)
377 #[cfg(any(dac_v2, dac_v3))] 420 #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
378 dac.set_channel_mode(0).unwrap(); 421 dac.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
379 dac.enable_channel().unwrap(); 422 dac.enable_channel().unwrap();
380 dac.set_trigger_enable(true).unwrap(); 423 dac.set_trigger_enable(true).unwrap();
381 424
@@ -495,13 +538,13 @@ impl<'d, T: Instance, TxCh1, TxCh2> Dac<'d, T, TxCh1, TxCh2> {
495 538
496 // Configure each activated channel. All results can be `unwrap`ed since they 539 // Configure each activated channel. All results can be `unwrap`ed since they
497 // will only error if the channel is not configured (i.e. ch1, ch2 are false) 540 // will only error if the channel is not configured (i.e. ch1, ch2 are false)
498 #[cfg(any(dac_v2, dac_v3))] 541 #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v73))]
499 dac_ch1.set_channel_mode(0).unwrap(); 542 dac_ch1.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
500 dac_ch1.enable_channel().unwrap(); 543 dac_ch1.enable_channel().unwrap();
501 dac_ch1.set_trigger_enable(true).unwrap(); 544 dac_ch1.set_trigger_enable(true).unwrap();
502 545
503 #[cfg(any(dac_v2, dac_v3))] 546 #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))]
504 dac_ch2.set_channel_mode(0).unwrap(); 547 dac_ch2.set_channel_mode(Mode::NormalExternalBuffered).unwrap();
505 dac_ch2.enable_channel().unwrap(); 548 dac_ch2.enable_channel().unwrap();
506 dac_ch2.set_trigger_enable(true).unwrap(); 549 dac_ch2.set_trigger_enable(true).unwrap();
507 550