stm32_hrtim/
timer_eev_cfg.rs

1use core::marker::PhantomData;
2
3pub struct EevCfgs<TIM> {
4    pub eev1: EevCfg<TIM>,
5    pub eev2: EevCfg<TIM>,
6    pub eev3: EevCfg<TIM>,
7    pub eev4: EevCfg<TIM>,
8    pub eev5: EevCfg<TIM>,
9    pub eev6: EevCfg<TIM>,
10    pub eev7: EevCfg<TIM>,
11    pub eev8: EevCfg<TIM>,
12    pub eev9: EevCfg<TIM>,
13    pub eev10: EevCfg<TIM>,
14
15    // TODO: Expose these
16    // TODO: Note there are some peculiarities here with fast mode
17    // One way to prevent misuse would be to require a borrowed ExternalEventSource<IS_FAST> when setting
18    // filter/latching as well as the event_counter related settings below.
19    #[cfg(feature = "hrtim_v2")]
20    pub(crate) event_counter_enable_bit: bool,
21    #[cfg(feature = "hrtim_v2")]
22    pub(crate) event_counter_reset_mode_bit: bool,
23    #[cfg(feature = "hrtim_v2")]
24    pub(crate) event_counter_source_bits: u8,
25    #[cfg(feature = "hrtim_v2")]
26    pub(crate) event_counter_threshold_bits: u8,
27}
28
29macro_rules! impl_setter {
30    ($eevX:ident) => {
31        pub fn $eevX(mut self, cfg: EevCfg<TIM>) -> Self {
32            self.$eevX = cfg;
33            self
34        }
35    };
36}
37
38impl<TIM> EevCfgs<TIM> {
39    impl_setter!(eev1);
40    impl_setter!(eev2);
41    impl_setter!(eev3);
42    impl_setter!(eev4);
43    impl_setter!(eev5);
44    impl_setter!(eev6);
45    impl_setter!(eev7);
46    impl_setter!(eev8);
47    impl_setter!(eev9);
48    impl_setter!(eev10);
49}
50
51impl<TIM> Clone for EevCfgs<TIM> {
52    fn clone(&self) -> Self {
53        Self {
54            eev1: self.eev1.clone(),
55            eev2: self.eev2.clone(),
56            eev3: self.eev3.clone(),
57            eev4: self.eev4.clone(),
58            eev5: self.eev5.clone(),
59            eev6: self.eev6.clone(),
60            eev7: self.eev7.clone(),
61            eev8: self.eev8.clone(),
62            eev9: self.eev9.clone(),
63            eev10: self.eev10.clone(),
64            #[cfg(feature = "hrtim_v2")]
65            event_counter_enable_bit: self.event_counter_enable_bit,
66            #[cfg(feature = "hrtim_v2")]
67            event_counter_reset_mode_bit: self.event_counter_reset_mode_bit,
68            #[cfg(feature = "hrtim_v2")]
69            event_counter_source_bits: self.event_counter_source_bits,
70            #[cfg(feature = "hrtim_v2")]
71            event_counter_threshold_bits: self.event_counter_threshold_bits,
72        }
73    }
74}
75
76pub struct EevCfg<TIM> {
77    _x: PhantomData<TIM>,
78    pub(crate) filter_bits: u8,
79    pub(crate) latch_bit: bool,
80}
81
82impl<TIM> Clone for EevCfg<TIM> {
83    fn clone(&self) -> Self {
84        Self {
85            _x: PhantomData,
86            filter_bits: self.filter_bits,
87            latch_bit: self.latch_bit,
88        }
89    }
90}
91
92impl<TIM> EevCfg<TIM> {
93    /// NOTE: This can not be set if eev is in fast mode AND using `EevCfg::latching`
94    pub fn filter(mut self, filter: EventFilter) -> Self {
95        self.filter_bits = filter as u8;
96        self
97    }
98
99    /// NOTE: This can not be set if eev is in fast mode AND using a `EevCfg::filter`
100    pub fn latching(mut self) -> Self {
101        self.latch_bit = true;
102        self
103    }
104}
105
106/// Note: Whenever a compare register is used for filtering, the value must be strictly above 0.
107pub enum EventFilter {
108    /// No filtering
109    None = 0b0000,
110
111    /// Blanking from reset/rollover to Cmp1
112    BlankingResetToCmp1 = 0b0001,
113
114    /// This depends on counter mode:
115    /// * Up-counting mode: Blanking from reset/rollover to Cmp2
116    /// * Up-down mode: Blanking from Cmp1 to Cmp2(only during up counting)
117    BlankingResetToCmp2OrCmp1ToCmp2InUdm = 0b0010,
118
119    /// Blanking from reset/rollover to Cmp3
120    BlankingResetToCmp3 = 0b0011,
121
122    /// This depends on counter mode:
123    /// * Up-counting mode: Blanking from reset/rollover to Cmp4
124    /// * Up-down mode: Blanking from Cmp3 to Cmp4(only during up counting)
125    BlankingResetToCmp4OrCmp3ToCmp4InUdm = 0b0100,
126
127    /// (RM 0440 table 226 'Filtering signals mapping per timer')
128    BlankingSource1 = 0b0101,
129
130    /// (RM 0440 table 226 'Filtering signals mapping per timer')
131    BlankingSource2 = 0b0110,
132
133    /// (RM 0440 table 226 'Filtering signals mapping per timer')
134    BlankingSource3 = 0b0111,
135
136    /// (RM 0440 table 226 'Filtering signals mapping per timer')
137    BlankingSource4 = 0b1000,
138
139    /// (RM 0440 table 226 'Filtering signals mapping per timer')
140    BlankingSource5 = 0b1001,
141
142    /// (RM 0440 table 226 'Filtering signals mapping per timer')
143    BlankingSource6 = 0b1010,
144
145    /// (RM 0440 table 226 'Filtering signals mapping per timer')
146    BlankingSource7 = 0b1011,
147
148    /// (RM 0440 table 226 'Filtering signals mapping per timer')
149    BlankingSource8 = 0b1100,
150
151    /// This depends on counter mode:
152    /// * Up-counting mode: Windowing from reset/rollover to Cmp2
153    /// * Up-down mode: Windowing from Cmp2 to Cmp3(only during up counting)
154    WindowingResetToCmp2OrCmp2ToCmp3InUdm = 0b1101,
155
156    /// This depends on counter mode:
157    /// * Up-counting mode: Windowing from reset/rollover to Cmp3
158    /// * Up-down mode: Windowing from Cmp2 to Cmp3(only during down counting)
159    WindowingResetToCmp3OrCmp2ToCmp3InUdm = 0b1110,
160
161    /// This depends on counter mode:
162    /// * Up-counting mode: Windowing from reset/rollover to other timer `TIMWIN`'s Cmp2 event
163    /// * Up-down mode: Windowing from other timer `TIMWIN`'s Cmp2 during up counting to Cmp3 during down counting
164    ///
165    /// `TIMWIN` (RM 0440 table 227 'Windowing signals mapping per timer'):
166    ///
167    /// | Destination |`TIMA`|`TIMB`|`TIMC`|`TIMD`|`TIME`|`TIMF`|
168    /// |-------------|------|------|------|------|------|------|
169    /// | TIMWIN      |`TIMB`|`TIMA`|`TIMD`|`TIMC`|`TIMF`|`TIME`|
170    WindowingResetToOtherCmp2OrCmp2UpToCmp3DownInUdm = 0b1111,
171}
172
173impl<TIM> Default for EevCfg<TIM> {
174    fn default() -> Self {
175        Self {
176            _x: PhantomData,
177            filter_bits: EventFilter::None as u8,
178            latch_bit: false,
179        }
180    }
181}
182
183impl<TIM> Default for EevCfgs<TIM> {
184    fn default() -> Self {
185        Self {
186            eev1: EevCfg::default(),
187            eev2: Default::default(),
188            eev3: Default::default(),
189            eev4: Default::default(),
190            eev5: Default::default(),
191            eev6: Default::default(),
192            eev7: Default::default(),
193            eev8: Default::default(),
194            eev9: Default::default(),
195            eev10: Default::default(),
196            #[cfg(feature = "hrtim_v2")]
197            event_counter_enable_bit: false,
198            #[cfg(feature = "hrtim_v2")]
199            event_counter_reset_mode_bit: false,
200            #[cfg(feature = "hrtim_v2")]
201            event_counter_source_bits: 0,
202            #[cfg(feature = "hrtim_v2")]
203            event_counter_threshold_bits: 0,
204        }
205    }
206}