diff options
| author | eZio Pan <[email protected]> | 2024-03-26 01:05:38 +0800 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-04-05 00:51:20 +0200 |
| commit | 5dc3738bc2b4e1d8f9f77588ecab7956493b59de (patch) | |
| tree | 5a3e961c832ccfa138744dfff215660972625135 /embassy-stm32/src | |
| parent | 78b9cb98d4afc9c2be67176b174255ba78170525 (diff) | |
add missing interrupt for timer
Diffstat (limited to 'embassy-stm32/src')
| -rw-r--r-- | embassy-stm32/src/time_driver.rs | 10 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 105 |
2 files changed, 71 insertions, 44 deletions
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs index a3fe9b275..a2e75020c 100644 --- a/embassy-stm32/src/time_driver.rs +++ b/embassy-stm32/src/time_driver.rs | |||
| @@ -306,15 +306,15 @@ impl RtcDriver { | |||
| 306 | w.set_ccie(0, true); | 306 | w.set_ccie(0, true); |
| 307 | }); | 307 | }); |
| 308 | 308 | ||
| 309 | <T as CoreInstance>::Interrupt::unpend(); | 309 | <T as CoreInstance>::UpdateInterrupt::unpend(); |
| 310 | unsafe { <T as CoreInstance>::Interrupt::enable() }; | 310 | unsafe { <T as CoreInstance>::UpdateInterrupt::enable() }; |
| 311 | 311 | ||
| 312 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] | 312 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] |
| 313 | { | 313 | { |
| 314 | use crate::timer::AdvancedInstance4Channel; | 314 | use crate::timer::GeneralInstance1Channel; |
| 315 | <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::unpend(); | 315 | <T as GeneralInstance1Channel>::CaptureCompareInterrupt::unpend(); |
| 316 | unsafe { | 316 | unsafe { |
| 317 | <T as AdvancedInstance4Channel>::CaptureCompareInterrupt::enable(); | 317 | <T as GeneralInstance1Channel>::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 b3d4fa284..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,10 +64,16 @@ 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 | // This trait add *extra* methods to GeneralInstance4Channel, | 78 | // This trait add *extra* methods to GeneralInstance4Channel, |
| 73 | // that GeneralInstance4Channel doesn't use, but the "AdvancedInstance"s need. | 79 | // that GeneralInstance4Channel doesn't use, but the "AdvancedInstance"s need. |
| @@ -93,16 +99,18 @@ pub trait GeneralInstance4Channel: BasicInstance + GeneralInstance2Channel + Gen | |||
| 93 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} | 99 | pub trait GeneralInstance32bit4Channel: GeneralInstance4Channel {} |
| 94 | 100 | ||
| 95 | /// Advanced 16-bit timer with 1 channel instance. | 101 | /// Advanced 16-bit timer with 1 channel instance. |
| 96 | pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel {} | 102 | pub trait AdvancedInstance1Channel: BasicNoCr2Instance + GeneralInstance1Channel { |
| 103 | /// Communication interrupt for this timer. | ||
| 104 | type CommunicationInterrupt: interrupt::typelevel::Interrupt; | ||
| 105 | /// Break input interrupt for this timer. | ||
| 106 | type BreakInputInterrupt: interrupt::typelevel::Interrupt; | ||
| 107 | } | ||
| 97 | /// Advanced 16-bit timer with 2 channels instance. | 108 | /// Advanced 16-bit timer with 2 channels instance. |
| 98 | 109 | ||
| 99 | pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {} | 110 | pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + AdvancedInstance1Channel {} |
| 100 | 111 | ||
| 101 | /// Advanced 16-bit timer with 4 channels instance. | 112 | /// Advanced 16-bit timer with 4 channels instance. |
| 102 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel { | 113 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} |
| 103 | /// Capture compare interrupt for this timer. | ||
| 104 | type CaptureCompareInterrupt: interrupt::typelevel::Interrupt; | ||
| 105 | } | ||
| 106 | 114 | ||
| 107 | pin_trait!(Channel1Pin, GeneralInstance4Channel); | 115 | pin_trait!(Channel1Pin, GeneralInstance4Channel); |
| 108 | pin_trait!(Channel2Pin, GeneralInstance4Channel); | 116 | pin_trait!(Channel2Pin, GeneralInstance4Channel); |
| @@ -136,7 +144,7 @@ dma_trait!(Ch4Dma, GeneralInstance4Channel); | |||
| 136 | macro_rules! impl_core_timer { | 144 | macro_rules! impl_core_timer { |
| 137 | ($inst:ident, $bits:expr) => { | 145 | ($inst:ident, $bits:expr) => { |
| 138 | impl CoreInstance for crate::peripherals::$inst { | 146 | impl CoreInstance for crate::peripherals::$inst { |
| 139 | type Interrupt = crate::_generated::peripheral_interrupts::$inst::UP; | 147 | type UpdateInterrupt = crate::_generated::peripheral_interrupts::$inst::UP; |
| 140 | 148 | ||
| 141 | const BITS: TimerBits = $bits; | 149 | const BITS: TimerBits = $bits; |
| 142 | 150 | ||
| @@ -147,6 +155,34 @@ macro_rules! impl_core_timer { | |||
| 147 | }; | 155 | }; |
| 148 | } | 156 | } |
| 149 | 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 | |||
| 150 | // This macro only apply to "AdvancedInstance(s)", | 186 | // This macro only apply to "AdvancedInstance(s)", |
| 151 | // not "GeneralInstance4Channel" itself. | 187 | // not "GeneralInstance4Channel" itself. |
| 152 | #[allow(unused)] | 188 | #[allow(unused)] |
| @@ -162,15 +198,6 @@ macro_rules! impl_general_4ch_blank_sealed { | |||
| 162 | }; | 198 | }; |
| 163 | } | 199 | } |
| 164 | 200 | ||
| 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 | |||
| 174 | foreach_interrupt! { | 201 | foreach_interrupt! { |
| 175 | ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { | 202 | ($inst:ident, timer, TIM_BASIC, UP, $irq:ident) => { |
| 176 | impl_core_timer!($inst, TimerBits::Bits16); | 203 | impl_core_timer!($inst, TimerBits::Bits16); |
| @@ -182,8 +209,8 @@ foreach_interrupt! { | |||
| 182 | impl_core_timer!($inst, TimerBits::Bits16); | 209 | impl_core_timer!($inst, TimerBits::Bits16); |
| 183 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 210 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 184 | impl BasicInstance for crate::peripherals::$inst {} | 211 | impl BasicInstance for crate::peripherals::$inst {} |
| 185 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 212 | impl_general_1ch!($inst); |
| 186 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 213 | impl_general_2ch!($inst); |
| 187 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 214 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 188 | impl General4ChBlankSealed for crate::peripherals::$inst {} | 215 | impl General4ChBlankSealed for crate::peripherals::$inst {} |
| 189 | }; | 216 | }; |
| @@ -192,8 +219,8 @@ foreach_interrupt! { | |||
| 192 | impl_core_timer!($inst, TimerBits::Bits16); | 219 | impl_core_timer!($inst, TimerBits::Bits16); |
| 193 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 220 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 194 | impl BasicInstance for crate::peripherals::$inst {} | 221 | impl BasicInstance for crate::peripherals::$inst {} |
| 195 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 222 | impl_general_1ch!($inst); |
| 196 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 223 | impl_general_2ch!($inst); |
| 197 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 224 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 198 | impl General4ChBlankSealed for crate::peripherals::$inst {} | 225 | impl General4ChBlankSealed for crate::peripherals::$inst {} |
| 199 | }; | 226 | }; |
| @@ -202,8 +229,8 @@ foreach_interrupt! { | |||
| 202 | impl_core_timer!($inst, TimerBits::Bits16); | 229 | impl_core_timer!($inst, TimerBits::Bits16); |
| 203 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 230 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 204 | impl BasicInstance for crate::peripherals::$inst {} | 231 | impl BasicInstance for crate::peripherals::$inst {} |
| 205 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 232 | impl_general_1ch!($inst); |
| 206 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 233 | impl_general_2ch!($inst); |
| 207 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 234 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 208 | impl General4ChBlankSealed for crate::peripherals::$inst {} | 235 | impl General4ChBlankSealed for crate::peripherals::$inst {} |
| 209 | }; | 236 | }; |
| @@ -212,8 +239,8 @@ foreach_interrupt! { | |||
| 212 | impl_core_timer!($inst, TimerBits::Bits32); | 239 | impl_core_timer!($inst, TimerBits::Bits32); |
| 213 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 240 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 214 | impl BasicInstance for crate::peripherals::$inst {} | 241 | impl BasicInstance for crate::peripherals::$inst {} |
| 215 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 242 | impl_general_1ch!($inst); |
| 216 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 243 | impl_general_2ch!($inst); |
| 217 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 244 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 218 | impl GeneralInstance32bit4Channel for crate::peripherals::$inst {} | 245 | impl GeneralInstance32bit4Channel for crate::peripherals::$inst {} |
| 219 | impl General4ChBlankSealed for crate::peripherals::$inst {} | 246 | impl General4ChBlankSealed for crate::peripherals::$inst {} |
| @@ -223,38 +250,38 @@ foreach_interrupt! { | |||
| 223 | impl_core_timer!($inst, TimerBits::Bits16); | 250 | impl_core_timer!($inst, TimerBits::Bits16); |
| 224 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 251 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 225 | impl BasicInstance for crate::peripherals::$inst {} | 252 | impl BasicInstance for crate::peripherals::$inst {} |
| 226 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 253 | impl_general_1ch!($inst); |
| 227 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 254 | impl_general_2ch!($inst); |
| 228 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 255 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 229 | impl_general_4ch_blank_sealed!($inst); | 256 | impl_general_4ch_blank_sealed!($inst); |
| 230 | impl AdvancedInstance1Channel for crate::peripherals::$inst {} | 257 | impl_advanced_1ch!($inst); |
| 231 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 258 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 232 | impl_adv_4ch!($inst); | 259 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 233 | }; | 260 | }; |
| 234 | 261 | ||
| 235 | ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { | 262 | ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { |
| 236 | impl_core_timer!($inst, TimerBits::Bits16); | 263 | impl_core_timer!($inst, TimerBits::Bits16); |
| 237 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 264 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 238 | impl BasicInstance for crate::peripherals::$inst {} | 265 | impl BasicInstance for crate::peripherals::$inst {} |
| 239 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 266 | impl_general_1ch!($inst); |
| 240 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 267 | impl_general_2ch!($inst); |
| 241 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 268 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 242 | impl_general_4ch_blank_sealed!($inst); | 269 | impl_general_4ch_blank_sealed!($inst); |
| 243 | impl AdvancedInstance1Channel for crate::peripherals::$inst {} | 270 | impl_advanced_1ch!($inst); |
| 244 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 271 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 245 | impl_adv_4ch!($inst); | 272 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 246 | }; | 273 | }; |
| 247 | 274 | ||
| 248 | ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { | 275 | ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { |
| 249 | impl_core_timer!($inst, TimerBits::Bits16); | 276 | impl_core_timer!($inst, TimerBits::Bits16); |
| 250 | impl BasicNoCr2Instance for crate::peripherals::$inst {} | 277 | impl BasicNoCr2Instance for crate::peripherals::$inst {} |
| 251 | impl BasicInstance for crate::peripherals::$inst {} | 278 | impl BasicInstance for crate::peripherals::$inst {} |
| 252 | impl GeneralInstance1Channel for crate::peripherals::$inst {} | 279 | impl_general_1ch!($inst); |
| 253 | impl GeneralInstance2Channel for crate::peripherals::$inst {} | 280 | impl_general_2ch!($inst); |
| 254 | impl GeneralInstance4Channel for crate::peripherals::$inst {} | 281 | impl GeneralInstance4Channel for crate::peripherals::$inst {} |
| 255 | impl_general_4ch_blank_sealed!($inst); | 282 | impl_general_4ch_blank_sealed!($inst); |
| 256 | impl AdvancedInstance1Channel for crate::peripherals::$inst {} | 283 | impl_advanced_1ch!($inst); |
| 257 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} | 284 | impl AdvancedInstance2Channel for crate::peripherals::$inst {} |
| 258 | impl_adv_4ch!($inst); | 285 | impl AdvancedInstance4Channel for crate::peripherals::$inst {} |
| 259 | }; | 286 | }; |
| 260 | } | 287 | } |
