diff options
| author | Adam Greig <[email protected]> | 2023-11-19 04:29:29 +0000 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-11-25 00:29:45 +0100 |
| commit | 135f3500208cae05293fe588763edde99ed409be (patch) | |
| tree | f9423adae63b8edc3a63aa401cd9db2c496c3206 /embassy-stm32 | |
| parent | 897663e023fa0e7fc84b6023a4f190af28b57295 (diff) | |
STM32 DAC: Use new Mode enum for setting channel mode
Diffstat (limited to 'embassy-stm32')
| -rw-r--r-- | embassy-stm32/src/dac/mod.rs | 65 |
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 | ||
| 6 | use embassy_hal_internal::{into_ref, PeripheralRef}; | 6 | use embassy_hal_internal::{into_ref, PeripheralRef}; |
| 7 | 7 | ||
| 8 | #[cfg(any(dac_v3, dac_v4, dac_v5, dac_v6, dac_v7))] | ||
| 8 | use crate::pac::dac; | 9 | use crate::pac::dac; |
| 9 | use crate::rcc::RccPeripheral; | 10 | use crate::rcc::RccPeripheral; |
| 10 | use crate::{peripherals, Peripheral}; | 11 | use 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))] | ||
| 16 | pub 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))] | ||
| 39 | impl 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 | ||
