aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreZio Pan <[email protected]>2024-03-26 01:05:38 +0800
committerDario Nieuwenhuis <[email protected]>2024-04-05 00:51:20 +0200
commit5dc3738bc2b4e1d8f9f77588ecab7956493b59de (patch)
tree5a3e961c832ccfa138744dfff215660972625135
parent78b9cb98d4afc9c2be67176b174255ba78170525 (diff)
add missing interrupt for timer
-rw-r--r--embassy-stm32/src/time_driver.rs10
-rw-r--r--embassy-stm32/src/timer/mod.rs105
2 files changed, 71 insertions, 44 deletions
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs
index a3fe9b275..a2e75020c 100644
--- a/embassy-stm32/src/time_driver.rs
+++ b/embassy-stm32/src/time_driver.rs
@@ -306,15 +306,15 @@ impl RtcDriver {
306 w.set_ccie(0, true); 306 w.set_ccie(0, true);
307 }); 307 });
308 308
309 <T as CoreInstance>::Interrupt::unpend(); 309 <T as CoreInstance>::UpdateInterrupt::unpend();
310 unsafe { <T as CoreInstance>::Interrupt::enable() }; 310 unsafe { <T as CoreInstance>::UpdateInterrupt::enable() };
311 311
312 #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] 312 #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))]
313 { 313 {
314 use crate::timer::AdvancedInstance4Channel; 314 use crate::timer::GeneralInstance1Channel;
315 <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::unpend(); 315 <T as GeneralInstance1Channel>::CaptureCompareInterrupt::unpend();
316 unsafe { 316 unsafe {
317 <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::enable(); 317 <T as GeneralInstance1Channel>::CaptureCompareInterrupt::enable();
318 } 318 }
319 } 319 }
320 320
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index b3d4fa284..346127005 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -47,8 +47,8 @@ pub enum TimerBits {
47 47
48/// Core timer instance. 48/// Core timer instance.
49pub trait CoreInstance: RccPeripheral + 'static { 49pub trait CoreInstance: RccPeripheral + 'static {
50 /// Interrupt for this timer. 50 /// Update Interrupt for this timer.
51 type Interrupt: interrupt::typelevel::Interrupt; 51 type UpdateInterrupt: interrupt::typelevel::Interrupt;
52 52
53 /// Amount of bits this timer has. 53 /// Amount of bits this timer has.
54 const BITS: TimerBits; 54 const BITS: TimerBits;
@@ -64,10 +64,16 @@ pub trait BasicNoCr2Instance: CoreInstance {}
64pub trait BasicInstance: BasicNoCr2Instance {} 64pub trait BasicInstance: BasicNoCr2Instance {}
65 65
66/// General-purpose 16-bit timer with 1 channel instance. 66/// General-purpose 16-bit timer with 1 channel instance.
67pub trait GeneralInstance1Channel: CoreInstance {} 67pub trait GeneralInstance1Channel: CoreInstance {
68 /// Capture compare interrupt for this timer.
69 type CaptureCompareInterrupt: interrupt::typelevel::Interrupt;
70}
68 71
69/// General-purpose 16-bit timer with 2 channels instance. 72/// General-purpose 16-bit timer with 2 channels instance.
70pub trait GeneralInstance2Channel: GeneralInstance1Channel {} 73pub trait GeneralInstance2Channel: GeneralInstance1Channel {
74 /// Trigger event interrupt for this timer.
75 type TriggerInterrupt: interrupt::typelevel::Interrupt;
76}
71 77
72// This trait add *extra* methods to GeneralInstance4Channel, 78// This trait add *extra* methods to GeneralInstance4Channel,
73// that GeneralInstance4Channel doesn't use, but the "AdvancedInstance"s need. 79// that GeneralInstance4Channel doesn't use, but the "AdvancedInstance"s need.
@@ -93,16 +99,18 @@ pub trait GeneralInstance4Channel: BasicInstance + GeneralInstance2Channel + Gen
93pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} 99pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {}
94 100
95/// Advanced 16-bit timer with 1 channel instance. 101/// Advanced 16-bit timer with 1 channel instance.
96pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel {} 102pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel {
103 /// Communication interrupt for this timer.
104 type CommunicationInterrupt: interrupt::typelevel::Interrupt;
105 /// Break input interrupt for this timer.
106 type BreakInputInterrupt: interrupt::typelevel::Interrupt;
107}
97/// Advanced 16-bit timer with 2 channels instance. 108/// Advanced 16-bit timer with 2 channels instance.
98 109
99pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {} 110pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {}
100 111
101/// Advanced 16-bit timer with 4 channels instance. 112/// Advanced 16-bit timer with 4 channels instance.
102pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel { 113pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {}
103 /// Capture compare interrupt for this timer.
104 type CaptureCompareInterrupt: interrupt::typelevel::Interrupt;
105}
106 114
107pin_trait!(Channel1Pin, GeneralInstance4Channel); 115pin_trait!(Channel1Pin, GeneralInstance4Channel);
108pin_trait!(Channel2Pin, GeneralInstance4Channel); 116pin_trait!(Channel2Pin, GeneralInstance4Channel);
@@ -136,7 +144,7 @@ dma_trait!(Ch4Dma, GeneralInstance4Channel);
136macro_rules! impl_core_timer { 144macro_rules! impl_core_timer {
137 ($inst:ident, $bits:expr) => { 145 ($inst:ident, $bits:expr) => {
138 impl CoreInstance for crate::peripherals::$inst { 146 impl CoreInstance for crate::peripherals::$inst {
139 type Interrupt = crate::_generated::peripheral_interrupts::$inst::UP; 147 type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP;
140 148
141 const BITS: TimerBits = $bits; 149 const BITS: TimerBits = $bits;
142 150
@@ -147,6 +155,34 @@ macro_rules! impl_core_timer {
147 }; 155 };
148} 156}
149 157
158#[allow(unused)]
159macro_rules! impl_general_1ch {
160 ($inst:ident) => {
161 impl GeneralInstance1Channel for crate::peripherals::$inst {
162 type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC;
163 }
164 };
165}
166
167#[allow(unused)]
168macro_rules! impl_general_2ch {
169 ($inst:ident) => {
170 impl GeneralInstance2Channel for crate::peripherals::$inst {
171 type TriggerInterrupt = crate::_generated::peripheral_interrupts::$inst::TRG;
172 }
173 };
174}
175
176#[allow(unused)]
177macro_rules! impl_advanced_1ch {
178 ($inst:ident) => {
179 impl AdvancedInstance1Channel for crate::peripherals::$inst {
180 type CommunicationInterrupt = crate::_generated::peripheral_interrupts::$inst::COM;
181 type BreakInputInterrupt = crate::_generated::peripheral_interrupts::$inst::BRK;
182 }
183 };
184}
185
150// This macro only apply to "AdvancedInstance(s)", 186// This macro only apply to "AdvancedInstance(s)",
151// not "GeneralInstance4Channel" itself. 187// not "GeneralInstance4Channel" itself.
152#[allow(unused)] 188#[allow(unused)]
@@ -162,15 +198,6 @@ macro_rules! impl_general_4ch_blank_sealed {
162 }; 198 };
163} 199}
164 200
165#[allow(unused)]
166macro_rules! impl_adv_4ch {
167 ($inst:ident) => {
168 impl AdvancedInstance4Channel for crate::peripherals::$inst {
169 type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC;
170 }
171 };
172}
173
174foreach_interrupt! { 201foreach_interrupt! {
175 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { 202 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => {
176 impl_core_timer!($inst, TimerBits::Bits16); 203 impl_core_timer!($inst, TimerBits::Bits16);
@@ -182,8 +209,8 @@ foreach_interrupt! {
182 impl_core_timer!($inst, TimerBits::Bits16); 209 impl_core_timer!($inst, TimerBits::Bits16);
183 impl BasicNoCr2Instance for crate::peripherals::$inst {} 210 impl BasicNoCr2Instance for crate::peripherals::$inst {}
184 impl BasicInstance for crate::peripherals::$inst {} 211 impl BasicInstance for crate::peripherals::$inst {}
185 impl GeneralInstance1Channel for crate::peripherals::$inst {} 212 impl_general_1ch!($inst);
186 impl GeneralInstance2Channel for crate::peripherals::$inst {} 213 impl_general_2ch!($inst);
187 impl GeneralInstance4Channel for crate::peripherals::$inst {} 214 impl GeneralInstance4Channel for crate::peripherals::$inst {}
188 impl General4ChBlankSealed for crate::peripherals::$inst {} 215 impl General4ChBlankSealed for crate::peripherals::$inst {}
189 }; 216 };
@@ -192,8 +219,8 @@ foreach_interrupt! {
192 impl_core_timer!($inst, TimerBits::Bits16); 219 impl_core_timer!($inst, TimerBits::Bits16);
193 impl BasicNoCr2Instance for crate::peripherals::$inst {} 220 impl BasicNoCr2Instance for crate::peripherals::$inst {}
194 impl BasicInstance for crate::peripherals::$inst {} 221 impl BasicInstance for crate::peripherals::$inst {}
195 impl GeneralInstance1Channel for crate::peripherals::$inst {} 222 impl_general_1ch!($inst);
196 impl GeneralInstance2Channel for crate::peripherals::$inst {} 223 impl_general_2ch!($inst);
197 impl GeneralInstance4Channel for crate::peripherals::$inst {} 224 impl GeneralInstance4Channel for crate::peripherals::$inst {}
198 impl General4ChBlankSealed for crate::peripherals::$inst {} 225 impl General4ChBlankSealed for crate::peripherals::$inst {}
199 }; 226 };
@@ -202,8 +229,8 @@ foreach_interrupt! {
202 impl_core_timer!($inst, TimerBits::Bits16); 229 impl_core_timer!($inst, TimerBits::Bits16);
203 impl BasicNoCr2Instance for crate::peripherals::$inst {} 230 impl BasicNoCr2Instance for crate::peripherals::$inst {}
204 impl BasicInstance for crate::peripherals::$inst {} 231 impl BasicInstance for crate::peripherals::$inst {}
205 impl GeneralInstance1Channel for crate::peripherals::$inst {} 232 impl_general_1ch!($inst);
206 impl GeneralInstance2Channel for crate::peripherals::$inst {} 233 impl_general_2ch!($inst);
207 impl GeneralInstance4Channel for crate::peripherals::$inst {} 234 impl GeneralInstance4Channel for crate::peripherals::$inst {}
208 impl General4ChBlankSealed for crate::peripherals::$inst {} 235 impl General4ChBlankSealed for crate::peripherals::$inst {}
209 }; 236 };
@@ -212,8 +239,8 @@ foreach_interrupt! {
212 impl_core_timer!($inst, TimerBits::Bits32); 239 impl_core_timer!($inst, TimerBits::Bits32);
213 impl BasicNoCr2Instance for crate::peripherals::$inst {} 240 impl BasicNoCr2Instance for crate::peripherals::$inst {}
214 impl BasicInstance for crate::peripherals::$inst {} 241 impl BasicInstance for crate::peripherals::$inst {}
215 impl GeneralInstance1Channel for crate::peripherals::$inst {} 242 impl_general_1ch!($inst);
216 impl GeneralInstance2Channel for crate::peripherals::$inst {} 243 impl_general_2ch!($inst);
217 impl GeneralInstance4Channel for crate::peripherals::$inst {} 244 impl GeneralInstance4Channel for crate::peripherals::$inst {}
218 impl GeneralInstance32bit4Channel for crate::peripherals::$inst {} 245 impl GeneralInstance32bit4Channel for crate::peripherals::$inst {}
219 impl General4ChBlankSealed for crate::peripherals::$inst {} 246 impl General4ChBlankSealed for crate::peripherals::$inst {}
@@ -223,38 +250,38 @@ foreach_interrupt! {
223 impl_core_timer!($inst, TimerBits::Bits16); 250 impl_core_timer!($inst, TimerBits::Bits16);
224 impl BasicNoCr2Instance for crate::peripherals::$inst {} 251 impl BasicNoCr2Instance for crate::peripherals::$inst {}
225 impl BasicInstance for crate::peripherals::$inst {} 252 impl BasicInstance for crate::peripherals::$inst {}
226 impl GeneralInstance1Channel for crate::peripherals::$inst {} 253 impl_general_1ch!($inst);
227 impl GeneralInstance2Channel for crate::peripherals::$inst {} 254 impl_general_2ch!($inst);
228 impl GeneralInstance4Channel for crate::peripherals::$inst {} 255 impl GeneralInstance4Channel for crate::peripherals::$inst {}
229 impl_general_4ch_blank_sealed!($inst); 256 impl_general_4ch_blank_sealed!($inst);
230 impl AdvancedInstance1Channel for crate::peripherals::$inst {} 257 impl_advanced_1ch!($inst);
231 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 258 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
232 impl_adv_4ch!($inst); 259 impl AdvancedInstance4Channel for crate::peripherals::$inst {}
233 }; 260 };
234 261
235 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { 262 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => {
236 impl_core_timer!($inst, TimerBits::Bits16); 263 impl_core_timer!($inst, TimerBits::Bits16);
237 impl BasicNoCr2Instance for crate::peripherals::$inst {} 264 impl BasicNoCr2Instance for crate::peripherals::$inst {}
238 impl BasicInstance for crate::peripherals::$inst {} 265 impl BasicInstance for crate::peripherals::$inst {}
239 impl GeneralInstance1Channel for crate::peripherals::$inst {} 266 impl_general_1ch!($inst);
240 impl GeneralInstance2Channel for crate::peripherals::$inst {} 267 impl_general_2ch!($inst);
241 impl GeneralInstance4Channel for crate::peripherals::$inst {} 268 impl GeneralInstance4Channel for crate::peripherals::$inst {}
242 impl_general_4ch_blank_sealed!($inst); 269 impl_general_4ch_blank_sealed!($inst);
243 impl AdvancedInstance1Channel for crate::peripherals::$inst {} 270 impl_advanced_1ch!($inst);
244 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 271 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
245 impl_adv_4ch!($inst); 272 impl AdvancedInstance4Channel for crate::peripherals::$inst {}
246 }; 273 };
247 274
248 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { 275 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => {
249 impl_core_timer!($inst, TimerBits::Bits16); 276 impl_core_timer!($inst, TimerBits::Bits16);
250 impl BasicNoCr2Instance for crate::peripherals::$inst {} 277 impl BasicNoCr2Instance for crate::peripherals::$inst {}
251 impl BasicInstance for crate::peripherals::$inst {} 278 impl BasicInstance for crate::peripherals::$inst {}
252 impl GeneralInstance1Channel for crate::peripherals::$inst {} 279 impl_general_1ch!($inst);
253 impl GeneralInstance2Channel for crate::peripherals::$inst {} 280 impl_general_2ch!($inst);
254 impl GeneralInstance4Channel for crate::peripherals::$inst {} 281 impl GeneralInstance4Channel for crate::peripherals::$inst {}
255 impl_general_4ch_blank_sealed!($inst); 282 impl_general_4ch_blank_sealed!($inst);
256 impl AdvancedInstance1Channel for crate::peripherals::$inst {} 283 impl_advanced_1ch!($inst);
257 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 284 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
258 impl_adv_4ch!($inst); 285 impl AdvancedInstance4Channel for crate::peripherals::$inst {}
259 }; 286 };
260} 287}