stm32f3xx_hal/timer/
interrupts.rs

1use crate::pac::Interrupt;
2
3/// Wrapper around interrupt types for the timers.
4#[derive(Copy, Clone, Debug)]
5// To make the type non-creatable but still accessable.
6#[non_exhaustive]
7pub struct InterruptTypes {
8    /// Break Interrupt
9    pub r#break: Interrupt,
10    /// Update Interrupt
11    pub update: Interrupt,
12    /// Trigger and communication Interrupt
13    pub trigger: Interrupt,
14    /// Capture and compare interupt
15    pub capture_compare: Interrupt,
16}
17
18// FIXME: Use conditional feature compilation to make this compialble for all chip families.
19// TODO: Check if pub is needed.
20pub(crate) const TIM2: Interrupt = Interrupt::TIM2;
21cfg_if::cfg_if! {
22    if #[cfg(any(feature = "svd-f303", feature = "svd-f302", feature = "svd-f373"))] {
23        pub(crate) const TIM3: Interrupt = Interrupt::TIM3;
24        pub(crate) const TIM4: Interrupt = Interrupt::TIM4;
25    } else if #[cfg(any(feature = "svd-f3x4"))] {
26        pub(crate) const TIM3: Interrupt = Interrupt::TIM3_IRQ;
27    }
28}
29cfg_if::cfg_if! {
30    if #[cfg(feature = "svd-f373")] {
31        pub(crate) const TIM5: Interrupt = Interrupt::TIM5;
32        pub(crate) const TIM12: Interrupt = Interrupt::TIM12;
33        pub(crate) const TIM13: Interrupt = Interrupt::TIM13;
34        pub(crate) const TIM14: Interrupt = Interrupt::TIM14;
35        pub(crate) const TIM18: Interrupt = Interrupt::TIM18_DAC;
36        pub(crate) const TIM19: Interrupt = Interrupt::TIM19;
37    }
38}
39cfg_if::cfg_if! {
40    if #[cfg(any(feature = "svd-f302", feature = "svd-f303"))] {
41        pub(crate) const TIM6: Interrupt = Interrupt::TIM6_DACUNDER;
42    } else if #[cfg(any(feature = "svd-f301", feature = "svd-f373", feature = "svd-f3x4"))] {
43        pub(crate) const TIM6: Interrupt = Interrupt::TIM6_DAC1;
44    }
45}
46
47cfg_if::cfg_if! {
48    if #[cfg(any(feature = "svd-f302", feature = "svd-f303", feature = "svd-f373"))] {
49        pub(crate) const TIM7: Interrupt = Interrupt::TIM7;
50    } else if #[cfg(feature = "svd-f3x4")] {
51        pub(crate) const TIM7: Interrupt = Interrupt::TIM7_DAC2;
52    }
53}
54
55cfg_if::cfg_if! {
56    if #[cfg(any(feature = "svd-f302", feature = "svd-f303", feature = "svd-f3x4"))] {
57        pub(crate) const TIM15: Interrupt = Interrupt::TIM1_BRK_TIM15;
58        pub(crate) const TIM16: Interrupt = Interrupt::TIM1_UP_TIM16;
59        pub(crate) const TIM17: Interrupt = Interrupt::TIM1_TRG_COM_TIM17;
60
61        pub(crate) const TIM1_TYPES: InterruptTypes = InterruptTypes {
62            r#break: Interrupt::TIM1_BRK_TIM15,
63            update: Interrupt::TIM1_UP_TIM16,
64            trigger: Interrupt::TIM1_TRG_COM_TIM17,
65            capture_compare: Interrupt::TIM1_CC,
66        };
67    } else if #[cfg(feature = "svd-f301")] {
68        pub(crate) const TIM1: Interrupt = Interrupt::TIM1_CC;
69        pub(crate) const TIM15: Interrupt = Interrupt::TIM15_IRQ;
70        pub(crate) const TIM16: Interrupt = Interrupt::TIM16_IRQ;
71        pub(crate) const TIM17: Interrupt = Interrupt::TIM17_IRQ;
72    } else if #[cfg(feature = "svd-f373")] {
73        pub(crate) const TIM15: Interrupt = Interrupt::TIM15;
74        pub(crate) const TIM16: Interrupt = Interrupt::TIM16;
75        pub(crate) const TIM17: Interrupt = Interrupt::TIM17;
76    }
77}
78
79#[cfg(feature = "svd-f303")]
80pub(crate) const TIM8_TYPES: InterruptTypes = InterruptTypes {
81    r#break: Interrupt::TIM8_BRK,
82    update: Interrupt::TIM8_UP,
83    trigger: Interrupt::TIM8_TRG_COM,
84    capture_compare: Interrupt::TIM8_CC,
85};
86
87#[cfg(feature = "svd-f303")]
88pub(crate) const TIM20_TYPES: InterruptTypes = InterruptTypes {
89    r#break: Interrupt::TIM20_BRK,
90    update: Interrupt::TIM20_UP,
91    trigger: Interrupt::TIM20_TRG_COM,
92    capture_compare: Interrupt::TIM20_CC,
93};
94
95macro_rules! single {
96    ([ $($X:literal),+ ]) => {
97        paste::paste! {
98            $(
99                impl crate::interrupts::InterruptNumber for crate::pac::[<TIM $X>] {
100                    type Interrupt = crate::timer::interrupts::Interrupt;
101                    const INTERRUPT: Self::Interrupt = crate::timer::interrupts::[<TIM $X>];
102                }
103            )+
104        }
105    };
106}
107
108#[allow(unused)]
109macro_rules! multi {
110    ([ $($X:literal),+ ]) => {
111        paste::paste! {
112            $(
113                impl crate::interrupts::InterruptNumber for crate::pac::[<TIM $X>] {
114                    type Interrupt = crate::timer::interrupts::InterruptTypes;
115                    const INTERRUPT: Self::Interrupt = crate::timer::interrupts::[<TIM $X _TYPES>];
116                }
117            )+
118        }
119    };
120}
121
122#[cfg(feature = "svd-f301")]
123single!([1, 2, 6, 15, 16, 17]);
124
125#[cfg(feature = "svd-f302")]
126single!([2, 3, 4, 6, 7, 15, 16, 17]);
127#[cfg(feature = "svd-f302")]
128multi!([1]);
129
130#[cfg(feature = "svd-f303")]
131single!([2, 3, 4, 6, 7, 15, 16, 17]);
132#[cfg(feature = "svd-f303")]
133multi!([1, 8, 20]);
134
135#[cfg(feature = "svd-f373")]
136single!([2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 18, 19]);
137
138#[cfg(feature = "svd-f3x4")]
139single!([2, 3, 6, 7, 15, 16, 17]);
140#[cfg(feature = "svd-f3x4")]
141multi!([1]);