aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorin Cooper-Bennun <[email protected]>2024-02-23 14:33:25 +0000
committerTorin Cooper-Bennun <[email protected]>2024-02-26 10:03:51 +0000
commit5c45723777dbd7d9d23188f5b5a2adc417e29292 (patch)
treeb3df059b01efb8ceb734a2e9ed1c2a494402bbbb
parent86ccf0bc3e0a9908402405aebde6755df0e1b4f6 (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.rs34
-rw-r--r--embassy-stm32/src/timer/mod.rs19
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;
16use crate::rcc::sealed::RccPeripheral; 16use crate::rcc::sealed::RccPeripheral;
17#[cfg(feature = "low-power")] 17#[cfg(feature = "low-power")]
18use crate::rtc::Rtc; 18use crate::rtc::Rtc;
19#[cfg(any(time_driver_tim1, time_driver_tim8, time_driver_tim20))]
20use crate::timer::sealed::AdvancedControlInstance;
19use crate::timer::sealed::{CoreInstance, GeneralPurpose16bitInstance as Instance}; 21use crate::timer::sealed::{CoreInstance, GeneralPurpose16bitInstance as Instance};
20use crate::{interrupt, peripherals}; 22use 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)]
833macro_rules! impl_adv_timer { 836macro_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