aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-04-04 23:04:38 +0000
committerGitHub <[email protected]>2024-04-04 23:04:38 +0000
commit9d0b682b2d11cc4c194fc4cff8c3edfd459e1ef8 (patch)
tree277c7a59f7c811d0e2b0de9b660570f1f142d91e
parent8294bbc99d641a66c716a8e670247249a0f73d79 (diff)
parent3d7d3e028601ca05e58d82b8efc72b40855def86 (diff)
Merge pull request #2735 from eZioPan/stm32-timer-api-leak
stm32: fix timer api leaking
-rw-r--r--embassy-stm32/src/time_driver.rs45
-rw-r--r--embassy-stm32/src/timer/mod.rs135
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;
15use crate::rcc::SealedRccPeripheral; 15use crate::rcc::SealedRccPeripheral;
16#[cfg(feature = "low-power")] 16#[cfg(feature = "low-power")]
17use crate::rtc::Rtc; 17use crate::rtc::Rtc;
18#[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] 18use crate::timer::{CoreInstance, GeneralInstance1Channel};
19use crate::timer::AdvancedInstance1Channel;
20use crate::timer::CoreInstance;
21use crate::{interrupt, peripherals}; 19use crate::{interrupt, peripherals};
22 20
23// NOTE regarding ALARM_COUNT: 21// NOTE regarding ALARM_COUNT:
@@ -69,7 +67,7 @@ type T = peripherals::TIM23;
69type T = peripherals::TIM24; 67type T = peripherals::TIM24;
70 68
71foreach_interrupt! { 69foreach_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)]
266const ALARM_STATE_NEW: AlarmState = AlarmState::new(); 265const ALARM_STATE_NEW: AlarmState = AlarmState::new();
267 266
268embassy_time_driver::time_driver_impl!(static DRIVER: RtcDriver = RtcDriver { 267embassy_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.
49pub trait CoreInstance: RccPeripheral + 'static { 49pub 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 {}
64pub trait BasicInstance: BasicNoCr2Instance {} 64pub 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.
67pub trait GeneralInstance1Channel: CoreInstance {} 67pub 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.
70pub trait GeneralInstance2Channel: GeneralInstance1Channel {} 73pub 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,
73pub 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.
83trait 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)]
96pub 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.
84pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} 99pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {}
85 100
86/// Advanced 16-bit timer with 1 channel instance. 101/// Advanced 16-bit timer with 1 channel instance.
87pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { 102pub 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);
127macro_rules! impl_core_timer { 144macro_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)]
159macro_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)]
168macro_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)]
177macro_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)]
189macro_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
141foreach_interrupt! { 201foreach_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)]
224fn set_moe<T: GeneralInstance4Channel>() {
225 unsafe { crate::pac::timer::Tim1chCmp::from_ptr(T::regs()) }
226 .bdtr()
227 .modify(|w| w.set_moe(true));
228}