restore original public API of timer, but keep new PAC
This commit is contained in:
		
							parent
							
								
									b3cdf3a040
								
							
						
					
					
						commit
						6c690ab259
					
				| @ -1,7 +1,6 @@ | |||||||
| //! PWM driver with complementary output support.
 | //! PWM driver with complementary output support.
 | ||||||
| 
 | 
 | ||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
| use core::ops::{Deref, DerefMut}; |  | ||||||
| 
 | 
 | ||||||
| use embassy_hal_internal::{into_ref, PeripheralRef}; | use embassy_hal_internal::{into_ref, PeripheralRef}; | ||||||
| use stm32_metapac::timer::vals::Ckd; | use stm32_metapac::timer::vals::Ckd; | ||||||
| @ -24,7 +23,7 @@ pub struct ComplementaryPwmPin<'d, T, C> { | |||||||
| 
 | 
 | ||||||
| macro_rules! complementary_channel_impl { | macro_rules! complementary_channel_impl { | ||||||
|     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { |     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { | ||||||
|         impl<'d, T: AdvancedControlInstance> ComplementaryPwmPin<'d, T, $channel> { |         impl<'d, T: ComplementaryCaptureCompare16bitInstance> ComplementaryPwmPin<'d, T, $channel> { | ||||||
|             #[doc = concat!("Create a new ", stringify!($channel), " complementary PWM pin instance.")] |             #[doc = concat!("Create a new ", stringify!($channel), " complementary PWM pin instance.")] | ||||||
|             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd, output_type: OutputType) -> Self { |             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd, output_type: OutputType) -> Self { | ||||||
|                 into_ref!(pin); |                 into_ref!(pin); | ||||||
| @ -53,7 +52,7 @@ pub struct ComplementaryPwm<'d, T> { | |||||||
|     inner: PeripheralRef<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'d, T: AdvancedControlInstance> ComplementaryPwm<'d, T> { | impl<'d, T: ComplementaryCaptureCompare16bitInstance> ComplementaryPwm<'d, T> { | ||||||
|     /// Create a new complementary PWM driver.
 |     /// Create a new complementary PWM driver.
 | ||||||
|     #[allow(clippy::too_many_arguments)] |     #[allow(clippy::too_many_arguments)] | ||||||
|     pub fn new( |     pub fn new( | ||||||
| @ -88,12 +87,8 @@ impl<'d, T: AdvancedControlInstance> ComplementaryPwm<'d, T> { | |||||||
|         [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4] |         [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4] | ||||||
|             .iter() |             .iter() | ||||||
|             .for_each(|&channel| { |             .for_each(|&channel| { | ||||||
|                 sealed::GeneralPurpose16bitInstance::set_output_compare_mode( |                 this.inner.set_output_compare_mode(channel, OutputCompareMode::PwmMode1); | ||||||
|                     this.inner.deref_mut(), |                 this.inner.set_output_compare_preload(channel, true); | ||||||
|                     channel, |  | ||||||
|                     OutputCompareMode::PwmMode1, |  | ||||||
|                 ); |  | ||||||
|                 sealed::GeneralPurpose16bitInstance::set_output_compare_preload(this.inner.deref_mut(), channel, true); |  | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|         this |         this | ||||||
| @ -101,14 +96,14 @@ impl<'d, T: AdvancedControlInstance> ComplementaryPwm<'d, T> { | |||||||
| 
 | 
 | ||||||
|     /// Enable the given channel.
 |     /// Enable the given channel.
 | ||||||
|     pub fn enable(&mut self, channel: Channel) { |     pub fn enable(&mut self, channel: Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_channel(channel, true); | ||||||
|         sealed::AdvancedControlInstance::enable_complementary_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_complementary_channel(channel, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Disable the given channel.
 |     /// Disable the given channel.
 | ||||||
|     pub fn disable(&mut self, channel: Channel) { |     pub fn disable(&mut self, channel: Channel) { | ||||||
|         sealed::AdvancedControlInstance::enable_complementary_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_complementary_channel(channel, false); | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_channel(channel, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set PWM frequency.
 |     /// Set PWM frequency.
 | ||||||
| @ -136,13 +131,13 @@ impl<'d, T: AdvancedControlInstance> ComplementaryPwm<'d, T> { | |||||||
|     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 |     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 | ||||||
|     pub fn set_duty(&mut self, channel: Channel, duty: u16) { |     pub fn set_duty(&mut self, channel: Channel, duty: u16) { | ||||||
|         assert!(duty <= self.get_max_duty()); |         assert!(duty <= self.get_max_duty()); | ||||||
|         sealed::GeneralPurpose16bitInstance::set_compare_value(self.inner.deref_mut(), channel, duty) |         self.inner.set_compare_value(channel, duty) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set the output polarity for a given channel.
 |     /// Set the output polarity for a given channel.
 | ||||||
|     pub fn set_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { |     pub fn set_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||||||
|         sealed::GeneralPurpose16bitInstance::set_output_polarity(self.inner.deref_mut(), channel, polarity); |         self.inner.set_output_polarity(channel, polarity); | ||||||
|         sealed::AdvancedControlInstance::set_complementary_output_polarity(self.inner.deref_mut(), channel, polarity); |         self.inner.set_complementary_output_polarity(channel, polarity); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set the dead time as a proportion of max_duty
 |     /// Set the dead time as a proportion of max_duty
 | ||||||
| @ -154,19 +149,19 @@ impl<'d, T: AdvancedControlInstance> ComplementaryPwm<'d, T> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'d, T: AdvancedControlInstance> embedded_hal_02::Pwm for ComplementaryPwm<'d, T> { | impl<'d, T: ComplementaryCaptureCompare16bitInstance> embedded_hal_02::Pwm for ComplementaryPwm<'d, T> { | ||||||
|     type Channel = Channel; |     type Channel = Channel; | ||||||
|     type Time = Hertz; |     type Time = Hertz; | ||||||
|     type Duty = u16; |     type Duty = u16; | ||||||
| 
 | 
 | ||||||
|     fn disable(&mut self, channel: Self::Channel) { |     fn disable(&mut self, channel: Self::Channel) { | ||||||
|         sealed::AdvancedControlInstance::enable_complementary_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_complementary_channel(channel, false); | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_channel(channel, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn enable(&mut self, channel: Self::Channel) { |     fn enable(&mut self, channel: Self::Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_channel(channel, true); | ||||||
|         sealed::AdvancedControlInstance::enable_complementary_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_complementary_channel(channel, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_period(&self) -> Self::Time { |     fn get_period(&self) -> Self::Time { | ||||||
| @ -174,7 +169,7 @@ impl<'d, T: AdvancedControlInstance> embedded_hal_02::Pwm for ComplementaryPwm<' | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_duty(&self, channel: Self::Channel) -> Self::Duty { |     fn get_duty(&self, channel: Self::Channel) -> Self::Duty { | ||||||
|         sealed::GeneralPurpose16bitInstance::get_compare_value(self.inner.deref(), channel) |         self.inner.get_compare_value(channel) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_max_duty(&self) -> Self::Duty { |     fn get_max_duty(&self) -> Self::Duty { | ||||||
| @ -183,7 +178,7 @@ impl<'d, T: AdvancedControlInstance> embedded_hal_02::Pwm for ComplementaryPwm<' | |||||||
| 
 | 
 | ||||||
|     fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) { |     fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) { | ||||||
|         assert!(duty <= self.get_max_duty()); |         assert!(duty <= self.get_max_duty()); | ||||||
|         sealed::GeneralPurpose16bitInstance::set_compare_value(self.inner.deref_mut(), channel, duty) |         self.inner.set_compare_value(channel, duty) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn set_period<P>(&mut self, period: P) |     fn set_period<P>(&mut self, period: P) | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| //! Timers, PWM, quadrature decoder.
 | //! Timers, PWM, quadrature decoder.
 | ||||||
| 
 | 
 | ||||||
| // Timer inheritance
 | //! Timer inheritance
 | ||||||
|  | 
 | ||||||
|  | // sealed:
 | ||||||
| //
 | //
 | ||||||
| // Core -------------------------> 1CH -------------------------> 1CH_CMP
 | // Core -------------------------> 1CH -------------------------> 1CH_CMP
 | ||||||
| //   |                              |                              ^   |
 | //   |                              |                              ^   |
 | ||||||
| @ -12,7 +14,18 @@ | |||||||
| //            |             +--------------------------------------|-----------+
 | //            |             +--------------------------------------|-----------+
 | ||||||
| //            +----------------------------------------------------+
 | //            +----------------------------------------------------+
 | ||||||
| 
 | 
 | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] | //! BasicInstance --> CaptureCompare16bitInstance --+--> ComplementaryCaptureCompare16bitInstance  
 | ||||||
|  | //!                                                 |  
 | ||||||
|  | //!                                                 +--> CaptureCompare32bitInstance  
 | ||||||
|  | //!
 | ||||||
|  | //! mapping:
 | ||||||
|  | //!
 | ||||||
|  | //! Basic Timer --> BasicInstance  
 | ||||||
|  | //! 1-channel Timer, 2-channel Timer, General Purpose 16-bit Timer --> CaptureCompare16bitInstance  
 | ||||||
|  | //! General Purpose 32-bit Timer --> CaptureCompare32bitInstance  
 | ||||||
|  | //! 1-channel with one complentary Timer, 2-channel with one complentary Timer, Advance Control Timer --> ComplementaryCaptureCompare16bitInstance  
 | ||||||
|  | 
 | ||||||
|  | #[cfg(not(stm32l0))] | ||||||
| pub mod complementary_pwm; | pub mod complementary_pwm; | ||||||
| pub mod qei; | pub mod qei; | ||||||
| pub mod simple_pwm; | pub mod simple_pwm; | ||||||
| @ -32,157 +45,6 @@ pub mod low_level { | |||||||
| pub(crate) mod sealed { | pub(crate) mod sealed { | ||||||
|     use super::*; |     use super::*; | ||||||
| 
 | 
 | ||||||
|     macro_rules! add_capture_compare_common_methods { |  | ||||||
|         ($regs:ident) => { |  | ||||||
|             /// Set input capture filter.
 |  | ||||||
|             fn set_input_capture_filter(&mut self, channel: Channel, icf: vals::FilterValue) { |  | ||||||
|                 let raw_channel = channel.index(); |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccmr_input(raw_channel / 2) |  | ||||||
|                     .modify(|r| r.set_icf(raw_channel % 2, icf)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Clear input interrupt.
 |  | ||||||
|             fn clear_input_interrupt(&mut self, channel: Channel) { |  | ||||||
|                 Self::$regs().sr().modify(|r| r.set_ccif(channel.index(), false)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Enable input interrupt.
 |  | ||||||
|             fn enable_input_interrupt(&mut self, channel: Channel, enable: bool) { |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .dier() |  | ||||||
|                     .modify(|r| r.set_ccie(channel.index(), enable)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set input capture prescaler.
 |  | ||||||
|             fn set_input_capture_prescaler(&mut self, channel: Channel, factor: u8) { |  | ||||||
|                 let raw_channel = channel.index(); |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccmr_input(raw_channel / 2) |  | ||||||
|                     .modify(|r| r.set_icpsc(raw_channel % 2, factor)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set input TI selection.
 |  | ||||||
|             fn set_input_ti_selection(&mut self, channel: Channel, tisel: InputTISelection) { |  | ||||||
|                 let raw_channel = channel.index(); |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccmr_input(raw_channel / 2) |  | ||||||
|                     .modify(|r| r.set_ccs(raw_channel % 2, tisel.into())); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set input capture mode.
 |  | ||||||
|             fn set_input_capture_mode(&mut self, channel: Channel, mode: InputCaptureMode) { |  | ||||||
|                 Self::$regs().ccer().modify(|r| match mode { |  | ||||||
|                     InputCaptureMode::Rising => { |  | ||||||
|                         r.set_ccnp(channel.index(), false); |  | ||||||
|                         r.set_ccp(channel.index(), false); |  | ||||||
|                     } |  | ||||||
|                     InputCaptureMode::Falling => { |  | ||||||
|                         r.set_ccnp(channel.index(), false); |  | ||||||
|                         r.set_ccp(channel.index(), true); |  | ||||||
|                     } |  | ||||||
|                     InputCaptureMode::BothEdges => { |  | ||||||
|                         r.set_ccnp(channel.index(), true); |  | ||||||
|                         r.set_ccp(channel.index(), true); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set output compare mode.
 |  | ||||||
|             fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode) { |  | ||||||
|                 let raw_channel: usize = channel.index(); |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccmr_output(raw_channel / 2) |  | ||||||
|                     .modify(|w| w.set_ocm(raw_channel % 2, mode.into())); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set output polarity.
 |  | ||||||
|             fn set_output_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccer() |  | ||||||
|                     .modify(|w| w.set_ccp(channel.index(), polarity.into())); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Enable/disable a channel.
 |  | ||||||
|             fn enable_channel(&mut self, channel: Channel, enable: bool) { |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccer() |  | ||||||
|                     .modify(|w| w.set_cce(channel.index(), enable)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Get enable/disable state of a channel
 |  | ||||||
|             fn get_channel_enable_state(&self, channel: Channel) -> bool { |  | ||||||
|                 Self::$regs().ccer().read().cce(channel.index()) |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set compare value for a channel.
 |  | ||||||
|             fn set_compare_value(&mut self, channel: Channel, value: u16) { |  | ||||||
|                 Self::$regs().ccr(channel.index()).modify(|w| w.set_ccr(value)); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Get capture value for a channel.
 |  | ||||||
|             fn get_capture_value(&mut self, channel: Channel) -> u16 { |  | ||||||
|                 Self::$regs().ccr(channel.index()).read().ccr() |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Get compare value for a channel.
 |  | ||||||
|             fn get_compare_value(&self, channel: Channel) -> u16 { |  | ||||||
|                 Self::$regs().ccr(channel.index()).read().ccr() |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set output compare preload.
 |  | ||||||
|             fn set_output_compare_preload(&mut self, channel: Channel, preload: bool) { |  | ||||||
|                 let channel_index = channel.index(); |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccmr_output(channel_index / 2) |  | ||||||
|                     .modify(|w| w.set_ocpe(channel_index % 2, preload)); |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     macro_rules! add_capture_compare_dma_methods { |  | ||||||
|         ($regs:ident) => { |  | ||||||
|             /// Get capture compare DMA selection
 |  | ||||||
|             fn get_cc_dma_selection(&self) -> super::vals::Ccds { |  | ||||||
|                 Self::$regs().cr2().read().ccds() |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set capture compare DMA selection
 |  | ||||||
|             fn set_cc_dma_selection(&mut self, ccds: super::vals::Ccds) { |  | ||||||
|                 Self::$regs().cr2().modify(|w| w.set_ccds(ccds)) |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Get capture compare DMA enable state
 |  | ||||||
|             fn get_cc_dma_enable_state(&self, channel: Channel) -> bool { |  | ||||||
|                 Self::$regs().dier().read().ccde(channel.index()) |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Set capture compare DMA enable state
 |  | ||||||
|             fn set_cc_dma_enable_state(&mut self, channel: Channel, ccde: bool) { |  | ||||||
|                 Self::$regs().dier().modify(|w| w.set_ccde(channel.index(), ccde)) |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
|     macro_rules! add_complementary_capture_compare_methods { |  | ||||||
|         ($regs:ident) => { |  | ||||||
|             /// Set complementary output polarity.
 |  | ||||||
|             fn set_complementary_output_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccer() |  | ||||||
|                     .modify(|w| w.set_ccnp(channel.index(), polarity.into())); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             /// Enable/disable a complementary channel.
 |  | ||||||
|             fn enable_complementary_channel(&mut self, channel: Channel, enable: bool) { |  | ||||||
|                 Self::$regs() |  | ||||||
|                     .ccer() |  | ||||||
|                     .modify(|w| w.set_ccne(channel.index(), enable)); |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Virtual Core 16-bit timer instance.  
 |     /// Virtual Core 16-bit timer instance.  
 | ||||||
|     pub trait CoreInstance: RccPeripheral { |     pub trait CoreInstance: RccPeripheral { | ||||||
|         /// Interrupt for this timer.
 |         /// Interrupt for this timer.
 | ||||||
| @ -326,8 +188,6 @@ pub(crate) mod sealed { | |||||||
|         fn get_max_compare_value(&self) -> u16 { |         fn get_max_compare_value(&self) -> u16 { | ||||||
|             Self::regs_1ch().arr().read().arr() |             Self::regs_1ch().arr().read().arr() | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         add_capture_compare_common_methods!(regs_1ch); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Gneral-purpose 1 channel 16-bit  timer instance.
 |     /// Gneral-purpose 1 channel 16-bit  timer instance.
 | ||||||
| @ -339,8 +199,6 @@ pub(crate) mod sealed { | |||||||
|         /// for a given set of capabilities, and having it transparently work with
 |         /// for a given set of capabilities, and having it transparently work with
 | ||||||
|         /// more capable timers.
 |         /// more capable timers.
 | ||||||
|         fn regs_2ch() -> crate::pac::timer::Tim2ch; |         fn regs_2ch() -> crate::pac::timer::Tim2ch; | ||||||
| 
 |  | ||||||
|         add_capture_compare_common_methods!(regs_2ch); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Gneral-purpose 16-bit timer instance.
 |     /// Gneral-purpose 16-bit timer instance.
 | ||||||
| @ -372,11 +230,128 @@ pub(crate) mod sealed { | |||||||
|             (cr1.cms(), cr1.dir()).into() |             (cr1.cms(), cr1.dir()).into() | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         add_capture_compare_common_methods!(regs_gp16); |         /// Set input capture filter.
 | ||||||
|         add_capture_compare_dma_methods!(regs_gp16); |         fn set_input_capture_filter(&mut self, channel: Channel, icf: vals::FilterValue) { | ||||||
|  |             let raw_channel = channel.index(); | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccmr_input(raw_channel / 2) | ||||||
|  |                 .modify(|r| r.set_icf(raw_channel % 2, icf)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Clear input interrupt.
 | ||||||
|  |         fn clear_input_interrupt(&mut self, channel: Channel) { | ||||||
|  |             Self::regs_gp16().sr().modify(|r| r.set_ccif(channel.index(), false)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Enable input interrupt.
 | ||||||
|  |         fn enable_input_interrupt(&mut self, channel: Channel, enable: bool) { | ||||||
|  |             Self::regs_gp16().dier().modify(|r| r.set_ccie(channel.index(), enable)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set input capture prescaler.
 | ||||||
|  |         fn set_input_capture_prescaler(&mut self, channel: Channel, factor: u8) { | ||||||
|  |             let raw_channel = channel.index(); | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccmr_input(raw_channel / 2) | ||||||
|  |                 .modify(|r| r.set_icpsc(raw_channel % 2, factor)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set input TI selection.
 | ||||||
|  |         fn set_input_ti_selection(&mut self, channel: Channel, tisel: InputTISelection) { | ||||||
|  |             let raw_channel = channel.index(); | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccmr_input(raw_channel / 2) | ||||||
|  |                 .modify(|r| r.set_ccs(raw_channel % 2, tisel.into())); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set input capture mode.
 | ||||||
|  |         fn set_input_capture_mode(&mut self, channel: Channel, mode: InputCaptureMode) { | ||||||
|  |             Self::regs_gp16().ccer().modify(|r| match mode { | ||||||
|  |                 InputCaptureMode::Rising => { | ||||||
|  |                     r.set_ccnp(channel.index(), false); | ||||||
|  |                     r.set_ccp(channel.index(), false); | ||||||
|  |                 } | ||||||
|  |                 InputCaptureMode::Falling => { | ||||||
|  |                     r.set_ccnp(channel.index(), false); | ||||||
|  |                     r.set_ccp(channel.index(), true); | ||||||
|  |                 } | ||||||
|  |                 InputCaptureMode::BothEdges => { | ||||||
|  |                     r.set_ccnp(channel.index(), true); | ||||||
|  |                     r.set_ccp(channel.index(), true); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set output compare mode.
 | ||||||
|  |         fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode) { | ||||||
|  |             let raw_channel: usize = channel.index(); | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccmr_output(raw_channel / 2) | ||||||
|  |                 .modify(|w| w.set_ocm(raw_channel % 2, mode.into())); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set output polarity.
 | ||||||
|  |         fn set_output_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccer() | ||||||
|  |                 .modify(|w| w.set_ccp(channel.index(), polarity.into())); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Enable/disable a channel.
 | ||||||
|  |         fn enable_channel(&mut self, channel: Channel, enable: bool) { | ||||||
|  |             Self::regs_gp16().ccer().modify(|w| w.set_cce(channel.index(), enable)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Get enable/disable state of a channel
 | ||||||
|  |         fn get_channel_enable_state(&self, channel: Channel) -> bool { | ||||||
|  |             Self::regs_gp16().ccer().read().cce(channel.index()) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set compare value for a channel.
 | ||||||
|  |         fn set_compare_value(&mut self, channel: Channel, value: u16) { | ||||||
|  |             Self::regs_gp16().ccr(channel.index()).modify(|w| w.set_ccr(value)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Get capture value for a channel.
 | ||||||
|  |         fn get_capture_value(&mut self, channel: Channel) -> u16 { | ||||||
|  |             Self::regs_gp16().ccr(channel.index()).read().ccr() | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Get compare value for a channel.
 | ||||||
|  |         fn get_compare_value(&self, channel: Channel) -> u16 { | ||||||
|  |             Self::regs_gp16().ccr(channel.index()).read().ccr() | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set output compare preload.
 | ||||||
|  |         fn set_output_compare_preload(&mut self, channel: Channel, preload: bool) { | ||||||
|  |             let channel_index = channel.index(); | ||||||
|  |             Self::regs_gp16() | ||||||
|  |                 .ccmr_output(channel_index / 2) | ||||||
|  |                 .modify(|w| w.set_ocpe(channel_index % 2, preload)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Get capture compare DMA selection
 | ||||||
|  |         fn get_cc_dma_selection(&self) -> super::vals::Ccds { | ||||||
|  |             Self::regs_gp16().cr2().read().ccds() | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set capture compare DMA selection
 | ||||||
|  |         fn set_cc_dma_selection(&mut self, ccds: super::vals::Ccds) { | ||||||
|  |             Self::regs_gp16().cr2().modify(|w| w.set_ccds(ccds)) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Get capture compare DMA enable state
 | ||||||
|  |         fn get_cc_dma_enable_state(&self, channel: Channel) -> bool { | ||||||
|  |             Self::regs_gp16().dier().read().ccde(channel.index()) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Set capture compare DMA enable state
 | ||||||
|  |         fn set_cc_dma_enable_state(&mut self, channel: Channel, ccde: bool) { | ||||||
|  |             Self::regs_gp16().dier().modify(|w| w.set_ccde(channel.index(), ccde)) | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[cfg(not(any(stm32f1, stm32l0, stm32c0)))] |     #[cfg(not(stm32l0))] | ||||||
|     /// Gneral-purpose 32-bit timer instance.
 |     /// Gneral-purpose 32-bit timer instance.
 | ||||||
|     pub trait GeneralPurpose32bitInstance: GeneralPurpose16bitInstance { |     pub trait GeneralPurpose32bitInstance: GeneralPurpose16bitInstance { | ||||||
|         /// Get access to the general purpose 32bit timer registers.
 |         /// Get access to the general purpose 32bit timer registers.
 | ||||||
| @ -437,7 +412,7 @@ pub(crate) mod sealed { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[cfg(not(any(stm32l0, stm32l1)))] |     #[cfg(not(stm32l0))] | ||||||
|     /// Gneral-purpose 1 channel with one complementary 16-bit timer instance.
 |     /// Gneral-purpose 1 channel with one complementary 16-bit timer instance.
 | ||||||
|     pub trait GeneralPurpose1ChannelComplementaryInstance: BasicNoCr2Instance + GeneralPurpose1ChannelInstance { |     pub trait GeneralPurpose1ChannelComplementaryInstance: BasicNoCr2Instance + GeneralPurpose1ChannelInstance { | ||||||
|         /// Get access to the general purpose 1 channel with one complementary 16bit timer registers.
 |         /// Get access to the general purpose 1 channel with one complementary 16bit timer registers.
 | ||||||
| @ -462,11 +437,9 @@ pub(crate) mod sealed { | |||||||
|         fn enable_outputs(&mut self) { |         fn enable_outputs(&mut self) { | ||||||
|             Self::regs_1ch_cmp().bdtr().modify(|w| w.set_moe(true)); |             Self::regs_1ch_cmp().bdtr().modify(|w| w.set_moe(true)); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         add_complementary_capture_compare_methods!(regs_1ch_cmp); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[cfg(not(any(stm32l0, stm32l1)))] |     #[cfg(not(stm32l0))] | ||||||
|     /// Gneral-purpose 2 channel with one complementary 16-bit timer instance.
 |     /// Gneral-purpose 2 channel with one complementary 16-bit timer instance.
 | ||||||
|     pub trait GeneralPurpose2ChannelComplementaryInstance: |     pub trait GeneralPurpose2ChannelComplementaryInstance: | ||||||
|         BasicInstance + GeneralPurpose2ChannelInstance + GeneralPurpose1ChannelComplementaryInstance |         BasicInstance + GeneralPurpose2ChannelInstance + GeneralPurpose1ChannelComplementaryInstance | ||||||
| @ -478,11 +451,9 @@ pub(crate) mod sealed { | |||||||
|         /// for a given set of capabilities, and having it transparently work with
 |         /// for a given set of capabilities, and having it transparently work with
 | ||||||
|         /// more capable timers.
 |         /// more capable timers.
 | ||||||
|         fn regs_2ch_cmp() -> crate::pac::timer::Tim2chCmp; |         fn regs_2ch_cmp() -> crate::pac::timer::Tim2chCmp; | ||||||
| 
 |  | ||||||
|         add_complementary_capture_compare_methods!(regs_2ch_cmp); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[cfg(not(any(stm32l0, stm32l1)))] |     #[cfg(not(stm32l0))] | ||||||
|     /// Advanced control timer instance.
 |     /// Advanced control timer instance.
 | ||||||
|     pub trait AdvancedControlInstance: |     pub trait AdvancedControlInstance: | ||||||
|         GeneralPurpose2ChannelComplementaryInstance + GeneralPurpose16bitInstance |         GeneralPurpose2ChannelComplementaryInstance + GeneralPurpose16bitInstance | ||||||
| @ -490,7 +461,19 @@ pub(crate) mod sealed { | |||||||
|         /// Get access to the advanced timer registers.
 |         /// Get access to the advanced timer registers.
 | ||||||
|         fn regs_advanced() -> crate::pac::timer::TimAdv; |         fn regs_advanced() -> crate::pac::timer::TimAdv; | ||||||
| 
 | 
 | ||||||
|         add_complementary_capture_compare_methods!(regs_advanced); |         /// Set complementary output polarity.
 | ||||||
|  |         fn set_complementary_output_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||||||
|  |             Self::regs_advanced() | ||||||
|  |                 .ccer() | ||||||
|  |                 .modify(|w| w.set_ccnp(channel.index(), polarity.into())); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// Enable/disable a complementary channel.
 | ||||||
|  |         fn enable_complementary_channel(&mut self, channel: Channel, enable: bool) { | ||||||
|  |             Self::regs_advanced() | ||||||
|  |                 .ccer() | ||||||
|  |                 .modify(|w| w.set_ccne(channel.index(), enable)); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -681,96 +664,66 @@ impl From<OutputPolarity> for bool { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Virtual Core 16-bit timer instance.
 |  | ||||||
| pub trait CoreInstance: sealed::CoreInstance + 'static {} |  | ||||||
| 
 |  | ||||||
| /// Virtual Basic 16-bit timer without CR2 register instance.
 |  | ||||||
| pub trait BasicNoCr2Instance: sealed::BasicNoCr2Instance + CoreInstance + 'static {} |  | ||||||
| 
 |  | ||||||
| /// Basic 16-bit timer instance.
 | /// Basic 16-bit timer instance.
 | ||||||
| pub trait BasicInstance: sealed::BasicInstance + BasicNoCr2Instance + 'static {} | pub trait BasicInstance: sealed::BasicInstance + sealed::BasicNoCr2Instance + sealed::CoreInstance + 'static {} | ||||||
| 
 |  | ||||||
| /// 1 channel 16-bit instance.
 |  | ||||||
| pub trait GeneralPurpose1ChannelInstance: sealed::GeneralPurpose1ChannelInstance + CoreInstance + 'static {} |  | ||||||
| 
 |  | ||||||
| /// 2 channel 16-bit instance.
 |  | ||||||
| pub trait GeneralPurpose2ChannelInstance: |  | ||||||
|     sealed::GeneralPurpose2ChannelInstance + GeneralPurpose1ChannelInstance + 'static |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| /// General-purpose 16-bit timer instance.
 | /// General-purpose 16-bit timer instance.
 | ||||||
| pub trait GeneralPurpose16bitInstance: | pub trait CaptureCompare16bitInstance: | ||||||
|     sealed::GeneralPurpose16bitInstance + BasicInstance + GeneralPurpose2ChannelInstance + 'static |     BasicInstance | ||||||
| { |     + sealed::GeneralPurpose2ChannelInstance | ||||||
| } |     + sealed::GeneralPurpose1ChannelInstance | ||||||
| 
 |     + sealed::GeneralPurpose16bitInstance | ||||||
| #[cfg(not(any(stm32f1, stm32l0, stm32c0)))] |  | ||||||
| /// Gneral-purpose 32-bit timer instance.
 |  | ||||||
| pub trait GeneralPurpose32bitInstance: |  | ||||||
|     sealed::GeneralPurpose32bitInstance + GeneralPurpose16bitInstance + 'static |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| /// General-purpose 1 channel with one complementary 16-bit timer instance.
 |  | ||||||
| pub trait GeneralPurpose1ChannelComplementaryInstance: |  | ||||||
|     sealed::GeneralPurpose1ChannelComplementaryInstance + GeneralPurpose1ChannelInstance + 'static |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| /// General-purpose 2 channel with one complementary 16-bit timer instance.
 |  | ||||||
| pub trait GeneralPurpose2ChannelComplementaryInstance: |  | ||||||
|     sealed::GeneralPurpose2ChannelComplementaryInstance |  | ||||||
|     + BasicInstance |  | ||||||
|     + GeneralPurpose2ChannelInstance |  | ||||||
|     + GeneralPurpose1ChannelComplementaryInstance |  | ||||||
|     + 'static |     + 'static | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[cfg(not(any(stm32f37, stm32l0, stm32l1)))] | #[cfg(not(stm32l0))] | ||||||
| /// Advanced control timer instance.
 | /// Gneral-purpose 32-bit timer instance.
 | ||||||
| pub trait AdvancedControlInstance: | pub trait CaptureCompare32bitInstance: | ||||||
|     sealed::AdvancedControlInstance + GeneralPurpose2ChannelComplementaryInstance + GeneralPurpose16bitInstance + 'static |     sealed::GeneralPurpose32bitInstance + CaptureCompare16bitInstance + 'static | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pin_trait!(Channel1Pin, GeneralPurpose1ChannelInstance); | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(Channel2Pin, GeneralPurpose2ChannelInstance); | /// Advanced control timer instance.
 | ||||||
| pin_trait!(Channel3Pin, GeneralPurpose16bitInstance); | pub trait ComplementaryCaptureCompare16bitInstance: | ||||||
| pin_trait!(Channel4Pin, GeneralPurpose16bitInstance); |     CaptureCompare16bitInstance | ||||||
|  |     + sealed::GeneralPurpose1ChannelComplementaryInstance | ||||||
|  |     + sealed::GeneralPurpose2ChannelComplementaryInstance | ||||||
|  |     + sealed::AdvancedControlInstance | ||||||
|  |     + 'static | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pin_trait!(Channel1Pin, CaptureCompare16bitInstance); | ||||||
|  | pin_trait!(Channel2Pin, CaptureCompare16bitInstance); | ||||||
|  | pin_trait!(Channel3Pin, CaptureCompare16bitInstance); | ||||||
|  | pin_trait!(Channel4Pin, CaptureCompare16bitInstance); | ||||||
|  | pin_trait!(ExternalTriggerPin, CaptureCompare16bitInstance); | ||||||
| 
 | 
 | ||||||
| #[cfg(not(stm32l0))] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(ExternalTriggerPin, GeneralPurpose16bitInstance); | pin_trait!(Channel1ComplementaryPin, ComplementaryCaptureCompare16bitInstance); | ||||||
|  | #[cfg(not(stm32l0))] | ||||||
|  | pin_trait!(Channel2ComplementaryPin, ComplementaryCaptureCompare16bitInstance); | ||||||
|  | #[cfg(not(stm32l0))] | ||||||
|  | pin_trait!(Channel3ComplementaryPin, ComplementaryCaptureCompare16bitInstance); | ||||||
|  | #[cfg(not(stm32l0))] | ||||||
|  | pin_trait!(Channel4ComplementaryPin, ComplementaryCaptureCompare16bitInstance); | ||||||
| 
 | 
 | ||||||
| #[cfg(stm32l0)] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(ExternalTriggerPin, GeneralPurpose2ChannelInstance); | pin_trait!(BreakInputPin, ComplementaryCaptureCompare16bitInstance); | ||||||
|  | #[cfg(not(stm32l0))] | ||||||
|  | pin_trait!(BreakInput2Pin, ComplementaryCaptureCompare16bitInstance); | ||||||
| 
 | 
 | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(Channel1ComplementaryPin, GeneralPurpose1ChannelComplementaryInstance); | pin_trait!(BreakInputComparator1Pin, ComplementaryCaptureCompare16bitInstance); | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(Channel2ComplementaryPin, GeneralPurpose2ChannelComplementaryInstance); | pin_trait!(BreakInputComparator2Pin, ComplementaryCaptureCompare16bitInstance); | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(Channel3ComplementaryPin, AdvancedControlInstance); |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(Channel4ComplementaryPin, AdvancedControlInstance); |  | ||||||
| 
 | 
 | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(BreakInputPin, GeneralPurpose1ChannelComplementaryInstance); | pin_trait!(BreakInput2Comparator1Pin, ComplementaryCaptureCompare16bitInstance); | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] | #[cfg(not(stm32l0))] | ||||||
| pin_trait!(BreakInput2Pin, GeneralPurpose2ChannelComplementaryInstance); | pin_trait!(BreakInput2Comparator2Pin, ComplementaryCaptureCompare16bitInstance); | ||||||
| 
 |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(BreakInputComparator1Pin, GeneralPurpose1ChannelComplementaryInstance); |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(BreakInputComparator2Pin, AdvancedControlInstance); |  | ||||||
| 
 |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(BreakInput2Comparator1Pin, AdvancedControlInstance); |  | ||||||
| #[cfg(not(any(stm32l0, stm32l1)))] |  | ||||||
| pin_trait!(BreakInput2Comparator2Pin, AdvancedControlInstance); |  | ||||||
| 
 | 
 | ||||||
| #[allow(unused)] | #[allow(unused)] | ||||||
| macro_rules! impl_core_timer { | macro_rules! impl_core_timer { | ||||||
| @ -830,7 +783,7 @@ macro_rules! impl_2ch_timer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[allow(unused)] | #[allow(unused)] | ||||||
| macro_rules! impl_gp_16bit_timer { | macro_rules! impl_gp16_timer { | ||||||
|     ($inst:ident) => { |     ($inst:ident) => { | ||||||
|         impl sealed::GeneralPurpose16bitInstance for crate::peripherals::$inst { |         impl sealed::GeneralPurpose16bitInstance for crate::peripherals::$inst { | ||||||
|             fn regs_gp16() -> crate::pac::timer::TimGp16 { |             fn regs_gp16() -> crate::pac::timer::TimGp16 { | ||||||
| @ -841,7 +794,7 @@ macro_rules! impl_gp_16bit_timer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[allow(unused)] | #[allow(unused)] | ||||||
| macro_rules! impl_gp_32bit_timer { | macro_rules! impl_gp32_timer { | ||||||
|     ($inst:ident) => { |     ($inst:ident) => { | ||||||
|         impl sealed::GeneralPurpose32bitInstance for crate::peripherals::$inst { |         impl sealed::GeneralPurpose32bitInstance for crate::peripherals::$inst { | ||||||
|             fn regs_gp32() -> crate::pac::timer::TimGp32 { |             fn regs_gp32() -> crate::pac::timer::TimGp32 { | ||||||
| @ -890,26 +843,30 @@ foreach_interrupt! { | |||||||
|         impl_core_timer!($inst, $irq); |         impl_core_timer!($inst, $irq); | ||||||
|         impl_basic_no_cr2_timer!($inst); |         impl_basic_no_cr2_timer!($inst); | ||||||
|         impl_basic_timer!($inst); |         impl_basic_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |  | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |  | ||||||
|         impl BasicInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => { |     ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => { | ||||||
|         impl_core_timer!($inst, $irq); |         impl_core_timer!($inst, $irq); | ||||||
|  |         impl_basic_no_cr2_timer!($inst); | ||||||
|  |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |         impl_2ch_timer!($inst); | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl_gp16_timer!($inst); | ||||||
|  |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|  |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { |     ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { | ||||||
|         impl_core_timer!($inst, $irq); |         impl_core_timer!($inst, $irq); | ||||||
|  |         impl_basic_no_cr2_timer!($inst); | ||||||
|  |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl_2ch_timer!($inst); |         impl_2ch_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |         impl_gp16_timer!($inst); | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose2ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { |     ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { | ||||||
| @ -918,13 +875,9 @@ foreach_interrupt! { | |||||||
|         impl_basic_timer!($inst); |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl_2ch_timer!($inst); |         impl_2ch_timer!($inst); | ||||||
|         impl_gp_16bit_timer!($inst); |         impl_gp16_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |  | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |  | ||||||
|         impl BasicInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose2ChannelInstance for crate::peripherals::$inst {} |  | ||||||
|         impl GeneralPurpose16bitInstance for crate::peripherals::$inst {} |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { |     ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { | ||||||
| @ -933,26 +886,26 @@ foreach_interrupt! { | |||||||
|         impl_basic_timer!($inst); |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl_2ch_timer!($inst); |         impl_2ch_timer!($inst); | ||||||
|         impl_gp_16bit_timer!($inst); |         impl_gp16_timer!($inst); | ||||||
|         impl_gp_32bit_timer!($inst); |         impl_gp32_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |  | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |  | ||||||
|         impl BasicInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose2ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare32bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose16bitInstance for crate::peripherals::$inst {} |  | ||||||
|         impl GeneralPurpose32bitInstance for crate::peripherals::$inst {} |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { |     ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { | ||||||
|         impl_core_timer!($inst, $irq); |         impl_core_timer!($inst, $irq); | ||||||
|         impl_basic_no_cr2_timer!($inst); |         impl_basic_no_cr2_timer!($inst); | ||||||
|  |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|  |         impl_2ch_timer!($inst); | ||||||
|  |         impl_gp16_timer!($inst); | ||||||
|         impl_1ch_cmp_timer!($inst); |         impl_1ch_cmp_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |         impl_2ch_cmp_timer!($inst); | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |         impl_adv_timer!($inst); | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelComplementaryInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|  |         impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -962,15 +915,13 @@ foreach_interrupt! { | |||||||
|         impl_basic_timer!($inst); |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl_2ch_timer!($inst); |         impl_2ch_timer!($inst); | ||||||
|  |         impl_gp16_timer!($inst); | ||||||
|         impl_1ch_cmp_timer!($inst); |         impl_1ch_cmp_timer!($inst); | ||||||
|         impl_2ch_cmp_timer!($inst); |         impl_2ch_cmp_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |         impl_adv_timer!($inst); | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |  | ||||||
|         impl BasicInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose2ChannelInstance for crate::peripherals::$inst {} |         impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelComplementaryInstance for crate::peripherals::$inst {} |  | ||||||
|         impl GeneralPurpose2ChannelComplementaryInstance for crate::peripherals::$inst {} |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -980,26 +931,20 @@ foreach_interrupt! { | |||||||
|         impl_basic_timer!($inst); |         impl_basic_timer!($inst); | ||||||
|         impl_1ch_timer!($inst); |         impl_1ch_timer!($inst); | ||||||
|         impl_2ch_timer!($inst); |         impl_2ch_timer!($inst); | ||||||
|  |         impl_gp16_timer!($inst); | ||||||
|         impl_1ch_cmp_timer!($inst); |         impl_1ch_cmp_timer!($inst); | ||||||
|         impl_gp_16bit_timer!($inst); |  | ||||||
|         impl_2ch_cmp_timer!($inst); |         impl_2ch_cmp_timer!($inst); | ||||||
|         impl_adv_timer!($inst); |         impl_adv_timer!($inst); | ||||||
|         impl CoreInstance for crate::peripherals::$inst {} |  | ||||||
|         impl BasicNoCr2Instance for crate::peripherals::$inst{} |  | ||||||
|         impl BasicInstance for crate::peripherals::$inst {} |         impl BasicInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose1ChannelInstance for crate::peripherals::$inst {} |         impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose2ChannelInstance for crate::peripherals::$inst {} |         impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | ||||||
|         impl GeneralPurpose16bitInstance for crate::peripherals::$inst {} |  | ||||||
|         impl GeneralPurpose1ChannelComplementaryInstance for crate::peripherals::$inst {} |  | ||||||
|         impl GeneralPurpose2ChannelComplementaryInstance for crate::peripherals::$inst {} |  | ||||||
|         impl AdvancedControlInstance for crate::peripherals::$inst {} |  | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Update Event trigger DMA for every timer
 | // Update Event trigger DMA for every timer
 | ||||||
| dma_trait!(UpDma, BasicNoCr2Instance); | dma_trait!(UpDma, BasicInstance); | ||||||
| 
 | 
 | ||||||
| dma_trait!(Ch1Dma, GeneralPurpose1ChannelInstance); | dma_trait!(Ch1Dma, CaptureCompare16bitInstance); | ||||||
| dma_trait!(Ch2Dma, GeneralPurpose2ChannelInstance); | dma_trait!(Ch2Dma, CaptureCompare16bitInstance); | ||||||
| dma_trait!(Ch3Dma, GeneralPurpose16bitInstance); | dma_trait!(Ch3Dma, CaptureCompare16bitInstance); | ||||||
| dma_trait!(Ch4Dma, GeneralPurpose16bitInstance); | dma_trait!(Ch4Dma, CaptureCompare16bitInstance); | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ pub struct QeiPin<'d, T, Channel> { | |||||||
| 
 | 
 | ||||||
| macro_rules! channel_impl { | macro_rules! channel_impl { | ||||||
|     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { |     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { | ||||||
|         impl<'d, T: GeneralPurpose16bitInstance> QeiPin<'d, T, $channel> { |         impl<'d, T: CaptureCompare16bitInstance> QeiPin<'d, T, $channel> { | ||||||
|             #[doc = concat!("Create a new ", stringify!($channel), " QEI pin instance.")] |             #[doc = concat!("Create a new ", stringify!($channel), " QEI pin instance.")] | ||||||
|             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd) -> Self { |             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd) -> Self { | ||||||
|                 into_ref!(pin); |                 into_ref!(pin); | ||||||
| @ -57,7 +57,7 @@ pub struct Qei<'d, T> { | |||||||
|     _inner: PeripheralRef<'d, T>, |     _inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'d, T: GeneralPurpose16bitInstance> Qei<'d, T> { | impl<'d, T: CaptureCompare16bitInstance> Qei<'d, T> { | ||||||
|     /// Create a new quadrature decoder driver.
 |     /// Create a new quadrature decoder driver.
 | ||||||
|     pub fn new(tim: impl Peripheral<P = T> + 'd, _ch1: QeiPin<'d, T, Ch1>, _ch2: QeiPin<'d, T, Ch2>) -> Self { |     pub fn new(tim: impl Peripheral<P = T> + 'd, _ch1: QeiPin<'d, T, Ch1>, _ch2: QeiPin<'d, T, Ch2>) -> Self { | ||||||
|         Self::new_inner(tim) |         Self::new_inner(tim) | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| //! Simple PWM driver.
 | //! Simple PWM driver.
 | ||||||
| 
 | 
 | ||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
| use core::ops::{Deref, DerefMut}; |  | ||||||
| 
 | 
 | ||||||
| use embassy_hal_internal::{into_ref, PeripheralRef}; | use embassy_hal_internal::{into_ref, PeripheralRef}; | ||||||
| 
 | 
 | ||||||
| @ -31,7 +30,7 @@ pub struct PwmPin<'d, T, C> { | |||||||
| 
 | 
 | ||||||
| macro_rules! channel_impl { | macro_rules! channel_impl { | ||||||
|     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { |     ($new_chx:ident, $channel:ident, $pin_trait:ident) => { | ||||||
|         impl<'d, T: GeneralPurpose16bitInstance> PwmPin<'d, T, $channel> { |         impl<'d, T: CaptureCompare16bitInstance> PwmPin<'d, T, $channel> { | ||||||
|             #[doc = concat!("Create a new ", stringify!($channel), " PWM pin instance.")] |             #[doc = concat!("Create a new ", stringify!($channel), " PWM pin instance.")] | ||||||
|             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd, output_type: OutputType) -> Self { |             pub fn $new_chx(pin: impl Peripheral<P = impl $pin_trait<T>> + 'd, output_type: OutputType) -> Self { | ||||||
|                 into_ref!(pin); |                 into_ref!(pin); | ||||||
| @ -60,7 +59,7 @@ pub struct SimplePwm<'d, T> { | |||||||
|     inner: PeripheralRef<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { | impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | ||||||
|     /// Create a new simple PWM driver.
 |     /// Create a new simple PWM driver.
 | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         tim: impl Peripheral<P = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
| @ -88,13 +87,9 @@ impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { | |||||||
|         [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4] |         [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4] | ||||||
|             .iter() |             .iter() | ||||||
|             .for_each(|&channel| { |             .for_each(|&channel| { | ||||||
|                 sealed::GeneralPurpose16bitInstance::set_output_compare_mode( |                 this.inner.set_output_compare_mode(channel, OutputCompareMode::PwmMode1); | ||||||
|                     this.inner.deref_mut(), |  | ||||||
|                     channel, |  | ||||||
|                     OutputCompareMode::PwmMode1, |  | ||||||
|                 ); |  | ||||||
| 
 | 
 | ||||||
|                 sealed::GeneralPurpose16bitInstance::set_output_compare_preload(this.inner.deref_mut(), channel, true); |                 this.inner.set_output_compare_preload(channel, true); | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|         this |         this | ||||||
| @ -102,17 +97,17 @@ impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { | |||||||
| 
 | 
 | ||||||
|     /// Enable the given channel.
 |     /// Enable the given channel.
 | ||||||
|     pub fn enable(&mut self, channel: Channel) { |     pub fn enable(&mut self, channel: Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_channel(channel, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Disable the given channel.
 |     /// Disable the given channel.
 | ||||||
|     pub fn disable(&mut self, channel: Channel) { |     pub fn disable(&mut self, channel: Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_channel(channel, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Check whether given channel is enabled
 |     /// Check whether given channel is enabled
 | ||||||
|     pub fn is_enabled(&self, channel: Channel) -> bool { |     pub fn is_enabled(&self, channel: Channel) -> bool { | ||||||
|         sealed::GeneralPurpose16bitInstance::get_channel_enable_state(self.inner.deref(), channel) |         self.inner.get_channel_enable_state(channel) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set PWM frequency.
 |     /// Set PWM frequency.
 | ||||||
| @ -140,24 +135,24 @@ impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { | |||||||
|     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 |     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 | ||||||
|     pub fn set_duty(&mut self, channel: Channel, duty: u16) { |     pub fn set_duty(&mut self, channel: Channel, duty: u16) { | ||||||
|         assert!(duty <= self.get_max_duty()); |         assert!(duty <= self.get_max_duty()); | ||||||
|         sealed::GeneralPurpose16bitInstance::set_compare_value(self.inner.deref_mut(), channel, duty) |         self.inner.set_compare_value(channel, duty) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Get the duty for a given channel.
 |     /// Get the duty for a given channel.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 |     /// The value ranges from 0 for 0% duty, to [`get_max_duty`](Self::get_max_duty) for 100% duty, both included.
 | ||||||
|     pub fn get_duty(&self, channel: Channel) -> u16 { |     pub fn get_duty(&self, channel: Channel) -> u16 { | ||||||
|         sealed::GeneralPurpose16bitInstance::get_compare_value(self.inner.deref(), channel) |         self.inner.get_compare_value(channel) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set the output polarity for a given channel.
 |     /// Set the output polarity for a given channel.
 | ||||||
|     pub fn set_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { |     pub fn set_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||||||
|         sealed::GeneralPurpose16bitInstance::set_output_polarity(self.inner.deref_mut(), channel, polarity); |         self.inner.set_output_polarity(channel, polarity); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Set the output compare mode for a given channel.
 |     /// Set the output compare mode for a given channel.
 | ||||||
|     pub fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode) { |     pub fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode) { | ||||||
|         sealed::GeneralPurpose16bitInstance::set_output_compare_mode(self.inner.deref_mut(), channel, mode); |         self.inner.set_output_compare_mode(channel, mode); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Generate a sequence of PWM waveform
 |     /// Generate a sequence of PWM waveform
 | ||||||
| @ -232,7 +227,7 @@ impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { | |||||||
| 
 | 
 | ||||||
| macro_rules! impl_waveform_chx { | macro_rules! impl_waveform_chx { | ||||||
|     ($fn_name:ident, $dma_ch:ident, $cc_ch:ident) => { |     ($fn_name:ident, $dma_ch:ident, $cc_ch:ident) => { | ||||||
|         impl<'d, T: GeneralPurpose16bitInstance> SimplePwm<'d, T> { |         impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | ||||||
|             /// Generate a sequence of PWM waveform
 |             /// Generate a sequence of PWM waveform
 | ||||||
|             ///
 |             ///
 | ||||||
|             /// Note:
 |             /// Note:
 | ||||||
| @ -319,17 +314,17 @@ impl_waveform_chx!(waveform_ch2, Ch2Dma, Ch2); | |||||||
| impl_waveform_chx!(waveform_ch3, Ch3Dma, Ch3); | impl_waveform_chx!(waveform_ch3, Ch3Dma, Ch3); | ||||||
| impl_waveform_chx!(waveform_ch4, Ch4Dma, Ch4); | impl_waveform_chx!(waveform_ch4, Ch4Dma, Ch4); | ||||||
| 
 | 
 | ||||||
| impl<'d, T: GeneralPurpose16bitInstance> embedded_hal_02::Pwm for SimplePwm<'d, T> { | impl<'d, T: CaptureCompare16bitInstance> embedded_hal_02::Pwm for SimplePwm<'d, T> { | ||||||
|     type Channel = Channel; |     type Channel = Channel; | ||||||
|     type Time = Hertz; |     type Time = Hertz; | ||||||
|     type Duty = u16; |     type Duty = u16; | ||||||
| 
 | 
 | ||||||
|     fn disable(&mut self, channel: Self::Channel) { |     fn disable(&mut self, channel: Self::Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, false); |         self.inner.enable_channel(channel, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn enable(&mut self, channel: Self::Channel) { |     fn enable(&mut self, channel: Self::Channel) { | ||||||
|         sealed::GeneralPurpose16bitInstance::enable_channel(self.inner.deref_mut(), channel, true); |         self.inner.enable_channel(channel, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_period(&self) -> Self::Time { |     fn get_period(&self) -> Self::Time { | ||||||
| @ -337,7 +332,7 @@ impl<'d, T: GeneralPurpose16bitInstance> embedded_hal_02::Pwm for SimplePwm<'d, | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_duty(&self, channel: Self::Channel) -> Self::Duty { |     fn get_duty(&self, channel: Self::Channel) -> Self::Duty { | ||||||
|         sealed::GeneralPurpose16bitInstance::get_compare_value(self.inner.deref(), channel) |         self.inner.get_compare_value(channel) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_max_duty(&self) -> Self::Duty { |     fn get_max_duty(&self) -> Self::Duty { | ||||||
| @ -346,7 +341,7 @@ impl<'d, T: GeneralPurpose16bitInstance> embedded_hal_02::Pwm for SimplePwm<'d, | |||||||
| 
 | 
 | ||||||
|     fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) { |     fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) { | ||||||
|         assert!(duty <= self.get_max_duty()); |         assert!(duty <= self.get_max_duty()); | ||||||
|         sealed::GeneralPurpose16bitInstance::set_compare_value(self.inner.deref_mut(), channel, duty) |         self.inner.set_compare_value(channel, duty) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn set_period<P>(&mut self, period: P) |     fn set_period<P>(&mut self, period: P) | ||||||
|  | |||||||
| @ -56,11 +56,11 @@ async fn main(_spawner: Spawner) { | |||||||
|         Timer::after_millis(300).await; |         Timer::after_millis(300).await; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| pub struct SimplePwm32<'d, T: GeneralPurpose32bitInstance> { | pub struct SimplePwm32<'d, T: CaptureCompare32bitInstance> { | ||||||
|     inner: PeripheralRef<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'d, T: GeneralPurpose32bitInstance> SimplePwm32<'d, T> { | impl<'d, T: CaptureCompare32bitInstance> SimplePwm32<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         tim: impl Peripheral<P = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user