From ec66fcd01a9dd4e7a9d7b2e6c7dfcf92f9c9901d Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Thu, 11 Nov 2021 19:14:07 -0700 Subject: [PATCH] pwm_sequence consume buffer --- embassy-nrf/src/pwm.rs | 18 ++++++++---------- examples/nrf/src/bin/pwm_sequence.rs | 8 +------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/embassy-nrf/src/pwm.rs b/embassy-nrf/src/pwm.rs index 08e9add0..64262067 100644 --- a/embassy-nrf/src/pwm.rs +++ b/embassy-nrf/src/pwm.rs @@ -24,7 +24,7 @@ pub struct SimplePwm<'d, T: Instance> { /// SequencePwm allows you to offload the updating of a sequence of duty cycles /// to up to four channels, as well as repeat that sequence n times. -pub struct SequencePwm<'d, T: Instance> { +pub struct SequencePwm<'d, T: Instance, const N: usize> { phantom: PhantomData<&'d mut T>, ch0: Option, ch1: Option, @@ -44,7 +44,7 @@ pub enum Error { DMABufferNotInDataMemory, } -impl<'d, T: Instance> SequencePwm<'d, T> { +impl<'d, T: Instance, const N: usize> SequencePwm<'d, T, N> { /// Creates the interface to a `SequencePwm`. /// /// Must be started by calling `start` @@ -55,18 +55,18 @@ impl<'d, T: Instance> SequencePwm<'d, T> { /// mechanisms) on stack allocated buffers which which have been passed to /// [`new()`](SequencePwm::new). #[allow(unused_unsafe)] - pub fn new<'a>( + pub fn new( _pwm: impl Unborrow + 'd, ch0: impl Unborrow + 'd, ch1: impl Unborrow + 'd, ch2: impl Unborrow + 'd, ch3: impl Unborrow + 'd, config: SequenceConfig, - sequence: &'a [u16], + sequence: [u16; N], ) -> Result { - slice_in_ram_or(sequence, Error::DMABufferNotInDataMemory)?; + slice_in_ram_or(&sequence, Error::DMABufferNotInDataMemory)?; - if sequence.len() > 32767 { + if N > 32767 { return Err(Error::SequenceTooLong); } @@ -108,9 +108,7 @@ impl<'d, T: Instance> SequencePwm<'d, T> { r.seq0 .ptr .write(|w| unsafe { w.bits(sequence.as_ptr() as u32) }); - r.seq0 - .cnt - .write(|w| unsafe { w.bits(sequence.len() as u32) }); + r.seq0.cnt.write(|w| unsafe { w.bits(N as u32) }); r.seq0.refresh.write(|w| unsafe { w.bits(config.refresh) }); r.seq0 .enddelay @@ -224,7 +222,7 @@ impl<'d, T: Instance> SequencePwm<'d, T> { } } -impl<'a, T: Instance> Drop for SequencePwm<'a, T> { +impl<'a, T: Instance, const N: usize> Drop for SequencePwm<'a, T, N> { fn drop(&mut self) { let r = T::regs(); diff --git a/examples/nrf/src/bin/pwm_sequence.rs b/examples/nrf/src/bin/pwm_sequence.rs index d02b0c9c..2b8a3a7d 100644 --- a/examples/nrf/src/bin/pwm_sequence.rs +++ b/examples/nrf/src/bin/pwm_sequence.rs @@ -98,13 +98,7 @@ async fn main(_spawner: Spawner, p: Peripherals) { config.refresh = 3; let pwm = unwrap!(SequencePwm::new( - p.PWM0, - p.P0_13, - NoPin, - NoPin, - NoPin, - config, - &seq_values + p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config, seq_values )); let _ = pwm.start(SequenceMode::Infinite); info!("pwm started!");