aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/timer/mod.rs
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-27 11:29:24 -0600
committerxoviat <[email protected]>2025-11-27 11:29:24 -0600
commit790940a18c093fb7c7f94585be81d7d02892b4fb (patch)
treec3f90441ca4b7581ede46240c3a8ccc2c4462a59 /embassy-stm32/src/timer/mod.rs
parentb8afe4ff5fd590903861e44224171f37b9ae6e62 (diff)
stm32: use typelevel timer type
Diffstat (limited to 'embassy-stm32/src/timer/mod.rs')
-rw-r--r--embassy-stm32/src/timer/mod.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index 3fa363881..74d1c9e77 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -15,6 +15,8 @@ pub mod qei;
15pub mod ringbuffered; 15pub mod ringbuffered;
16pub mod simple_pwm; 16pub mod simple_pwm;
17 17
18use crate::dma::word::Word;
19use crate::fmt::Debuggable;
18use crate::interrupt; 20use crate::interrupt;
19use crate::rcc::RccPeripheral; 21use crate::rcc::RccPeripheral;
20 22
@@ -163,7 +165,12 @@ pub trait CoreInstance: SealedInstance + 'static {
163 type UpdateInterrupt: interrupt::typelevel::Interrupt; 165 type UpdateInterrupt: interrupt::typelevel::Interrupt;
164 166
165 /// Amount of bits this timer has. 167 /// Amount of bits this timer has.
166 const BITS: TimerBits; 168 type Word: Word
169 + TryInto<u16, Error: Debuggable>
170 + From<u16>
171 + TryFrom<u32, Error: Debuggable>
172 + Into<u32>
173 + TryFrom<u64, Error: Debuggable>;
167 174
168 /// Registers for this timer. 175 /// Registers for this timer.
169 /// 176 ///
@@ -241,7 +248,7 @@ dma_trait!(Dma, GeneralInstance4Channel, TimerChannel);
241 248
242#[allow(unused)] 249#[allow(unused)]
243macro_rules! impl_core_timer { 250macro_rules! impl_core_timer {
244 ($inst:ident, $bits:expr) => { 251 ($inst:ident, $bits:ident) => {
245 impl SealedInstance for crate::peripherals::$inst { 252 impl SealedInstance for crate::peripherals::$inst {
246 fn state() -> &'static State { 253 fn state() -> &'static State {
247 static STATE: State = State::new(); 254 static STATE: State = State::new();
@@ -251,8 +258,7 @@ macro_rules! impl_core_timer {
251 258
252 impl CoreInstance for crate::peripherals::$inst { 259 impl CoreInstance for crate::peripherals::$inst {
253 type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP; 260 type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP;
254 261 type Word = $bits;
255 const BITS: TimerBits = $bits;
256 262
257 fn regs() -> *mut () { 263 fn regs() -> *mut () {
258 crate::pac::$inst.as_ptr() 264 crate::pac::$inst.as_ptr()
@@ -306,13 +312,13 @@ macro_rules! impl_general_4ch_blank_sealed {
306 312
307foreach_interrupt! { 313foreach_interrupt! {
308 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { 314 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => {
309 impl_core_timer!($inst, TimerBits::Bits16); 315 impl_core_timer!($inst, u16);
310 impl BasicNoCr2Instance for crate::peripherals::$inst {} 316 impl BasicNoCr2Instance for crate::peripherals::$inst {}
311 impl BasicInstance for crate::peripherals::$inst {} 317 impl BasicInstance for crate::peripherals::$inst {}
312 }; 318 };
313 319
314 ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => { 320 ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => {
315 impl_core_timer!($inst, TimerBits::Bits16); 321 impl_core_timer!($inst, u16);
316 impl BasicNoCr2Instance for crate::peripherals::$inst {} 322 impl BasicNoCr2Instance for crate::peripherals::$inst {}
317 impl BasicInstance for crate::peripherals::$inst {} 323 impl BasicInstance for crate::peripherals::$inst {}
318 impl_general_1ch!($inst); 324 impl_general_1ch!($inst);
@@ -322,7 +328,7 @@ foreach_interrupt! {
322 }; 328 };
323 329
324 ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { 330 ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => {
325 impl_core_timer!($inst, TimerBits::Bits16); 331 impl_core_timer!($inst, u16);
326 impl BasicNoCr2Instance for crate::peripherals::$inst {} 332 impl BasicNoCr2Instance for crate::peripherals::$inst {}
327 impl BasicInstance for crate::peripherals::$inst {} 333 impl BasicInstance for crate::peripherals::$inst {}
328 impl_general_1ch!($inst); 334 impl_general_1ch!($inst);
@@ -332,7 +338,7 @@ foreach_interrupt! {
332 }; 338 };
333 339
334 ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { 340 ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => {
335 impl_core_timer!($inst, TimerBits::Bits16); 341 impl_core_timer!($inst, u16);
336 impl BasicNoCr2Instance for crate::peripherals::$inst {} 342 impl BasicNoCr2Instance for crate::peripherals::$inst {}
337 impl BasicInstance for crate::peripherals::$inst {} 343 impl BasicInstance for crate::peripherals::$inst {}
338 impl_general_1ch!($inst); 344 impl_general_1ch!($inst);
@@ -342,7 +348,7 @@ foreach_interrupt! {
342 }; 348 };
343 349
344 ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { 350 ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => {
345 impl_core_timer!($inst, TimerBits::Bits32); 351 impl_core_timer!($inst, u32);
346 impl BasicNoCr2Instance for crate::peripherals::$inst {} 352 impl BasicNoCr2Instance for crate::peripherals::$inst {}
347 impl BasicInstance for crate::peripherals::$inst {} 353 impl BasicInstance for crate::peripherals::$inst {}
348 impl_general_1ch!($inst); 354 impl_general_1ch!($inst);
@@ -353,7 +359,7 @@ foreach_interrupt! {
353 }; 359 };
354 360
355 ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { 361 ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => {
356 impl_core_timer!($inst, TimerBits::Bits16); 362 impl_core_timer!($inst, u16);
357 impl BasicNoCr2Instance for crate::peripherals::$inst {} 363 impl BasicNoCr2Instance for crate::peripherals::$inst {}
358 impl BasicInstance for crate::peripherals::$inst {} 364 impl BasicInstance for crate::peripherals::$inst {}
359 impl_general_1ch!($inst); 365 impl_general_1ch!($inst);
@@ -366,7 +372,7 @@ foreach_interrupt! {
366 }; 372 };
367 373
368 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { 374 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => {
369 impl_core_timer!($inst, TimerBits::Bits16); 375 impl_core_timer!($inst, u16);
370 impl BasicNoCr2Instance for crate::peripherals::$inst {} 376 impl BasicNoCr2Instance for crate::peripherals::$inst {}
371 impl BasicInstance for crate::peripherals::$inst {} 377 impl BasicInstance for crate::peripherals::$inst {}
372 impl_general_1ch!($inst); 378 impl_general_1ch!($inst);
@@ -379,7 +385,7 @@ foreach_interrupt! {
379 }; 385 };
380 386
381 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { 387 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => {
382 impl_core_timer!($inst, TimerBits::Bits16); 388 impl_core_timer!($inst, u16);
383 impl BasicNoCr2Instance for crate::peripherals::$inst {} 389 impl BasicNoCr2Instance for crate::peripherals::$inst {}
384 impl BasicInstance for crate::peripherals::$inst {} 390 impl BasicInstance for crate::peripherals::$inst {}
385 impl_general_1ch!($inst); 391 impl_general_1ch!($inst);