1use crate::gpio::*;
2use crate::gpio::{AltFunction, DefaultMode};
3use crate::stm32::*;
4use crate::timer::*;
5
6pub trait TimerPin<TIM> {
7 type Channel;
8
9 fn setup(&self);
10 fn release(self) -> Self;
11}
12
13pub struct TriggerPin<TIM, PIN: TimerPin<TIM>> {
14 pin: PIN,
15 tim: PhantomData<TIM>,
16}
17
18impl<TIM, PIN: TimerPin<TIM>> ExternalClock for TriggerPin<TIM, PIN> {
19 fn mode(&self) -> ExternalClockMode {
20 ExternalClockMode::Mode1
21 }
22}
23
24impl<TIM, PIN: TimerPin<TIM>> TriggerPin<TIM, PIN> {
25 pub fn release(self) -> PIN {
26 self.pin
27 }
28}
29
30macro_rules! timer_pins {
31 ($TIMX:ident, [ $(($ch:ty, $pin:ty, $af_mode:expr),)+ ]) => {
32 $(
33 impl TimerPin<$TIMX> for $pin {
34 type Channel = $ch;
35
36 fn setup(&self) {
37 self.set_alt_mode($af_mode);
38 }
39
40 fn release(self) -> Self {
41 self.into_analog()
42 }
43 }
44 )+
45 };
46}
47
48macro_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
89trigger_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")]
98trigger_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
108trigger_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
117timer_pins!(TIM1, [
118 (Channel1, PA8<DefaultMode>, AltFunction::AF2),
119 (Channel1, PC8<DefaultMode>, AltFunction::AF2),
120 (Channel2, PA9<DefaultMode>, AltFunction::AF2),
121 (Channel2, PB3<DefaultMode>, AltFunction::AF1),
122 (Channel2, PC9<DefaultMode>, AltFunction::AF2),
123 (Channel3, PA10<DefaultMode>, AltFunction::AF2),
124 (Channel3, PB6<DefaultMode>, AltFunction::AF1),
125 (Channel3, PC10<DefaultMode>, AltFunction::AF2),
126 (Channel4, PA11<DefaultMode>, AltFunction::AF2),
127 (Channel4, PC11<DefaultMode>, AltFunction::AF2),
128]);
129
130timer_pins!(TIM1, [
132 (Channel1, PA7<DefaultMode>, AltFunction::AF2),
133 (Channel1, PB13<DefaultMode>, AltFunction::AF2),
134 (Channel1, PD2<DefaultMode>, AltFunction::AF2),
135 (Channel2, PB0<DefaultMode>, AltFunction::AF2),
136 (Channel2, PB14<DefaultMode>, AltFunction::AF2),
137 (Channel2, PD3<DefaultMode>, AltFunction::AF2),
138 (Channel3, PB1<DefaultMode>, AltFunction::AF2),
139 (Channel3, PB15<DefaultMode>, AltFunction::AF2),
140 (Channel3, PD4<DefaultMode>, AltFunction::AF2),
141]);
142
143#[cfg(feature = "stm32g0x1")]
144timer_pins!(TIM2, [
145 (Channel1, PA0<DefaultMode>, AltFunction::AF2),
146 (Channel1, PA5<DefaultMode>, AltFunction::AF2),
147 (Channel1, PA15<DefaultMode>, AltFunction::AF2),
148 (Channel1, PC4<DefaultMode>, AltFunction::AF2),
149 (Channel2, PA1<DefaultMode>, AltFunction::AF2),
150 (Channel2, PB3<DefaultMode>, AltFunction::AF2),
151 (Channel2, PC5<DefaultMode>, AltFunction::AF2),
152 (Channel3, PA2<DefaultMode>, AltFunction::AF2),
153 (Channel3, PB10<DefaultMode>, AltFunction::AF2),
154 (Channel3, PC6<DefaultMode>, AltFunction::AF2),
155 (Channel4, PA3<DefaultMode>, AltFunction::AF2),
156 (Channel4, PB11<DefaultMode>, AltFunction::AF2),
157 (Channel4, PC7<DefaultMode>, AltFunction::AF2),
158]);
159
160timer_pins!(TIM3, [
161 (Channel1, PA6<DefaultMode>, AltFunction::AF1),
162 (Channel1, PB4<DefaultMode>, AltFunction::AF1),
163 (Channel1, PC6<DefaultMode>, AltFunction::AF1),
164 (Channel2, PA7<DefaultMode>, AltFunction::AF1),
165 (Channel2, PB5<DefaultMode>, AltFunction::AF1),
166 (Channel2, PC7<DefaultMode>, AltFunction::AF1),
167 (Channel3, PB0<DefaultMode>, AltFunction::AF1),
168 (Channel3, PC8<DefaultMode>, AltFunction::AF1),
169 (Channel4, PB1<DefaultMode>, AltFunction::AF1),
170 (Channel4, PC9<DefaultMode>, AltFunction::AF1),
171]);
172
173timer_pins!(TIM14, [
174 (Channel1, PA4<DefaultMode>, AltFunction::AF4),
175 (Channel1, PA7<DefaultMode>, AltFunction::AF4),
176 (Channel1, PB1<DefaultMode>, AltFunction::AF0),
177 (Channel1, PC12<DefaultMode>, AltFunction::AF2),
178 (Channel1, PF0<DefaultMode>, AltFunction::AF2),
179]);
180
181#[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
182timer_pins!(TIM15, [
183 (Channel1, PA2<DefaultMode>, AltFunction::AF5),
184 (Channel1, PB14<DefaultMode>, AltFunction::AF5),
185 (Channel1, PC1<DefaultMode>, AltFunction::AF2),
186 (Channel2, PA3<DefaultMode>, AltFunction::AF5),
187 (Channel2, PB15<DefaultMode>, AltFunction::AF5),
188 (Channel2, PC2<DefaultMode>, AltFunction::AF2),
189]);
190
191#[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
193timer_pins!(TIM15, [
194 (Channel1, PA1<DefaultMode>, AltFunction::AF5),
195 (Channel1, PB13<DefaultMode>, AltFunction::AF5),
196 (Channel1, PF1<DefaultMode>, AltFunction::AF2),
197]);
198
199timer_pins!(TIM16, [
200 (Channel1, PA6<DefaultMode>, AltFunction::AF5),
201 (Channel1, PB8<DefaultMode>, AltFunction::AF2),
202 (Channel1, PD0<DefaultMode>, AltFunction::AF2),
203]);
204
205timer_pins!(TIM16, [
207 (Channel1, PB6<DefaultMode>, AltFunction::AF2),
208]);
209
210timer_pins!(TIM17, [
211 (Channel1, PA7<DefaultMode>, AltFunction::AF6),
212 (Channel1, PB9<DefaultMode>, AltFunction::AF2),
213 (Channel1, PD1<DefaultMode>, AltFunction::AF2),
214]);
215
216timer_pins!(TIM17, [
218 (Channel1, PB7<DefaultMode>, AltFunction::AF2),
219]);