@@ -252,8 +252,13 @@ mod sealed {
252
252
fn start_pwm ( & mut self ) ;
253
253
fn enable_channel ( channel : u8 , b : bool ) ;
254
254
}
255
+
256
+ pub trait MasterTimer : General {
257
+ type Mms ;
258
+ fn master_mode ( & mut self , mode : Self :: Mms ) ;
259
+ }
255
260
}
256
- pub ( crate ) use sealed:: { General , WithPwm } ;
261
+ pub ( crate ) use sealed:: { General , MasterTimer , WithPwm } ;
257
262
258
263
pub trait Instance :
259
264
crate :: Sealed + rcc:: Enable + rcc:: Reset + rcc:: BusTimerClock + General
@@ -282,7 +287,12 @@ where
282
287
}
283
288
284
289
macro_rules! hal {
285
- ( $( $TIM: ty: [ $Timer: ident, $bits: ty, $( $cnum: ident $( , $aoe: ident) ?) ?] , ) +) => {
290
+ ( $( $TIM: ty: [
291
+ $Timer: ident,
292
+ $bits: ty,
293
+ $( c: ( $cnum: ident $( , $aoe: ident) ?) , ) ?
294
+ $( m: $timbase: ident, ) ?
295
+ ] , ) +) => {
286
296
$(
287
297
impl Instance for $TIM { }
288
298
pub type $Timer = Timer <$TIM>;
@@ -373,6 +383,13 @@ macro_rules! hal {
373
383
}
374
384
}
375
385
$( with_pwm!( $TIM: $cnum $( , $aoe) ?) ; ) ?
386
+
387
+ $( impl MasterTimer for $TIM {
388
+ type Mms = pac:: $timbase:: cr2:: MMS_A ;
389
+ fn master_mode( & mut self , mode: Self :: Mms ) {
390
+ self . cr2. modify( |_, w| w. mms( ) . variant( mode) ) ;
391
+ }
392
+ } ) ?
376
393
) +
377
394
}
378
395
}
@@ -587,10 +604,7 @@ macro_rules! with_pwm {
587
604
}
588
605
}
589
606
590
- impl < TIM > CountDownTimer < TIM >
591
- where
592
- TIM : General ,
593
- {
607
+ impl < TIM : General > CountDownTimer < TIM > {
594
608
/// Starts listening for an `event`
595
609
///
596
610
/// Note, you will also have to enable the TIM2 interrupt in the NVIC to start
@@ -620,6 +634,12 @@ where
620
634
}
621
635
}
622
636
637
+ impl < TIM : General + MasterTimer > CountDownTimer < TIM > {
638
+ pub fn set_master_mode ( & mut self , mode : TIM :: Mms ) {
639
+ self . tim . master_mode ( mode)
640
+ }
641
+ }
642
+
623
643
#[ inline( always) ]
624
644
pub ( crate ) const fn compute_arr_presc ( freq : u32 , clock : u32 ) -> ( u16 , u32 ) {
625
645
let ticks = clock / freq;
@@ -688,35 +708,38 @@ where
688
708
689
709
// All F4xx parts have these timers.
690
710
hal ! (
691
- pac:: TIM1 : [ Timer1 , u16 , CH4 , _aoe] ,
692
- pac:: TIM9 : [ Timer9 , u16 , CH2 ] ,
693
- pac:: TIM11 : [ Timer11 , u16 , CH1 ] ,
711
+ pac:: TIM9 : [ Timer9 , u16 , c: ( CH2 ) , ] ,
712
+ pac:: TIM11 : [ Timer11 , u16 , c: ( CH1 ) , ] ,
694
713
) ;
695
714
696
715
// All parts except for F410 add these timers.
697
716
#[ cfg( not( feature = "stm32f410" ) ) ]
698
717
hal ! (
699
- pac:: TIM5 : [ Timer5 , u32 , CH4 ] ,
700
- pac:: TIM2 : [ Timer2 , u32 , CH4 ] ,
701
- pac:: TIM3 : [ Timer3 , u16 , CH4 ] ,
702
- pac:: TIM4 : [ Timer4 , u16 , CH4 ] ,
703
- pac:: TIM10 : [ Timer10 , u16 , CH1 ] ,
718
+ pac:: TIM1 : [ Timer1 , u16 , c: ( CH4 , _aoe) , m: tim1, ] ,
719
+ pac:: TIM5 : [ Timer5 , u32 , c: ( CH4 ) , m: tim5, ] ,
720
+ pac:: TIM2 : [ Timer2 , u32 , c: ( CH4 ) , m: tim2, ] ,
721
+ pac:: TIM3 : [ Timer3 , u16 , c: ( CH4 ) , m: tim3, ] ,
722
+ pac:: TIM4 : [ Timer4 , u16 , c: ( CH4 ) , m: tim3, ] ,
723
+ pac:: TIM10 : [ Timer10 , u16 , c: ( CH1 ) , ] ,
704
724
) ;
705
725
706
726
// TIM5 on F410 is 16-bit
707
727
#[ cfg( feature = "stm32f410" ) ]
708
- hal ! ( pac:: TIM5 : [ Timer5 , u16 , CH4 ] , ) ;
728
+ hal ! (
729
+ pac:: TIM1 : [ Timer1 , u16 , c: ( CH4 , _aoe) , /*m: tim1,*/ ] , // TODO: fix SVD
730
+ pac:: TIM5 : [ Timer5 , u16 , c: ( CH4 ) , /*m: tim5,*/ ] , // TODO: fix SVD
731
+ ) ;
709
732
710
733
// All parts except F401 and F411.
711
734
#[ cfg( not( any( feature = "stm32f401" , feature = "stm32f411" , ) ) ) ]
712
- hal ! ( pac:: TIM6 : [ Timer6 , u16 , ] , ) ;
735
+ hal ! ( pac:: TIM6 : [ Timer6 , u16 , /*m: tim7,*/ ] , ) ; // TODO: fix SVD
713
736
714
737
// All parts except F401, F410, F411.
715
738
#[ cfg( not( any( feature = "stm32f401" , feature = "stm32f410" , feature = "stm32f411" , ) ) ) ]
716
739
hal ! (
717
- pac:: TIM7 : [ Timer7 , u16 , ] ,
718
- pac:: TIM8 : [ Timer8 , u16 , CH4 , _aoe] ,
719
- pac:: TIM12 : [ Timer12 , u16 , CH2 ] ,
720
- pac:: TIM13 : [ Timer13 , u16 , CH1 ] ,
721
- pac:: TIM14 : [ Timer14 , u16 , CH1 ] ,
740
+ pac:: TIM7 : [ Timer7 , u16 , /*m: tim7,*/ ] , // TODO: fix SVD
741
+ pac:: TIM8 : [ Timer8 , u16 , c : ( CH4 , _aoe) , m : tim1 , ] ,
742
+ pac:: TIM12 : [ Timer12 , u16 , c : ( CH2 ) , ] ,
743
+ pac:: TIM13 : [ Timer13 , u16 , c : ( CH1 ) , ] ,
744
+ pac:: TIM14 : [ Timer14 , u16 , c : ( CH1 ) , ] ,
722
745
) ;
0 commit comments