diff options
| author | Torin Cooper-Bennun <[email protected]> | 2024-02-23 14:33:25 +0000 |
|---|---|---|
| committer | Torin Cooper-Bennun <[email protected]> | 2024-02-26 10:03:51 +0000 |
| commit | 5c45723777dbd7d9d23188f5b5a2adc417e29292 (patch) | |
| tree | b3df059b01efb8ceb734a2e9ed1c2a494402bbbb | |
| parent | 86ccf0bc3e0a9908402405aebde6755df0e1b4f6 (diff) | |
stm32: timers: use TIMx_CC interrupt source for advanced timers
fixes (hopefully) time driver when using TIM1/8/20
| -rw-r--r-- | embassy-stm32/src/time_driver.rs | 34 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 19 |
2 files changed, 49 insertions, 4 deletions
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs index 8e4e606a4..37b2e7526 100644 --- a/embassy-stm32/src/time_driver.rs +++ b/embassy-stm32/src/time_driver.rs | |||
| @@ -16,6 +16,8 @@ use crate::pac::timer::vals; | |||
| 16 | use crate::rcc::sealed::RccPeripheral; | 16 | use crate::rcc::sealed::RccPeripheral; |
| 17 | #[cfg(feature = "low-power")] | 17 | #[cfg(feature = "low-power")] |
| 18 | use crate::rtc::Rtc; | 18 | use crate::rtc::Rtc; |
| 19 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] | ||
| 20 | use crate::timer::sealed::AdvancedControlInstance; | ||
| 19 | use crate::timer::sealed::{CoreInstance, GeneralPurpose16bitInstance as Instance}; | 21 | use crate::timer::sealed::{CoreInstance, GeneralPurpose16bitInstance as Instance}; |
| 20 | use crate::{interrupt, peripherals}; | 22 | use crate::{interrupt, peripherals}; |
| 21 | 23 | ||
| @@ -76,6 +78,14 @@ foreach_interrupt! { | |||
| 76 | DRIVER.on_interrupt() | 78 | DRIVER.on_interrupt() |
| 77 | } | 79 | } |
| 78 | }; | 80 | }; |
| 81 | (TIM1, timer, $block:ident, CC, $irq:ident) => { | ||
| 82 | #[cfg(time_driver_tim1)] | ||
| 83 | #[cfg(feature = "rt")] | ||
| 84 | #[interrupt] | ||
| 85 | fn $irq() { | ||
| 86 | DRIVER.on_interrupt() | ||
| 87 | } | ||
| 88 | }; | ||
| 79 | (TIM2, timer, $block:ident, UP, $irq:ident) => { | 89 | (TIM2, timer, $block:ident, UP, $irq:ident) => { |
| 80 | #[cfg(time_driver_tim2)] | 90 | #[cfg(time_driver_tim2)] |
| 81 | #[cfg(feature = "rt")] | 91 | #[cfg(feature = "rt")] |
| @@ -116,6 +126,14 @@ foreach_interrupt! { | |||
| 116 | DRIVER.on_interrupt() | 126 | DRIVER.on_interrupt() |
| 117 | } | 127 | } |
| 118 | }; | 128 | }; |
| 129 | (TIM8, timer, $block:ident, CC, $irq:ident) => { | ||
| 130 | #[cfg(time_driver_tim8)] | ||
| 131 | #[cfg(feature = "rt")] | ||
| 132 | #[interrupt] | ||
| 133 | fn $irq() { | ||
| 134 | DRIVER.on_interrupt() | ||
| 135 | } | ||
| 136 | }; | ||
| 119 | (TIM9, timer, $block:ident, UP, $irq:ident) => { | 137 | (TIM9, timer, $block:ident, UP, $irq:ident) => { |
| 120 | #[cfg(time_driver_tim9)] | 138 | #[cfg(time_driver_tim9)] |
| 121 | #[cfg(feature = "rt")] | 139 | #[cfg(feature = "rt")] |
| @@ -148,6 +166,14 @@ foreach_interrupt! { | |||
| 148 | DRIVER.on_interrupt() | 166 | DRIVER.on_interrupt() |
| 149 | } | 167 | } |
| 150 | }; | 168 | }; |
| 169 | (TIM20, timer, $block:ident, CC, $irq:ident) => { | ||
| 170 | #[cfg(time_driver_tim20)] | ||
| 171 | #[cfg(feature = "rt")] | ||
| 172 | #[interrupt] | ||
| 173 | fn $irq() { | ||
| 174 | DRIVER.on_interrupt() | ||
| 175 | } | ||
| 176 | }; | ||
| 151 | (TIM21, timer, $block:ident, UP, $irq:ident) => { | 177 | (TIM21, timer, $block:ident, UP, $irq:ident) => { |
| 152 | #[cfg(time_driver_tim21)] | 178 | #[cfg(time_driver_tim21)] |
| 153 | #[cfg(feature = "rt")] | 179 | #[cfg(feature = "rt")] |
| @@ -281,6 +307,14 @@ impl RtcDriver { | |||
| 281 | <T as CoreInstance>::Interrupt::unpend(); | 307 | <T as CoreInstance>::Interrupt::unpend(); |
| 282 | unsafe { <T as CoreInstance>::Interrupt::enable() }; | 308 | unsafe { <T as CoreInstance>::Interrupt::enable() }; |
| 283 | 309 | ||
| 310 | #[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))] | ||
| 311 | { | ||
| 312 | <T as AdvancedControlInstance>::CaptureCompareInterrupt::unpend(); | ||
| 313 | unsafe { | ||
| 314 | <T as AdvancedControlInstance>::CaptureCompareInterrupt::enable(); | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 284 | r.cr1().modify(|w| w.set_cen(true)); | 318 | r.cr1().modify(|w| w.set_cen(true)); |
| 285 | } | 319 | } |
| 286 | 320 | ||
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs index 9397da2a1..c8f580101 100644 --- a/embassy-stm32/src/timer/mod.rs +++ b/embassy-stm32/src/timer/mod.rs | |||
| @@ -464,6 +464,9 @@ pub(crate) mod sealed { | |||
| 464 | pub trait AdvancedControlInstance: | 464 | pub trait AdvancedControlInstance: |
| 465 | GeneralPurpose2ChannelComplementaryInstance + GeneralPurpose16bitInstance | 465 | GeneralPurpose2ChannelComplementaryInstance + GeneralPurpose16bitInstance |
| 466 | { | 466 | { |
| 467 | /// Capture compare interrupt for this timer. | ||
| 468 | type CaptureCompareInterrupt: interrupt::typelevel::Interrupt; | ||
| 469 | |||
| 467 | /// Get access to the advanced timer registers. | 470 | /// Get access to the advanced timer registers. |
| 468 | fn regs_advanced() -> crate::pac::timer::TimAdv; | 471 | fn regs_advanced() -> crate::pac::timer::TimAdv; |
| 469 | 472 | ||
| @@ -831,8 +834,10 @@ macro_rules! impl_2ch_cmp_timer { | |||
| 831 | 834 | ||
| 832 | #[allow(unused)] | 835 | #[allow(unused)] |
| 833 | macro_rules! impl_adv_timer { | 836 | macro_rules! impl_adv_timer { |
| 834 | ($inst:ident) => { | 837 | ($inst:ident, $irq:ident) => { |
| 835 | impl sealed::AdvancedControlInstance for crate::peripherals::$inst { | 838 | impl sealed::AdvancedControlInstance for crate::peripherals::$inst { |
| 839 | type CaptureCompareInterrupt = crate::interrupt::typelevel::$irq; | ||
| 840 | |||
| 836 | fn regs_advanced() -> crate::pac::timer::TimAdv { | 841 | fn regs_advanced() -> crate::pac::timer::TimAdv { |
| 837 | unsafe { crate::pac::timer::TimAdv::from_ptr(crate::pac::$inst.as_ptr()) } | 842 | unsafe { crate::pac::timer::TimAdv::from_ptr(crate::pac::$inst.as_ptr()) } |
| 838 | } | 843 | } |
| @@ -905,11 +910,13 @@ foreach_interrupt! { | |||
| 905 | impl_gp16_timer!($inst); | 910 | impl_gp16_timer!($inst); |
| 906 | impl_1ch_cmp_timer!($inst); | 911 | impl_1ch_cmp_timer!($inst); |
| 907 | impl_2ch_cmp_timer!($inst); | 912 | impl_2ch_cmp_timer!($inst); |
| 908 | impl_adv_timer!($inst); | ||
| 909 | impl BasicInstance for crate::peripherals::$inst {} | 913 | impl BasicInstance for crate::peripherals::$inst {} |
| 910 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | 914 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 911 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | 915 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 912 | }; | 916 | }; |
| 917 | ($inst:ident, timer, TIM_1CH_CMP, CC, $irq:ident) => { | ||
| 918 | impl_adv_timer!($inst, $irq); | ||
| 919 | }; | ||
| 913 | 920 | ||
| 914 | 921 | ||
| 915 | ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { | 922 | ($inst:ident, timer, TIM_2CH_CMP, UP, $irq:ident) => { |
| @@ -921,11 +928,13 @@ foreach_interrupt! { | |||
| 921 | impl_gp16_timer!($inst); | 928 | impl_gp16_timer!($inst); |
| 922 | impl_1ch_cmp_timer!($inst); | 929 | impl_1ch_cmp_timer!($inst); |
| 923 | impl_2ch_cmp_timer!($inst); | 930 | impl_2ch_cmp_timer!($inst); |
| 924 | impl_adv_timer!($inst); | ||
| 925 | impl BasicInstance for crate::peripherals::$inst {} | 931 | impl BasicInstance for crate::peripherals::$inst {} |
| 926 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | 932 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 927 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | 933 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 928 | }; | 934 | }; |
| 935 | ($inst:ident, timer, TIM_2CH_CMP, CC, $irq:ident) => { | ||
| 936 | impl_adv_timer!($inst, $irq); | ||
| 937 | }; | ||
| 929 | 938 | ||
| 930 | 939 | ||
| 931 | ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { | 940 | ($inst:ident, timer, TIM_ADV, UP, $irq:ident) => { |
| @@ -937,11 +946,13 @@ foreach_interrupt! { | |||
| 937 | impl_gp16_timer!($inst); | 946 | impl_gp16_timer!($inst); |
| 938 | impl_1ch_cmp_timer!($inst); | 947 | impl_1ch_cmp_timer!($inst); |
| 939 | impl_2ch_cmp_timer!($inst); | 948 | impl_2ch_cmp_timer!($inst); |
| 940 | impl_adv_timer!($inst); | ||
| 941 | impl BasicInstance for crate::peripherals::$inst {} | 949 | impl BasicInstance for crate::peripherals::$inst {} |
| 942 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} | 950 | impl CaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 943 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} | 951 | impl ComplementaryCaptureCompare16bitInstance for crate::peripherals::$inst {} |
| 944 | }; | 952 | }; |
| 953 | ($inst:ident, timer, TIM_ADV, CC, $irq:ident) => { | ||
| 954 | impl_adv_timer!($inst, $irq); | ||
| 955 | }; | ||
| 945 | } | 956 | } |
| 946 | 957 | ||
| 947 | // Update Event trigger DMA for every timer | 958 | // Update Event trigger DMA for every timer |
