@@ -10,6 +10,23 @@ pub trait TimerPin<TIM> {
10
10
fn release ( self ) -> Self ;
11
11
}
12
12
13
+ pub struct TriggerPin < TIM , PIN : TimerPin < TIM > > {
14
+ pin : PIN ,
15
+ tim : PhantomData < TIM > ,
16
+ }
17
+
18
+ impl < TIM , PIN : TimerPin < TIM > > ExternalClock for TriggerPin < TIM , PIN > {
19
+ fn mode ( & self ) -> ExternalClockMode {
20
+ ExternalClockMode :: Mode1
21
+ }
22
+ }
23
+
24
+ impl < TIM , PIN : TimerPin < TIM > > TriggerPin < TIM , PIN > {
25
+ pub fn release ( self ) -> PIN {
26
+ self . pin
27
+ }
28
+ }
29
+
13
30
macro_rules! timer_pins {
14
31
( $TIMX: ident, [ $( ( $ch: ty, $pin: ty, $af_mode: expr) , ) + ] ) => {
15
32
$(
@@ -28,6 +45,75 @@ macro_rules! timer_pins {
28
45
} ;
29
46
}
30
47
48
+ macro_rules! trigger_pins {
49
+ ( $TIMX: ident, [ $( ( $pin: ty, $ccp: ident $( , $icf: ident) * ) , ) + ] ) => {
50
+ $(
51
+ impl TriggerPin <$TIMX, $pin> {
52
+ pub fn new( pin: $pin, edge: SignalEdge ) -> Self {
53
+ TimerPin :: <$TIMX>:: setup( & pin) ;
54
+ let tim = unsafe { & ( * $TIMX:: ptr( ) ) } ;
55
+ let ts = match edge {
56
+ SignalEdge :: All => 0b100 ,
57
+ SignalEdge :: Falling => {
58
+ tim. ccer. modify( |_, w| w. $ccp( ) . set_bit( ) ) ;
59
+ 0b101
60
+ } ,
61
+ SignalEdge :: Rising => {
62
+ tim. ccer. modify( |_, w| w. $ccp( ) . clear_bit( ) ) ;
63
+ 0b101
64
+ }
65
+ } ;
66
+
67
+ tim. smcr. modify( |_, w| unsafe { w. ts( ) . bits( ts) } ) ;
68
+
69
+ Self {
70
+ pin,
71
+ tim: PhantomData ,
72
+ }
73
+ }
74
+
75
+ $(
76
+ pub fn with_filter( pin: $pin, edge: SignalEdge , capture_filter: u8 ) -> Self {
77
+ unsafe {
78
+ let tim = & ( * $TIMX:: ptr( ) ) ;
79
+ tim. ccmr1_input( ) . modify( |_, w| w. $icf( ) . bits( capture_filter) ) ;
80
+ }
81
+ Self :: new( pin, edge)
82
+ }
83
+ ) *
84
+ }
85
+ ) +
86
+ } ;
87
+ }
88
+
89
+ trigger_pins ! ( TIM1 , [
90
+ ( PA8 <DefaultMode >, cc1p) ,
91
+ ( PC8 <DefaultMode >, cc1p) ,
92
+ ( PA9 <DefaultMode >, cc2p) ,
93
+ ( PB3 <DefaultMode >, cc2p) ,
94
+ ( PC9 <DefaultMode >, cc2p) ,
95
+ ] ) ;
96
+
97
+ #[ cfg( feature = "stm32g0x1" ) ]
98
+ trigger_pins ! ( TIM2 , [
99
+ ( PA0 <DefaultMode >, cc1p, ic1f) ,
100
+ ( PA5 <DefaultMode >, cc1p, ic1f) ,
101
+ ( PA15 <DefaultMode >, cc1p, ic1f) ,
102
+ ( PC4 <DefaultMode >, cc1p, ic1f) ,
103
+ ( PA1 <DefaultMode >, cc2p, ic2f) ,
104
+ ( PB3 <DefaultMode >, cc2p, ic2f) ,
105
+ ( PC5 <DefaultMode >, cc2p, ic2f) ,
106
+ ] ) ;
107
+
108
+ trigger_pins ! ( TIM3 , [
109
+ ( PA6 <DefaultMode >, cc1p, ic1f) ,
110
+ ( PB4 <DefaultMode >, cc1p, ic1f) ,
111
+ ( PC6 <DefaultMode >, cc1p, ic1f) ,
112
+ ( PA7 <DefaultMode >, cc2p, ic2f) ,
113
+ ( PB5 <DefaultMode >, cc2p, ic2f) ,
114
+ ( PC7 <DefaultMode >, cc2p, ic2f) ,
115
+ ] ) ;
116
+
31
117
timer_pins ! ( TIM1 , [
32
118
( Channel1 , PA8 <DefaultMode >, AltFunction :: AF2 ) ,
33
119
( Channel1 , PC8 <DefaultMode >, AltFunction :: AF2 ) ,
0 commit comments