diff options
| author | eZio Pan <[email protected]> | 2024-03-25 19:29:59 +0800 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-04-05 00:51:20 +0200 |
| commit | 78b9cb98d4afc9c2be67176b174255ba78170525 (patch) | |
| tree | a251292d2a660d9a20db395a023080b210add0f0 | |
| parent | 348a46b110b63e7ba1ca8ca558331c00963d0800 (diff) | |
"separate CC interrupt" is for AdvCh4 only
| -rw-r--r-- | embassy-stm32/src/time_driver.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 39 |
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; | |||
| 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))] | ||
| 19 | use crate::timer::AdvancedInstance1Channel; | ||
| 20 | use crate::timer::CoreInstance; | 18 | use crate::timer::CoreInstance; |
| 21 | use crate::{interrupt, peripherals}; | 19 | use 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)] | ||
| 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 { |
| @@ -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 | |||
| 93 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} | 93 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} |
| 94 | 94 | ||
| 95 | /// Advanced 16-bit timer with 1 channel instance. | 95 | /// Advanced 16-bit timer with 1 channel instance. |
| 96 | pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { | 96 | pub 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 | ||
| 102 | pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {} | 99 | pub 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. |
| 105 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} | 102 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel { |
| 103 | /// Capture compare interrupt for this timer. | ||
| 104 | type CaptureCompareInterrupt: interrupt::typelevel::Interrupt; | ||
| 105 | } | ||
| 106 | 106 | ||
| 107 | pin_trait!(Channel1Pin, GeneralInstance4Channel); | 107 | pin_trait!(Channel1Pin, GeneralInstance4Channel); |
| 108 | pin_trait!(Channel2Pin, GeneralInstance4Channel); | 108 | pin_trait!(Channel2Pin, GeneralInstance4Channel); |
| @@ -162,6 +162,15 @@ macro_rules! impl_general_4ch_blank_sealed { | |||
| 162 | }; | 162 | }; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | #[allow(unused)] | ||
| 166 | macro_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 | |||
| 165 | foreach_interrupt! { | 174 | foreach_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)] | ||
| 255 | fn set_moe<T: GeneralInstance4Channel>() { | ||
| 256 | unsafe { crate::pac::timer::Tim1chCmp::from_ptr(T::regs()) } | ||
| 257 | .bdtr() | ||
| 258 | .modify(|w| w.set_moe(true)); | ||
| 259 | } | ||
