1use crate::pac;
2
3pub trait CPin<REMAP, const C: u8> {}
4pub struct Ch<const C: u8>;
5pub const C1: u8 = 0;
6pub const C2: u8 = 1;
7pub const C3: u8 = 2;
8pub const C4: u8 = 3;
9
10pub(crate) mod sealed {
11 pub trait Remap {
12 type Periph;
13 const REMAP: u8;
14
15 fn remap(mapr: &mut crate::afio::MAPR);
16 }
17}
18
19macro_rules! remap {
20 ($($name:ident: ($TIMX:ty, $state:literal, $P1:ident, $P2:ident, $P3:ident, $P4:ident, { $remapex:expr }),)+) => {
21 $(
22 pub struct $name;
23 impl sealed::Remap for $name {
24 type Periph = $TIMX;
25 const REMAP: u8 = $state;
26
27 fn remap(mapr: &mut crate::afio::MAPR) {
28 mapr.modify_mapr($remapex);
29 }
30 }
31 impl<MODE> CPin<$name, 0> for crate::gpio::$P1<MODE> {}
32 impl<MODE> CPin<$name, 1> for crate::gpio::$P2<MODE> {}
33 impl<MODE> CPin<$name, 2> for crate::gpio::$P3<MODE> {}
34 impl<MODE> CPin<$name, 3> for crate::gpio::$P4<MODE> {}
35 )+
36 }
37}
38
39#[cfg(any(feature = "stm32f100", feature = "stm32f103", feature = "connectivity"))]
40remap!(
41 Tim1NoRemap: (pac::TIM1, 0b00, PA8, PA9, PA10, PA11, {|_, w| unsafe { w.tim1_remap().bits(Self::REMAP)}}),
42 Tim1FullRemap: (pac::TIM1, 0b11, PE9, PE11, PE13, PE14, {|_, w| unsafe { w.tim1_remap().bits(Self::REMAP)}}),
44);
45
46remap!(
47 Tim2NoRemap: (pac::TIM2, 0b00, PA0, PA1, PA2, PA3, {|_, w| unsafe { w.tim2_remap().bits(Self::REMAP)}}),
48 Tim2PartialRemap1: (pac::TIM2, 0b01, PA15, PB3, PA2, PA3, {|_, w| unsafe { w.tim2_remap().bits(Self::REMAP)}}),
49 Tim2PartialRemap2: (pac::TIM2, 0b10, PA0, PA1, PB10, PB11, {|_, w| unsafe { w.tim2_remap().bits(Self::REMAP)}}),
50 Tim2FullRemap: (pac::TIM2, 0b11, PA15, PB3, PB10, PB11, {|_, w| unsafe { w.tim2_remap().bits(Self::REMAP)}}),
51
52 Tim3NoRemap: (pac::TIM3, 0b00, PA6, PA7, PB0, PB1, {|_, w| unsafe { w.tim3_remap().bits(Self::REMAP)}}),
53 Tim3PartialRemap: (pac::TIM3, 0b10, PB4, PB5, PB0, PB1, {|_, w| unsafe { w.tim3_remap().bits(Self::REMAP)}}),
54 Tim3FullRemap: (pac::TIM3, 0b11, PC6, PC7, PC8, PC9, {|_, w| unsafe { w.tim3_remap().bits(Self::REMAP)}}),
55);
56
57#[cfg(feature = "medium")]
58remap!(
59 Tim4NoRemap: (pac::TIM4, 0b00, PB6, PB7, PB8, PB9, {|_, w| w.tim4_remap().bit(Self::REMAP == 1)}),
60 Tim4Remap: (pac::TIM4, 0b01, PD12, PD13, PD14, PD15, {|_, w| w.tim4_remap().bit(Self::REMAP == 1)}),
61);