aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/timer/mod.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-09-05 23:00:31 +0200
committerDario Nieuwenhuis <[email protected]>2025-09-05 23:00:31 +0200
commit7419b398bf7cc5c1ff164c504f4a4027cd6bcd3b (patch)
tree9ea26e1059b70502d0e5929a72a9f50c8c43838b /embassy-stm32/src/timer/mod.rs
parenta6562c4f033432e40970aafe82f33c5138adf84e (diff)
stm32/afio: use type inference for timer remaps as well.
Diffstat (limited to 'embassy-stm32/src/timer/mod.rs')
-rw-r--r--embassy-stm32/src/timer/mod.rs43
1 files changed, 7 insertions, 36 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index 38f4a1a51..b09bc7166 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -14,8 +14,6 @@ pub mod pwm_input;
14pub mod qei; 14pub mod qei;
15pub mod simple_pwm; 15pub mod simple_pwm;
16 16
17#[cfg(afio)]
18use crate::gpio::SealedPin;
19use crate::interrupt; 17use crate::interrupt;
20use crate::rcc::RccPeripheral; 18use crate::rcc::RccPeripheral;
21 19
@@ -157,15 +155,9 @@ trait SealedInstance: RccPeripheral + PeripheralType {
157 fn state() -> &'static State; 155 fn state() -> &'static State;
158} 156}
159 157
160#[allow(unused)]
161pub(crate) trait Afio {
162 fn afio_mappings() -> &'static [AfioMapping];
163 fn set_afio(value: u8);
164}
165
166/// Core timer instance. 158/// Core timer instance.
167#[allow(private_bounds)] 159#[allow(private_bounds)]
168pub trait CoreInstance: SealedInstance + Afio + 'static { 160pub trait CoreInstance: SealedInstance + 'static {
169 /// Update Interrupt for this timer. 161 /// Update Interrupt for this timer.
170 type UpdateInterrupt: interrupt::typelevel::Interrupt; 162 type UpdateInterrupt: interrupt::typelevel::Interrupt;
171 163
@@ -231,15 +223,15 @@ pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + Ad
231/// Advanced 16-bit timer with 4 channels instance. 223/// Advanced 16-bit timer with 4 channels instance.
232pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} 224pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {}
233 225
234pin_trait!(TimerPin, GeneralInstance4Channel, TimerChannel); 226pin_trait!(TimerPin, GeneralInstance4Channel, TimerChannel, @A);
235pin_trait!(ExternalTriggerPin, GeneralInstance4Channel); 227pin_trait!(ExternalTriggerPin, GeneralInstance4Channel, @A);
236 228
237pin_trait!(TimerComplementaryPin, AdvancedInstance4Channel, TimerChannel); 229pin_trait!(TimerComplementaryPin, AdvancedInstance4Channel, TimerChannel, @A);
238 230
239pin_trait!(BreakInputPin, AdvancedInstance4Channel, BreakInput); 231pin_trait!(BreakInputPin, AdvancedInstance4Channel, BreakInput, @A);
240 232
241pin_trait!(BreakInputComparator1Pin, AdvancedInstance4Channel, BreakInput); 233pin_trait!(BreakInputComparator1Pin, AdvancedInstance4Channel, BreakInput, @A);
242pin_trait!(BreakInputComparator2Pin, AdvancedInstance4Channel, BreakInput); 234pin_trait!(BreakInputComparator2Pin, AdvancedInstance4Channel, BreakInput, @A);
243 235
244// Update Event trigger DMA for every timer 236// Update Event trigger DMA for every timer
245dma_trait!(UpDma, BasicInstance); 237dma_trait!(UpDma, BasicInstance);
@@ -458,24 +450,3 @@ impl<T: GeneralInstance1Channel> interrupt::typelevel::Handler<T::CaptureCompare
458 } 450 }
459 } 451 }
460} 452}
461
462#[allow(unused)]
463pub(crate) struct AfioMapping {
464 pub(crate) value: u8,
465 pub(crate) pins: &'static [u8],
466}
467
468#[cfg(afio)]
469fn set_afio<'d, T: Afio>(pins: &[Option<embassy_hal_internal::Peri<'d, crate::gpio::AnyPin>>]) {
470 let mapping = T::afio_mappings()
471 .iter()
472 .find(|m| {
473 pins.iter()
474 .flatten()
475 .map(|p| (*p).pin_port())
476 .all(|p| m.pins.contains(&p))
477 })
478 .expect("Should be called with a combination of timer pins supported by the hardware");
479
480 T::set_afio(mapping.value);
481}