stm32g0xx_hal/timer/
pins.rs

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
130// Inverted pins
131timer_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// Inverted pins
192#[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
205// Inverted pins
206timer_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
216//  Inverted pins
217timer_pins!(TIM17, [
218    (Channel1, PB7<DefaultMode>, AltFunction::AF2),
219]);