wip: split by value
This commit is contained in:
		
							parent
							
								
									b8beaba6df
								
							
						
					
					
						commit
						df06c2bbfe
					
				@ -6,6 +6,8 @@
 | 
				
			|||||||
//!
 | 
					//!
 | 
				
			||||||
//! The available functionality depends on the timer type.
 | 
					//! The available functionality depends on the timer type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use core::mem::ManuallyDrop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use embassy_hal_internal::{into_ref, Peripheral, PeripheralRef};
 | 
					use embassy_hal_internal::{into_ref, Peripheral, PeripheralRef};
 | 
				
			||||||
// Re-export useful enums
 | 
					// Re-export useful enums
 | 
				
			||||||
pub use stm32_metapac::timer::vals::{FilterValue, Sms as SlaveMode, Ts as TriggerSource};
 | 
					pub use stm32_metapac::timer::vals::{FilterValue, Sms as SlaveMode, Ts as TriggerSource};
 | 
				
			||||||
@ -198,6 +200,13 @@ impl<'d, T: CoreInstance> Timer<'d, T> {
 | 
				
			|||||||
        Self { tim }
 | 
					        Self { tim }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub(crate) unsafe fn clone_unchecked(&self) -> ManuallyDrop<Self> {
 | 
				
			||||||
 | 
					        // this doesn't work for some reason
 | 
				
			||||||
 | 
					        // let tim = unsafe { self.tim.clone_unchecked() };
 | 
				
			||||||
 | 
					        let tim = todo!();
 | 
				
			||||||
 | 
					        ManuallyDrop::new(Self { tim })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Get access to the virutal core 16bit timer registers.
 | 
					    /// Get access to the virutal core 16bit timer registers.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// Note: This works even if the timer is more capable, because registers
 | 
					    /// Note: This works even if the timer is more capable, because registers
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use core::marker::PhantomData;
 | 
					use core::marker::PhantomData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use embassy_hal_internal::Peripheral;
 | 
				
			||||||
use embassy_sync::waitqueue::AtomicWaker;
 | 
					use embassy_sync::waitqueue::AtomicWaker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(not(stm32l0))]
 | 
					#[cfg(not(stm32l0))]
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
//! Simple PWM driver.
 | 
					//! Simple PWM driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use core::marker::PhantomData;
 | 
					use core::marker::PhantomData;
 | 
				
			||||||
 | 
					use core::mem::ManuallyDrop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use embassy_hal_internal::{into_ref, PeripheralRef};
 | 
					use embassy_hal_internal::{into_ref, PeripheralRef};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -57,7 +58,7 @@ channel_impl!(new_ch4, Ch4, Channel4Pin);
 | 
				
			|||||||
/// It is not possible to change the pwm frequency because
 | 
					/// It is not possible to change the pwm frequency because
 | 
				
			||||||
/// the frequency configuration is shared with all four channels.
 | 
					/// the frequency configuration is shared with all four channels.
 | 
				
			||||||
pub struct SimplePwmChannel<'d, T: GeneralInstance4Channel> {
 | 
					pub struct SimplePwmChannel<'d, T: GeneralInstance4Channel> {
 | 
				
			||||||
    timer: &'d Timer<'d, T>,
 | 
					    timer: ManuallyDrop<Timer<'d, T>>,
 | 
				
			||||||
    channel: Channel,
 | 
					    channel: Channel,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -199,7 +200,7 @@ impl<'d, T: GeneralInstance4Channel> SimplePwm<'d, T> {
 | 
				
			|||||||
    /// If you need to use multiple channels, use [`Self::split`].
 | 
					    /// If you need to use multiple channels, use [`Self::split`].
 | 
				
			||||||
    pub fn channel(&mut self, channel: Channel) -> SimplePwmChannel<'_, T> {
 | 
					    pub fn channel(&mut self, channel: Channel) -> SimplePwmChannel<'_, T> {
 | 
				
			||||||
        SimplePwmChannel {
 | 
					        SimplePwmChannel {
 | 
				
			||||||
            timer: &self.inner,
 | 
					            timer: unsafe { self.inner.clone_unchecked() },
 | 
				
			||||||
            channel,
 | 
					            channel,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -245,12 +246,16 @@ impl<'d, T: GeneralInstance4Channel> SimplePwm<'d, T> {
 | 
				
			|||||||
    /// This returns all four channels, including channels that
 | 
					    /// This returns all four channels, including channels that
 | 
				
			||||||
    /// aren't configured with a [`PwmPin`].
 | 
					    /// aren't configured with a [`PwmPin`].
 | 
				
			||||||
    // TODO: I hate the name "split"
 | 
					    // TODO: I hate the name "split"
 | 
				
			||||||
    pub fn split(&mut self) -> SimplePwmChannels<'_, T> {
 | 
					    pub fn split(self) -> SimplePwmChannels<'static, T>
 | 
				
			||||||
        // TODO: pre-enable channels?
 | 
					    where
 | 
				
			||||||
 | 
					        // must be static because the timer will never be dropped/disabled
 | 
				
			||||||
 | 
					        'd: 'static,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // without this, the timer would be disabled at the end of this function
 | 
				
			||||||
 | 
					        let timer = ManuallyDrop::new(self.inner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // we can't use self.channel() because that takes &mut self
 | 
					 | 
				
			||||||
        let ch = |channel| SimplePwmChannel {
 | 
					        let ch = |channel| SimplePwmChannel {
 | 
				
			||||||
            timer: &self.inner,
 | 
					            timer: unsafe { timer.clone_unchecked() },
 | 
				
			||||||
            channel,
 | 
					            channel,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user