diff options
Diffstat (limited to 'embassy-stm32/src/timer/mod.rs')
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 35 |
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; | |||
| 12 | pub mod one_pulse; | 12 | pub mod one_pulse; |
| 13 | pub mod pwm_input; | 13 | pub mod pwm_input; |
| 14 | pub mod qei; | 14 | pub mod qei; |
| 15 | pub mod ringbuffered; | ||
| 15 | pub mod simple_pwm; | 16 | pub mod simple_pwm; |
| 16 | 17 | ||
| 18 | use crate::dma::word::Word; | ||
| 19 | use crate::fmt::Debuggable; | ||
| 17 | use crate::interrupt; | 20 | use crate::interrupt; |
| 18 | use crate::rcc::RccPeripheral; | 21 | use 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)] |
| 242 | macro_rules! impl_core_timer { | 250 | macro_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 | ||
| 306 | foreach_interrupt! { | 313 | foreach_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> { | |||
| 399 | impl<T: CoreInstance> interrupt::typelevel::Handler<T::UpdateInterrupt> for UpdateInterruptHandler<T> { | 406 | impl<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 | ||
