seperate start from pwmseq::new
This commit is contained in:
parent
49253152cf
commit
4647792ad6
3 changed files with 28 additions and 15 deletions
|
@ -59,9 +59,9 @@ pub struct PwmSeq<'d, T: Instance> {
|
|||
}
|
||||
|
||||
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
|
||||
///
|
||||
|
@ -82,9 +82,6 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||
if config.sequence.len() > 32767 {
|
||||
return Err(Error::SequenceTooLong);
|
||||
}
|
||||
if let SequenceMode::Times(0) = config.times {
|
||||
return Err(Error::SequenceTooShort);
|
||||
}
|
||||
|
||||
unborrow!(ch0, ch1, ch2, ch3);
|
||||
|
||||
|
@ -155,7 +152,27 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||
.enddelay
|
||||
.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
|
||||
SequenceMode::Times(1) => {
|
||||
r.loop_.write(|w| w.cnt().disabled());
|
||||
|
@ -189,9 +206,7 @@ impl<'d, T: Instance> PwmSeq<'d, T> {
|
|||
}
|
||||
}
|
||||
|
||||
Ok(Self {
|
||||
phantom: PhantomData,
|
||||
})
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Stop playback
|
||||
|
@ -248,8 +263,6 @@ pub struct SequenceConfig<'a> {
|
|||
pub refresh: u32,
|
||||
/// Number of Times PWM periods after the sequence ends before starting the next sequence
|
||||
pub end_delay: u32,
|
||||
/// How many times to play the sequence
|
||||
pub times: SequenceMode,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
|
@ -259,7 +272,7 @@ pub enum Error {
|
|||
/// Max Sequence size is 32767
|
||||
SequenceTooLong,
|
||||
/// Min Sequence size is 1
|
||||
SequenceTooShort,
|
||||
SequenceNoZero,
|
||||
/// EasyDMA can only read from data memory, read only buffers in flash will fail.
|
||||
DMABufferNotInDataMemory,
|
||||
}
|
||||
|
|
|
@ -26,12 +26,12 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
|||
sequence_load: SequenceLoad::Individual,
|
||||
refresh: 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
|
||||
));
|
||||
unwrap!(pwm.start(SequenceMode::Times(5)));
|
||||
info!("pwm started!");
|
||||
|
||||
loop {
|
||||
|
|
|
@ -30,10 +30,10 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
|||
sequence_load: SequenceLoad::Common,
|
||||
refresh: 0,
|
||||
end_delay: 0,
|
||||
times: SequenceMode::Infinite,
|
||||
};
|
||||
|
||||
let pwm = unwrap!(PwmSeq::new(p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config));
|
||||
unwrap!(pwm.start(SequenceMode::Infinite));
|
||||
info!("pwm started!");
|
||||
|
||||
Timer::after(Duration::from_millis(20000)).await;
|
||||
|
|
Loading…
Reference in a new issue