aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/timer/mod.rs
diff options
context:
space:
mode:
authorRaul Alimbekov <[email protected]>2025-12-16 09:05:22 +0300
committerGitHub <[email protected]>2025-12-16 09:05:22 +0300
commitc9a04b4b732b7a3b696eb8223664c1a7942b1875 (patch)
tree6dbe5c02e66eed8d8762f13f95afd24f8db2b38c /embassy-stm32/src/timer/mod.rs
parentcde24a3ef1117653ba5ed4184102b33f745782fb (diff)
parent5ae6e060ec1c90561719aabdc29d5b6e7b8b0a82 (diff)
Merge branch 'main' into main
Diffstat (limited to 'embassy-stm32/src/timer/mod.rs')
-rw-r--r--embassy-stm32/src/timer/mod.rs35
1 files changed, 21 insertions, 14 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index b09bc7166..998e3a6f4 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -12,8 +12,11 @@ pub mod low_level;
12pub mod one_pulse; 12pub mod one_pulse;
13pub mod pwm_input; 13pub mod pwm_input;
14pub mod qei; 14pub mod qei;
15pub mod ringbuffered;
15pub mod simple_pwm; 16pub mod simple_pwm;
16 17
18use crate::dma::word::Word;
19use crate::fmt::Debuggable;
17use crate::interrupt; 20use crate::interrupt;
18use crate::rcc::RccPeripheral; 21use crate::rcc::RccPeripheral;
19 22
@@ -162,7 +165,12 @@ pub trait CoreInstance: SealedInstance + 'static {
162 type UpdateInterrupt: interrupt::typelevel::Interrupt; 165 type UpdateInterrupt: interrupt::typelevel::Interrupt;
163 166
164 /// Amount of bits this timer has. 167 /// Amount of bits this timer has.
165 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>;
166 174
167 /// Registers for this timer. 175 /// Registers for this timer.
168 /// 176 ///
@@ -240,7 +248,7 @@ dma_trait!(Dma, GeneralInstance4Channel, TimerChannel);
240 248
241#[allow(unused)] 249#[allow(unused)]
242macro_rules! impl_core_timer { 250macro_rules! impl_core_timer {
243 ($inst:ident, $bits:expr) => { 251 ($inst:ident, $bits:ident) => {
244 impl SealedInstance for crate::peripherals::$inst { 252 impl SealedInstance for crate::peripherals::$inst {
245 fn state() -> &'static State { 253 fn state() -> &'static State {
246 static STATE: State = State::new(); 254 static STATE: State = State::new();
@@ -250,8 +258,7 @@ macro_rules! impl_core_timer {
250 258
251 impl CoreInstance for crate::peripherals::$inst { 259 impl CoreInstance for crate::peripherals::$inst {
252 type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP; 260 type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP;
253 261 type Word = $bits;
254 const BITS: TimerBits = $bits;
255 262
256 fn regs() -> *mut () { 263 fn regs() -> *mut () {
257 crate::pac::$inst.as_ptr() 264 crate::pac::$inst.as_ptr()
@@ -305,13 +312,13 @@ macro_rules! impl_general_4ch_blank_sealed {
305 312
306foreach_interrupt! { 313foreach_interrupt! {
307 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { 314 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => {
308 impl_core_timer!($inst, TimerBits::Bits16); 315 impl_core_timer!($inst, u16);
309 impl BasicNoCr2Instance for crate::peripherals::$inst {} 316 impl BasicNoCr2Instance for crate::peripherals::$inst {}
310 impl BasicInstance for crate::peripherals::$inst {} 317 impl BasicInstance for crate::peripherals::$inst {}
311 }; 318 };
312 319
313 ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => { 320 ($inst:ident, timer, TIM_1CH, UP, $irq:ident) => {
314 impl_core_timer!($inst, TimerBits::Bits16); 321 impl_core_timer!($inst, u16);
315 impl BasicNoCr2Instance for crate::peripherals::$inst {} 322 impl BasicNoCr2Instance for crate::peripherals::$inst {}
316 impl BasicInstance for crate::peripherals::$inst {} 323 impl BasicInstance for crate::peripherals::$inst {}
317 impl_general_1ch!($inst); 324 impl_general_1ch!($inst);
@@ -321,7 +328,7 @@ foreach_interrupt! {
321 }; 328 };
322 329
323 ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { 330 ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => {
324 impl_core_timer!($inst, TimerBits::Bits16); 331 impl_core_timer!($inst, u16);
325 impl BasicNoCr2Instance for crate::peripherals::$inst {} 332 impl BasicNoCr2Instance for crate::peripherals::$inst {}
326 impl BasicInstance for crate::peripherals::$inst {} 333 impl BasicInstance for crate::peripherals::$inst {}
327 impl_general_1ch!($inst); 334 impl_general_1ch!($inst);
@@ -331,7 +338,7 @@ foreach_interrupt! {
331 }; 338 };
332 339
333 ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { 340 ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => {
334 impl_core_timer!($inst, TimerBits::Bits16); 341 impl_core_timer!($inst, u16);
335 impl BasicNoCr2Instance for crate::peripherals::$inst {} 342 impl BasicNoCr2Instance for crate::peripherals::$inst {}
336 impl BasicInstance for crate::peripherals::$inst {} 343 impl BasicInstance for crate::peripherals::$inst {}
337 impl_general_1ch!($inst); 344 impl_general_1ch!($inst);
@@ -341,7 +348,7 @@ foreach_interrupt! {
341 }; 348 };
342 349
343 ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { 350 ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => {
344 impl_core_timer!($inst, TimerBits::Bits32); 351 impl_core_timer!($inst, u32);
345 impl BasicNoCr2Instance for crate::peripherals::$inst {} 352 impl BasicNoCr2Instance for crate::peripherals::$inst {}
346 impl BasicInstance for crate::peripherals::$inst {} 353 impl BasicInstance for crate::peripherals::$inst {}
347 impl_general_1ch!($inst); 354 impl_general_1ch!($inst);
@@ -352,7 +359,7 @@ foreach_interrupt! {
352 }; 359 };
353 360
354 ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { 361 ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => {
355 impl_core_timer!($inst, TimerBits::Bits16); 362 impl_core_timer!($inst, u16);
356 impl BasicNoCr2Instance for crate::peripherals::$inst {} 363 impl BasicNoCr2Instance for crate::peripherals::$inst {}
357 impl BasicInstance for crate::peripherals::$inst {} 364 impl BasicInstance for crate::peripherals::$inst {}
358 impl_general_1ch!($inst); 365 impl_general_1ch!($inst);
@@ -365,7 +372,7 @@ foreach_interrupt! {
365 }; 372 };
366 373
367 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { 374 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => {
368 impl_core_timer!($inst, TimerBits::Bits16); 375 impl_core_timer!($inst, u16);
369 impl BasicNoCr2Instance for crate::peripherals::$inst {} 376 impl BasicNoCr2Instance for crate::peripherals::$inst {}
370 impl BasicInstance for crate::peripherals::$inst {} 377 impl BasicInstance for crate::peripherals::$inst {}
371 impl_general_1ch!($inst); 378 impl_general_1ch!($inst);
@@ -378,7 +385,7 @@ foreach_interrupt! {
378 }; 385 };
379 386
380 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { 387 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => {
381 impl_core_timer!($inst, TimerBits::Bits16); 388 impl_core_timer!($inst, u16);
382 impl BasicNoCr2Instance for crate::peripherals::$inst {} 389 impl BasicNoCr2Instance for crate::peripherals::$inst {}
383 impl BasicInstance for crate::peripherals::$inst {} 390 impl BasicInstance for crate::peripherals::$inst {}
384 impl_general_1ch!($inst); 391 impl_general_1ch!($inst);
@@ -399,7 +406,7 @@ pub struct UpdateInterruptHandler<T: CoreInstance> {
399impl<T: CoreInstance> interrupt::typelevel::Handler<T::UpdateInterrupt> for UpdateInterruptHandler<T> { 406impl<T: CoreInstance> interrupt::typelevel::Handler<T::UpdateInterrupt> for UpdateInterruptHandler<T> {
400 unsafe fn on_interrupt() { 407 unsafe fn on_interrupt() {
401 #[cfg(feature = "low-power")] 408 #[cfg(feature = "low-power")]
402 crate::low_power::on_wakeup_irq(); 409 crate::low_power::Executor::on_wakeup_irq_or_event();
403 410
404 let regs = crate::pac::timer::TimCore::from_ptr(T::regs()); 411 let regs = crate::pac::timer::TimCore::from_ptr(T::regs());
405 412
@@ -429,7 +436,7 @@ impl<T: GeneralInstance1Channel> interrupt::typelevel::Handler<T::CaptureCompare
429{ 436{
430 unsafe fn on_interrupt() { 437 unsafe fn on_interrupt() {
431 #[cfg(feature = "low-power")] 438 #[cfg(feature = "low-power")]
432 crate::low_power::on_wakeup_irq(); 439 crate::low_power::Executor::on_wakeup_irq_or_event();
433 440
434 let regs = crate::pac::timer::TimGp16::from_ptr(T::regs()); 441 let regs = crate::pac::timer::TimGp16::from_ptr(T::regs());
435 442