diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-04-04 23:04:38 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-04-04 23:04:38 +0000 |
| commit | 9d0b682b2d11cc4c194fc4cff8c3edfd459e1ef8 (patch) | |
| tree | 277c7a59f7c811d0e2b0de9b660570f1f142d91e | |
| parent | 8294bbc99d641a66c716a8e670247249a0f73d79 (diff) | |
| parent | 3d7d3e028601ca05e58d82b8efc72b40855def86 (diff) | |
Merge pull request #2735 from eZioPan/stm32-timer-api-leak
stm32: fix timer api leaking
| -rw-r--r-- | embassy-stm32/src/time_driver.rs | 45 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 135 |
2 files changed, 115 insertions, 65 deletions
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs index cc8161276..e592fbf7d 100644 --- a/embassy-stm32/src/time_driver.rs +++ b/embassy-stm32/src/time_driver.rs | |||
| @@ -15,9 +15,7 @@ use crate::pac::timer::vals; | |||
| 15 | use crate::rcc::SealedRccPeripheral; | 15 | use crate::rcc::SealedRccPeripheral; |
| 16 | #[cfg(feature = "low-power")] | 16 | #[cfg(feature = "low-power")] |
| 17 | use crate::rtc::Rtc; | 17 | use crate::rtc::Rtc; |
| 18 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] | 18 | use crate::timer::{CoreInstance, GeneralInstance1Channel}; |
| 19 | use crate::timer::AdvancedInstance1Channel; | ||
| 20 | use crate::timer::CoreInstance; | ||
| 21 | use crate::{interrupt, peripherals}; | 19 | use crate::{interrupt, peripherals}; |
| 22 | 20 | ||
| 23 | // NOTE regarding ALARM_COUNT: | 21 | // NOTE regarding ALARM_COUNT: |
| @@ -69,7 +67,7 @@ type T = peripherals::TIM23; | |||
| 69 | type T = peripherals::TIM24; | 67 | type T = peripherals::TIM24; |
| 70 | 68 | ||
| 71 | foreach_interrupt! { | 69 | foreach_interrupt! { |
| 72 | (TIM1, timer, $block:ident, UP, $irq:ident) => { | 70 | (TIM1, timer, $block:ident, CC, $irq:ident) => { |
| 73 | #[cfg(time_driver_tim1)] | 71 | #[cfg(time_driver_tim1)] |
| 74 | #[cfg(feature = "rt")] | 72 | #[cfg(feature = "rt")] |
| 75 | #[interrupt] | 73 | #[interrupt] |
| @@ -85,7 +83,7 @@ foreach_interrupt! { | |||
| 85 | DRIVER.on_interrupt() | 83 | DRIVER.on_interrupt() |
| 86 | } | 84 | } |
| 87 | }; | 85 | }; |
| 88 | (TIM2, timer, $block:ident, UP, $irq:ident) => { | 86 | (TIM2, timer, $block:ident, CC, $irq:ident) => { |
| 89 | #[cfg(time_driver_tim2)] | 87 | #[cfg(time_driver_tim2)] |
| 90 | #[cfg(feature = "rt")] | 88 | #[cfg(feature = "rt")] |
| 91 | #[interrupt] | 89 | #[interrupt] |
| @@ -93,7 +91,7 @@ foreach_interrupt! { | |||
| 93 | DRIVER.on_interrupt() | 91 | DRIVER.on_interrupt() |
| 94 | } | 92 | } |
| 95 | }; | 93 | }; |
| 96 | (TIM3, timer, $block:ident, UP, $irq:ident) => { | 94 | (TIM3, timer, $block:ident, CC, $irq:ident) => { |
| 97 | #[cfg(time_driver_tim3)] | 95 | #[cfg(time_driver_tim3)] |
| 98 | #[cfg(feature = "rt")] | 96 | #[cfg(feature = "rt")] |
| 99 | #[interrupt] | 97 | #[interrupt] |
| @@ -101,7 +99,7 @@ foreach_interrupt! { | |||
| 101 | DRIVER.on_interrupt() | 99 | DRIVER.on_interrupt() |
| 102 | } | 100 | } |
| 103 | }; | 101 | }; |
| 104 | (TIM4, timer, $block:ident, UP, $irq:ident) => { | 102 | (TIM4, timer, $block:ident, CC, $irq:ident) => { |
| 105 | #[cfg(time_driver_tim4)] | 103 | #[cfg(time_driver_tim4)] |
| 106 | #[cfg(feature = "rt")] | 104 | #[cfg(feature = "rt")] |
| 107 | #[interrupt] | 105 | #[interrupt] |
| @@ -109,7 +107,7 @@ foreach_interrupt! { | |||
| 109 | DRIVER.on_interrupt() | 107 | DRIVER.on_interrupt() |
| 110 | } | 108 | } |
| 111 | }; | 109 | }; |
| 112 | (TIM5, timer, $block:ident, UP, $irq:ident) => { | 110 | (TIM5, timer, $block:ident, CC, $irq:ident) => { |
| 113 | #[cfg(time_driver_tim5)] | 111 | #[cfg(time_driver_tim5)] |
| 114 | #[cfg(feature = "rt")] | 112 | #[cfg(feature = "rt")] |
| 115 | #[interrupt] | 113 | #[interrupt] |
| @@ -117,7 +115,7 @@ foreach_interrupt! { | |||
| 117 | DRIVER.on_interrupt() | 115 | DRIVER.on_interrupt() |
| 118 | } | 116 | } |
| 119 | }; | 117 | }; |
| 120 | (TIM8, timer, $block:ident, UP, $irq:ident) => { | 118 | (TIM8, timer, $block:ident, CC, $irq:ident) => { |
| 121 | #[cfg(time_driver_tim8)] | 119 | #[cfg(time_driver_tim8)] |
| 122 | #[cfg(feature = "rt")] | 120 | #[cfg(feature = "rt")] |
| 123 | #[interrupt] | 121 | #[interrupt] |
| @@ -133,7 +131,7 @@ foreach_interrupt! { | |||
| 133 | DRIVER.on_interrupt() | 131 | DRIVER.on_interrupt() |
| 134 | } | 132 | } |
| 135 | }; | 133 | }; |
| 136 | (TIM9, timer, $block:ident, UP, $irq:ident) => { | 134 | (TIM9, timer, $block:ident, CC, $irq:ident) => { |
| 137 | #[cfg(time_driver_tim9)] | 135 | #[cfg(time_driver_tim9)] |
| 138 | #[cfg(feature = "rt")] | 136 | #[cfg(feature = "rt")] |
| 139 | #[interrupt] | 137 | #[interrupt] |
| @@ -141,7 +139,7 @@ foreach_interrupt! { | |||
| 141 | DRIVER.on_interrupt() | 139 | DRIVER.on_interrupt() |
| 142 | } | 140 | } |
| 143 | }; | 141 | }; |
| 144 | (TIM12, timer, $block:ident, UP, $irq:ident) => { | 142 | (TIM12, timer, $block:ident, CC, $irq:ident) => { |
| 145 | #[cfg(time_driver_tim12)] | 143 | #[cfg(time_driver_tim12)] |
| 146 | #[cfg(feature = "rt")] | 144 | #[cfg(feature = "rt")] |
| 147 | #[interrupt] | 145 | #[interrupt] |
| @@ -149,7 +147,7 @@ foreach_interrupt! { | |||
| 149 | DRIVER.on_interrupt() | 147 | DRIVER.on_interrupt() |
| 150 | } | 148 | } |
| 151 | }; | 149 | }; |
| 152 | (TIM15, timer, $block:ident, UP, $irq:ident) => { | 150 | (TIM15, timer, $block:ident, CC, $irq:ident) => { |
| 153 | #[cfg(time_driver_tim15)] | 151 | #[cfg(time_driver_tim15)] |
| 154 | #[cfg(feature = "rt")] | 152 | #[cfg(feature = "rt")] |
| 155 | #[interrupt] | 153 | #[interrupt] |
| @@ -157,7 +155,7 @@ foreach_interrupt! { | |||
| 157 | DRIVER.on_interrupt() | 155 | DRIVER.on_interrupt() |
| 158 | } | 156 | } |
| 159 | }; | 157 | }; |
| 160 | (TIM20, timer, $block:ident, UP, $irq:ident) => { | 158 | (TIM20, timer, $block:ident, CC, $irq:ident) => { |
| 161 | #[cfg(time_driver_tim20)] | 159 | #[cfg(time_driver_tim20)] |
| 162 | #[cfg(feature = "rt")] | 160 | #[cfg(feature = "rt")] |
| 163 | #[interrupt] | 161 | #[interrupt] |
| @@ -173,7 +171,7 @@ foreach_interrupt! { | |||
| 173 | DRIVER.on_interrupt() | 171 | DRIVER.on_interrupt() |
| 174 | } | 172 | } |
| 175 | }; | 173 | }; |
| 176 | (TIM21, timer, $block:ident, UP, $irq:ident) => { | 174 | (TIM21, timer, $block:ident, CC, $irq:ident) => { |
| 177 | #[cfg(time_driver_tim21)] | 175 | #[cfg(time_driver_tim21)] |
| 178 | #[cfg(feature = "rt")] | 176 | #[cfg(feature = "rt")] |
| 179 | #[interrupt] | 177 | #[interrupt] |
| @@ -181,7 +179,7 @@ foreach_interrupt! { | |||
| 181 | DRIVER.on_interrupt() | 179 | DRIVER.on_interrupt() |
| 182 | } | 180 | } |
| 183 | }; | 181 | }; |
| 184 | (TIM22, timer, $block:ident, UP, $irq:ident) => { | 182 | (TIM22, timer, $block:ident, CC, $irq:ident) => { |
| 185 | #[cfg(time_driver_tim22)] | 183 | #[cfg(time_driver_tim22)] |
| 186 | #[cfg(feature = "rt")] | 184 | #[cfg(feature = "rt")] |
| 187 | #[interrupt] | 185 | #[interrupt] |
| @@ -189,7 +187,7 @@ foreach_interrupt! { | |||
| 189 | DRIVER.on_interrupt() | 187 | DRIVER.on_interrupt() |
| 190 | } | 188 | } |
| 191 | }; | 189 | }; |
| 192 | (TIM23, timer, $block:ident, UP, $irq:ident) => { | 190 | (TIM23, timer, $block:ident, CC, $irq:ident) => { |
| 193 | #[cfg(time_driver_tim23)] | 191 | #[cfg(time_driver_tim23)] |
| 194 | #[cfg(feature = "rt")] | 192 | #[cfg(feature = "rt")] |
| 195 | #[interrupt] | 193 | #[interrupt] |
| @@ -197,7 +195,7 @@ foreach_interrupt! { | |||
| 197 | DRIVER.on_interrupt() | 195 | DRIVER.on_interrupt() |
| 198 | } | 196 | } |
| 199 | }; | 197 | }; |
| 200 | (TIM24, timer, $block:ident, UP, $irq:ident) => { | 198 | (TIM24, timer, $block:ident, CC, $irq:ident) => { |
| 201 | #[cfg(time_driver_tim24)] | 199 | #[cfg(time_driver_tim24)] |
| 202 | #[cfg(feature = "rt")] | 200 | #[cfg(feature = "rt")] |
| 203 | #[interrupt] | 201 | #[interrupt] |
| @@ -263,6 +261,7 @@ pub(crate) struct RtcDriver { | |||
| 263 | rtc: Mutex<CriticalSectionRawMutex, Cell<Option<&'static Rtc>>>, | 261 | rtc: Mutex<CriticalSectionRawMutex, Cell<Option<&'static Rtc>>>, |
| 264 | } | 262 | } |
| 265 | 263 | ||
| 264 | #[allow(clippy::declare_interior_mutable_const)] | ||
| 266 | const ALARM_STATE_NEW: AlarmState = AlarmState::new(); | 265 | const ALARM_STATE_NEW: AlarmState = AlarmState::new(); |
| 267 | 266 | ||
| 268 | embassy_time_driver::time_driver_impl!(static DRIVER: RtcDriver = RtcDriver { | 267 | embassy_time_driver::time_driver_impl!(static DRIVER: RtcDriver = RtcDriver { |
| @@ -307,16 +306,8 @@ impl RtcDriver { | |||
| 307 | w.set_ccie(0, true); | 306 | w.set_ccie(0, true); |
| 308 | }); | 307 | }); |
| 309 | 308 | ||
| 310 | <T as CoreInstance>::Interrupt::unpend(); | 309 | <T as GeneralInstance1Channel>::CaptureCompareInterrupt::unpend(); |
| 311 | unsafe { <T as CoreInstance>::Interrupt::enable() }; | 310 | unsafe { <T as GeneralInstance1Channel>::CaptureCompareInterrupt::enable() }; |
| 312 | |||
| 313 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] | ||
| 314 | { | ||
| 315 | <T as AdvancedInstance1Channel>::CaptureCompareInterrupt::unpend(); | ||
| 316 | unsafe { | ||
| 317 | <T as AdvancedInstance1Channel>::CaptureCompareInterrupt::enable(); | ||
| 318 | } | ||
| 319 | } | ||
| 320 | 311 | ||
| 321 | r.cr1().modify(|w| w.set_cen(true)); | 312 | r.cr1().modify(|w| w.set_cen(true)); |
| 322 | } | 313 | } |
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs index 2ba6b3f11..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. |
| 49 | pub trait CoreInstance: RccPeripheral + 'static { | 49 | pub 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,29 +64,46 @@ pub trait BasicNoCr2Instance: CoreInstance {} | |||
| 64 | pub trait BasicInstance: BasicNoCr2Instance {} | 64 | pub 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. |
| 67 | pub trait GeneralInstance1Channel: CoreInstance {} | 67 | pub 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. |
| 70 | pub trait GeneralInstance2Channel: GeneralInstance1Channel {} | 73 | pub trait GeneralInstance2Channel: GeneralInstance1Channel { |
| 74 | /// Trigger event interrupt for this timer. | ||
| 75 | type TriggerInterrupt: interrupt::typelevel::Interrupt; | ||
| 76 | } | ||
| 71 | 77 | ||
| 72 | /// General-purpose 16-bit timer with 4 channels instance. | 78 | // This trait add *extra* methods to GeneralInstance4Channel, |
| 73 | pub trait GeneralInstance4Channel: BasicInstance + GeneralInstance2Channel { | 79 | // that GeneralInstance4Channel doesn't use, but the "AdvancedInstance"s need. |
| 80 | // And it's a private trait, so it's content won't leak to outer namespace. | ||
| 81 | // | ||
| 82 | // If you want to add a new method to it, please leave a detail comment to explain it. | ||
| 83 | trait General4ChBlankSealed { | ||
| 74 | // SimplePwm<'d, T> is implemented for T: GeneralInstance4Channel | 84 | // SimplePwm<'d, T> is implemented for T: GeneralInstance4Channel |
| 75 | // Advanced timers implement this trait, but the output needs to be | 85 | // Advanced timers implement this trait, but the output needs to be |
| 76 | // enabled explicitly. | 86 | // enabled explicitly. |
| 77 | // To support general-purpose and advanced timers, this function is added | 87 | // To support general-purpose and advanced timers, this function is added |
| 78 | // here defaulting to noop and overwritten for advanced timers. | 88 | // here defaulting to noop and overwritten for advanced timers. |
| 79 | /// Enable timer outputs. | 89 | // |
| 90 | // Enable timer outputs. | ||
| 80 | fn enable_outputs(&self) {} | 91 | fn enable_outputs(&self) {} |
| 81 | } | 92 | } |
| 82 | 93 | ||
| 94 | /// General-purpose 16-bit timer with 4 channels instance. | ||
| 95 | #[allow(private_bounds)] | ||
| 96 | pub trait GeneralInstance4Channel: BasicInstance + GeneralInstance2Channel + General4ChBlankSealed {} | ||
| 97 | |||
| 83 | /// General-purpose 32-bit timer with 4 channels instance. | 98 | /// General-purpose 32-bit timer with 4 channels instance. |
| 84 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} | 99 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} |
| 85 | 100 | ||
| 86 | /// Advanced 16-bit timer with 1 channel instance. | 101 | /// Advanced 16-bit timer with 1 channel instance. |
| 87 | pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { | 102 | pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { |
| 88 | /// Capture compare interrupt for this timer. | 103 | /// Communication interrupt for this timer. |
| 89 | type CaptureCompareInterrupt: interrupt::typelevel::Interrupt; | 104 | type CommunicationInterrupt: interrupt::typelevel::Interrupt; |
| 105 | /// Break input interrupt for this timer. | ||
| 106 | type BreakInputInterrupt: interrupt::typelevel::Interrupt; | ||
| 90 | } | 107 | } |
| 91 | /// Advanced 16-bit timer with 2 channels instance. | 108 | /// Advanced 16-bit timer with 2 channels instance. |
| 92 | 109 | ||
| @@ -127,7 +144,7 @@ dma_trait!(Ch4Dma, GeneralInstance4Channel); | |||
| 127 | macro_rules! impl_core_timer { | 144 | macro_rules! impl_core_timer { |
| 128 | ($inst:ident, $bits:expr) => { | 145 | ($inst:ident, $bits:expr) => { |
| 129 | impl CoreInstance for crate::peripherals::$inst { | 146 | impl CoreInstance for crate::peripherals::$inst { |
| 130 | type Interrupt = crate::_generated::peripheral_interrupts::$inst::UP; | 147 | type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP; |
| 131 | 148 | ||
| 132 | const BITS: TimerBits = $bits; | 149 | const BITS: TimerBits = $bits; |
| 133 | 150 | ||
| @@ -138,6 +155,49 @@ macro_rules! impl_core_timer { | |||
| 138 | }; | 155 | }; |
| 139 | } | 156 | } |
| 140 | 157 | ||
| 158 | #[allow(unused)] | ||
| 159 | macro_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)] | ||
| 168 | macro_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)] | ||
| 177 | macro_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 | |||
| 186 | // This macro only apply to "AdvancedInstance(s)", | ||
| 187 | // not "GeneralInstance4Channel" itself. | ||
| 188 | #[allow(unused)] | ||
| 189 | macro_rules! impl_general_4ch_blank_sealed { | ||
| 190 | ($inst:ident) => { | ||
| 191 | impl General4ChBlankSealed for crate::peripherals::$inst { | ||
| 192 | fn enable_outputs(&self) { | ||
| 193 | unsafe { crate::pac::timer::Tim1chCmp::from_ptr(Self::regs()) } | ||
| 194 | .bdtr() | ||
| 195 | .modify(|w| w.set_moe(true)); | ||
| 196 | } | ||
| 197 | } | ||
| 198 | }; | ||
| 199 | } | ||
| 200 | |||
| 141 | foreach_interrupt! { | 201 | foreach_interrupt! { |
| 142 | ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { | 202 | ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { |
| 143 | impl_core_timer!($inst, TimerBits::Bits16); | 203 | impl_core_timer!($inst, TimerBits::Bits16); |
| @@ -149,47 +209,52 @@ foreach_interrupt! { | |||
| 149 | impl_core_timer!($inst, TimerBits::Bits16); | 209 | impl_core_timer!($inst, TimerBits::Bits16); |
| 150 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 210 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 151 | impl BasicInstance for crate::peripherals::$inst {} | 211 | impl BasicInstance for crate::peripherals::$inst {} |
| 152 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 212 | impl_general_1ch!($inst); |
| 153 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 213 | impl_general_2ch!($inst); |
| 154 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 214 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 215 | impl General4ChBlankSealed for crate::peripherals::$inst {} | ||
| 155 | }; | 216 | }; |
| 156 | 217 | ||
| 157 | ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { | 218 | ($inst:ident, timer, TIM_2CH, UP, $irq:ident) => { |
| 158 | impl_core_timer!($inst, TimerBits::Bits16); | 219 | impl_core_timer!($inst, TimerBits::Bits16); |
| 159 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 220 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 160 | impl BasicInstance for crate::peripherals::$inst {} | 221 | impl BasicInstance for crate::peripherals::$inst {} |
| 161 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 222 | impl_general_1ch!($inst); |
| 162 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 223 | impl_general_2ch!($inst); |
| 163 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 224 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 225 | impl General4ChBlankSealed for crate::peripherals::$inst {} | ||
| 164 | }; | 226 | }; |
| 165 | 227 | ||
| 166 | ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { | 228 | ($inst:ident, timer, TIM_GP16, UP, $irq:ident) => { |
| 167 | impl_core_timer!($inst, TimerBits::Bits16); | 229 | impl_core_timer!($inst, TimerBits::Bits16); |
| 168 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 230 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 169 | impl BasicInstance for crate::peripherals::$inst {} | 231 | impl BasicInstance for crate::peripherals::$inst {} |
| 170 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 232 | impl_general_1ch!($inst); |
| 171 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 233 | impl_general_2ch!($inst); |
| 172 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 234 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 235 | impl General4ChBlankSealed for crate::peripherals::$inst {} | ||
| 173 | }; | 236 | }; |
| 174 | 237 | ||
| 175 | ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { | 238 | ($inst:ident, timer, TIM_GP32, UP, $irq:ident) => { |
| 176 | impl_core_timer!($inst, TimerBits::Bits32); | 239 | impl_core_timer!($inst, TimerBits::Bits32); |
| 177 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 240 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 178 | impl BasicInstance for crate::peripherals::$inst {} | 241 | impl BasicInstance for crate::peripherals::$inst {} |
| 179 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 242 | impl_general_1ch!($inst); |
| 180 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 243 | impl_general_2ch!($inst); |
| 181 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 244 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 182 | impl GeneralInstance32bit4Channel for crate::peripherals::$inst {} | 245 | impl GeneralInstance32bit4Channel for crate::peripherals::$inst {} |
| 246 | impl General4ChBlankSealed for crate::peripherals::$inst {} | ||
| 183 | }; | 247 | }; |
| 184 | 248 | ||
| 185 | ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { | 249 | ($inst:ident, timer, TIM_1CH_CMP, UP, $irq:ident) => { |
| 186 | impl_core_timer!($inst, TimerBits::Bits16); | 250 | impl_core_timer!($inst, TimerBits::Bits16); |
| 187 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 251 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 188 | impl BasicInstance for crate::peripherals::$inst {} | 252 | impl BasicInstance for crate::peripherals::$inst {} |
| 189 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 253 | impl_general_1ch!($inst); |
| 190 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 254 | impl_general_2ch!($inst); |
| 191 | impl GeneralInstance4Channel for crate::peripherals::$inst { fn enable_outputs(&self) { set_moe::<Self>() }} | 255 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 192 | impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } | 256 | impl_general_4ch_blank_sealed!($inst); |
| 257 | impl_advanced_1ch!($inst); | ||
| 193 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 258 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 194 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} | 259 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 195 | }; | 260 | }; |
| @@ -198,10 +263,11 @@ foreach_interrupt! { | |||
| 198 | impl_core_timer!($inst, TimerBits::Bits16); | 263 | impl_core_timer!($inst, TimerBits::Bits16); |
| 199 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 264 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 200 | impl BasicInstance for crate::peripherals::$inst {} | 265 | impl BasicInstance for crate::peripherals::$inst {} |
| 201 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 266 | impl_general_1ch!($inst); |
| 202 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 267 | impl_general_2ch!($inst); |
| 203 | impl GeneralInstance4Channel for crate::peripherals::$inst { fn enable_outputs(&self) { set_moe::<Self>() }} | 268 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 204 | impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } | 269 | impl_general_4ch_blank_sealed!($inst); |
| 270 | impl_advanced_1ch!($inst); | ||
| 205 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 271 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 206 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} | 272 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 207 | }; | 273 | }; |
| @@ -210,19 +276,12 @@ foreach_interrupt! { | |||
| 210 | impl_core_timer!($inst, TimerBits::Bits16); | 276 | impl_core_timer!($inst, TimerBits::Bits16); |
| 211 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 277 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 212 | impl BasicInstance for crate::peripherals::$inst {} | 278 | impl BasicInstance for crate::peripherals::$inst {} |
| 213 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 279 | impl_general_1ch!($inst); |
| 214 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 280 | impl_general_2ch!($inst); |
| 215 | impl GeneralInstance4Channel for crate::peripherals::$inst { fn enable_outputs(&self) { set_moe::<Self>() }} | 281 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 216 | impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } | 282 | impl_general_4ch_blank_sealed!($inst); |
| 283 | impl_advanced_1ch!($inst); | ||
| 217 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 284 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 218 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} | 285 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 219 | }; | 286 | }; |
| 220 | } | 287 | } |
| 221 | |||
| 222 | #[cfg(not(stm32l0))] | ||
| 223 | #[allow(unused)] | ||
| 224 | fn set_moe<T: GeneralInstance4Channel>() { | ||
| 225 | unsafe { crate::pac::timer::Tim1chCmp::from_ptr(T::regs()) } | ||
| 226 | .bdtr() | ||
| 227 | .modify(|w| w.set_moe(true)); | ||
| 228 | } | ||
