aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreZio Pan <[email protected]>2024-03-25 19:29:59 +0800
committerDario Nieuwenhuis <[email protected]>2024-04-05 00:51:20 +0200
commit78b9cb98d4afc9c2be67176b174255ba78170525 (patch)
treea251292d2a660d9a20db395a023080b210add0f0
parent348a46b110b63e7ba1ca8ca558331c00963d0800 (diff)
"separate CC interrupt" is for AdvCh4 only
-rw-r--r--embassy-stm32/src/time_driver.rs8
-rw-r--r--embassy-stm32/src/timer/mod.rs39
2 files changed, 24 insertions, 23 deletions
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs
index cc8161276..a3fe9b275 100644
--- a/embassy-stm32/src/time_driver.rs
+++ b/embassy-stm32/src/time_driver.rs
@@ -15,8 +15,6 @@ 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))]
19use crate::timer::AdvancedInstance1Channel;
20use crate::timer::CoreInstance; 18use crate::timer::CoreInstance;
21use crate::{interrupt, peripherals}; 19use crate::{interrupt, peripherals};
22 20
@@ -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 {
@@ -312,9 +311,10 @@ impl RtcDriver {
312 311
313 #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] 312 #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))]
314 { 313 {
315 <T as AdvancedInstance1Channel>::CaptureCompareInterrupt::unpend(); 314 use crate::timer::AdvancedInstance4Channel;
315 <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::unpend();
316 unsafe { 316 unsafe {
317 <T as AdvancedInstance1Channel>::CaptureCompareInterrupt::enable(); 317 <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::enable();
318 } 318 }
319 } 319 }
320 320
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index 5c03aa1cb..b3d4fa284 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -93,16 +93,16 @@ pub trait GeneralInstance4Channel: BasicInstance + GeneralInstance2Channel + Gen
93pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} 93pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {}
94 94
95/// Advanced 16-bit timer with 1 channel instance. 95/// Advanced 16-bit timer with 1 channel instance.
96pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { 96pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel {}
97 /// Capture compare interrupt for this timer.
98 type CaptureCompareInterrupt: interrupt::typelevel::Interrupt;
99}
100/// Advanced 16-bit timer with 2 channels instance. 97/// Advanced 16-bit timer with 2 channels instance.
101 98
102pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {} 99pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {}
103 100
104/// Advanced 16-bit timer with 4 channels instance. 101/// Advanced 16-bit timer with 4 channels instance.
105pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} 102pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {
103 /// Capture compare interrupt for this timer.
104 type CaptureCompareInterrupt: interrupt::typelevel::Interrupt;
105}
106 106
107pin_trait!(Channel1Pin, GeneralInstance4Channel); 107pin_trait!(Channel1Pin, GeneralInstance4Channel);
108pin_trait!(Channel2Pin, GeneralInstance4Channel); 108pin_trait!(Channel2Pin, GeneralInstance4Channel);
@@ -162,6 +162,15 @@ macro_rules! impl_general_4ch_blank_sealed {
162 }; 162 };
163} 163}
164 164
165#[allow(unused)]
166macro_rules! impl_adv_4ch {
167 ($inst:ident) => {
168 impl AdvancedInstance4Channel for crate::peripherals::$inst {
169 type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC;
170 }
171 };
172}
173
165foreach_interrupt! { 174foreach_interrupt! {
166 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { 175 ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => {
167 impl_core_timer!($inst, TimerBits::Bits16); 176 impl_core_timer!($inst, TimerBits::Bits16);
@@ -218,9 +227,9 @@ foreach_interrupt! {
218 impl GeneralInstance2Channel for crate::peripherals::$inst {} 227 impl GeneralInstance2Channel for crate::peripherals::$inst {}
219 impl GeneralInstance4Channel for crate::peripherals::$inst {} 228 impl GeneralInstance4Channel for crate::peripherals::$inst {}
220 impl_general_4ch_blank_sealed!($inst); 229 impl_general_4ch_blank_sealed!($inst);
221 impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } 230 impl AdvancedInstance1Channel for crate::peripherals::$inst {}
222 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 231 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
223 impl AdvancedInstance4Channel for crate::peripherals::$inst {} 232 impl_adv_4ch!($inst);
224 }; 233 };
225 234
226 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { 235 ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => {
@@ -231,9 +240,9 @@ foreach_interrupt! {
231 impl GeneralInstance2Channel for crate::peripherals::$inst {} 240 impl GeneralInstance2Channel for crate::peripherals::$inst {}
232 impl GeneralInstance4Channel for crate::peripherals::$inst {} 241 impl GeneralInstance4Channel for crate::peripherals::$inst {}
233 impl_general_4ch_blank_sealed!($inst); 242 impl_general_4ch_blank_sealed!($inst);
234 impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } 243 impl AdvancedInstance1Channel for crate::peripherals::$inst {}
235 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 244 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
236 impl AdvancedInstance4Channel for crate::peripherals::$inst {} 245 impl_adv_4ch!($inst);
237 }; 246 };
238 247
239 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { 248 ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => {
@@ -244,16 +253,8 @@ foreach_interrupt! {
244 impl GeneralInstance2Channel for crate::peripherals::$inst {} 253 impl GeneralInstance2Channel for crate::peripherals::$inst {}
245 impl GeneralInstance4Channel for crate::peripherals::$inst {} 254 impl GeneralInstance4Channel for crate::peripherals::$inst {}
246 impl_general_4ch_blank_sealed!($inst); 255 impl_general_4ch_blank_sealed!($inst);
247 impl AdvancedInstance1Channel for crate::peripherals::$inst { type CaptureCompareInterrupt = crate::_generated::peripheral_interrupts::$inst::CC; } 256 impl AdvancedInstance1Channel for crate::peripherals::$inst {}
248 impl AdvancedInstance2Channel for crate::peripherals::$inst {} 257 impl AdvancedInstance2Channel for crate::peripherals::$inst {}
249 impl AdvancedInstance4Channel for crate::peripherals::$inst {} 258 impl_adv_4ch!($inst);
250 }; 259 };
251} 260}
252
253#[cfg(not(stm32l0))]
254#[allow(unused)]
255fn set_moe<T: GeneralInstance4Channel>() {
256 unsafe { crate::pac::timer::Tim1chCmp::from_ptr(T::regs()) }
257 .bdtr()
258 .modify(|w| w.set_moe(true));
259}