seperate start from pwmseq::new
This commit is contained in:
parent
49253152cf
commit
4647792ad6
@ -59,9 +59,9 @@ pub struct PwmSeq<'d, T: Instance> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> PwmSeq<'d, T> {
|
impl<'d, T: Instance> PwmSeq<'d, T> {
|
||||||
/// Creates the interface to a PWM instance.
|
/// Creates the interface to a PWM Sequence interface.
|
||||||
///
|
///
|
||||||
/// Defaults the freq to 1Mhz, max_duty 32767, duty 0, and channels low.
|
/// Must be started by calling `start`
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
///
|
///
|
||||||
@ -82,9 +82,6 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||||||
if config.sequence.len() > 32767 {
|
if config.sequence.len() > 32767 {
|
||||||
return Err(Error::SequenceTooLong);
|
return Err(Error::SequenceTooLong);
|
||||||
}
|
}
|
||||||
if let SequenceMode::Times(0) = config.times {
|
|
||||||
return Err(Error::SequenceTooShort);
|
|
||||||
}
|
|
||||||
|
|
||||||
unborrow!(ch0, ch1, ch2, ch3);
|
unborrow!(ch0, ch1, ch2, ch3);
|
||||||
|
|
||||||
@ -155,7 +152,27 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||||||
.enddelay
|
.enddelay
|
||||||
.write(|w| unsafe { w.bits(config.end_delay) });
|
.write(|w| unsafe { w.bits(config.end_delay) });
|
||||||
|
|
||||||
match config.times {
|
Ok(Self {
|
||||||
|
phantom: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Start or restart playback
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn start(&self, times: SequenceMode) -> Result<(), Error> {
|
||||||
|
if let SequenceMode::Times(0) = times {
|
||||||
|
return Err(Error::SequenceNoZero);
|
||||||
|
}
|
||||||
|
let r = T::regs();
|
||||||
|
|
||||||
|
r.shorts.reset();
|
||||||
|
|
||||||
|
// tasks_stop doesnt exist in all svds so write its bit instead
|
||||||
|
r.tasks_stop.write(|w| unsafe { w.bits(0x01) });
|
||||||
|
|
||||||
|
r.enable.write(|w| w.enable().enabled());
|
||||||
|
|
||||||
|
match times {
|
||||||
// just the one time, no loop count
|
// just the one time, no loop count
|
||||||
SequenceMode::Times(1) => {
|
SequenceMode::Times(1) => {
|
||||||
r.loop_.write(|w| w.cnt().disabled());
|
r.loop_.write(|w| w.cnt().disabled());
|
||||||
@ -189,9 +206,7 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Self {
|
Ok(())
|
||||||
phantom: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop playback
|
/// Stop playback
|
||||||
@ -248,8 +263,6 @@ pub struct SequenceConfig<'a> {
|
|||||||
pub refresh: u32,
|
pub refresh: u32,
|
||||||
/// Number of Times PWM periods after the sequence ends before starting the next sequence
|
/// Number of Times PWM periods after the sequence ends before starting the next sequence
|
||||||
pub end_delay: u32,
|
pub end_delay: u32,
|
||||||
/// How many times to play the sequence
|
|
||||||
pub times: SequenceMode,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
@ -259,7 +272,7 @@ pub enum Error {
|
|||||||
/// Max Sequence size is 32767
|
/// Max Sequence size is 32767
|
||||||
SequenceTooLong,
|
SequenceTooLong,
|
||||||
/// Min Sequence size is 1
|
/// Min Sequence size is 1
|
||||||
SequenceTooShort,
|
SequenceNoZero,
|
||||||
/// EasyDMA can only read from data memory, read only buffers in flash will fail.
|
/// EasyDMA can only read from data memory, read only buffers in flash will fail.
|
||||||
DMABufferNotInDataMemory,
|
DMABufferNotInDataMemory,
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,12 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
|||||||
sequence_load: SequenceLoad::Individual,
|
sequence_load: SequenceLoad::Individual,
|
||||||
refresh: 0,
|
refresh: 0,
|
||||||
end_delay: 0,
|
end_delay: 0,
|
||||||
times: SequenceMode::Times(5),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let _pwm = unwrap!(PwmSeq::new(
|
let pwm = unwrap!(PwmSeq::new(
|
||||||
p.PWM0, p.P0_13, p.P0_15, p.P0_16, p.P0_14, config
|
p.PWM0, p.P0_13, p.P0_15, p.P0_16, p.P0_14, config
|
||||||
));
|
));
|
||||||
|
unwrap!(pwm.start(SequenceMode::Times(5)));
|
||||||
info!("pwm started!");
|
info!("pwm started!");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -30,10 +30,10 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
|||||||
sequence_load: SequenceLoad::Common,
|
sequence_load: SequenceLoad::Common,
|
||||||
refresh: 0,
|
refresh: 0,
|
||||||
end_delay: 0,
|
end_delay: 0,
|
||||||
times: SequenceMode::Infinite,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let pwm = unwrap!(PwmSeq::new(p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config));
|
let pwm = unwrap!(PwmSeq::new(p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config));
|
||||||
|
unwrap!(pwm.start(SequenceMode::Infinite));
|
||||||
info!("pwm started!");
|
info!("pwm started!");
|
||||||
|
|
||||||
Timer::after(Duration::from_millis(20000)).await;
|
Timer::after(Duration::from_millis(20000)).await;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user