aboutsummaryrefslogtreecommitdiff
path: root/rtic-monotonics/src
diff options
context:
space:
mode:
Diffstat (limited to 'rtic-monotonics/src')
-rw-r--r--rtic-monotonics/src/lib.rs5
-rw-r--r--rtic-monotonics/src/stm32.rs108
2 files changed, 87 insertions, 26 deletions
diff --git a/rtic-monotonics/src/lib.rs b/rtic-monotonics/src/lib.rs
index b5cc5421..b34f9d62 100644
--- a/rtic-monotonics/src/lib.rs
+++ b/rtic-monotonics/src/lib.rs
@@ -46,7 +46,8 @@ pub mod rp2040;
))]
pub mod nrf;
-#[cfg(any(feature = "stm32g081kb",))]
+// Notice that `stm32` is not a feature, it is a compilation flag set in build.rs.
+#[cfg(stm32)]
pub mod stm32;
#[allow(dead_code)]
@@ -64,7 +65,7 @@ pub(crate) const fn cortex_logical2hw(logical: u8, nvic_prio_bits: u8) -> u8 {
feature = "nrf5340-app",
feature = "nrf5340-net",
feature = "nrf9160",
- feature = "stm32g081kb",
+ stm32,
))]
pub(crate) unsafe fn set_monotonic_prio(
prio_bits: u8,
diff --git a/rtic-monotonics/src/stm32.rs b/rtic-monotonics/src/stm32.rs
index e496e56b..780ecbe4 100644
--- a/rtic-monotonics/src/stm32.rs
+++ b/rtic-monotonics/src/stm32.rs
@@ -61,6 +61,7 @@ macro_rules! __internal_create_stm32_timer_interrupt {
}
/// Register TIM2 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim2")]
#[macro_export]
macro_rules! create_stm32_tim2_monotonic_token {
() => {{
@@ -69,6 +70,7 @@ macro_rules! create_stm32_tim2_monotonic_token {
}
/// Register TIM3 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim3")]
#[macro_export]
macro_rules! create_stm32_tim3_monotonic_token {
() => {{
@@ -76,8 +78,55 @@ macro_rules! create_stm32_tim3_monotonic_token {
}};
}
+/// Register TIM4 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim4")]
+#[macro_export]
+macro_rules! create_stm32_tim4_monotonic_token {
+ () => {{
+ $crate::__internal_create_stm32_timer_interrupt!(Tim4, TIM4, Tim4Token)
+ }};
+}
+
+/// Register TIM5 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim5")]
+#[macro_export]
+macro_rules! create_stm32_tim5_monotonic_token {
+ () => {{
+ $crate::__internal_create_stm32_timer_interrupt!(Tim5, TIM5, Tim5Token)
+ }};
+}
+
+/// Register TIM12 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim12")]
+#[macro_export]
+macro_rules! create_stm32_tim12_monotonic_token {
+ () => {{
+ $crate::__internal_create_stm32_timer_interrupt!(Tim12, TIM12, Tim12Token)
+ }};
+}
+
+/// Register TIM15 interrupt for the monotonic.
+#[cfg(feature = "stm32_tim15")]
+#[macro_export]
+macro_rules! create_stm32_tim15_monotonic_token {
+ () => {{
+ $crate::__internal_create_stm32_timer_interrupt!(Tim15, TIM15, Tim15Token)
+ }};
+}
+
+// Creates `enable_timer()` function which enables timer in RCC.
+macro_rules! enable_timer {
+ ($apbenrX:ident, $set_timXen:ident, $apbrstrX:ident, $set_timXrst:ident) => {
+ fn enable_timer() {
+ pac::RCC.$apbenrX().modify(|r| r.$set_timXen(true));
+ pac::RCC.$apbrstrX().modify(|r| r.$set_timXrst(true));
+ pac::RCC.$apbrstrX().modify(|r| r.$set_timXrst(false));
+ }
+ };
+}
+
macro_rules! make_timer {
- ($mono_name:ident, $timer:ident, $bits:ident, $set_tim_en:ident, $set_tim_rst:ident, $overflow:ident, $tq:ident$(, doc: ($($doc:tt)*))?) => {
+ ($mono_name:ident, $timer:ident, $bits:ident, $overflow:ident, $tq:ident$(, doc: ($($doc:tt)*))?) => {
/// Monotonic timer queue implementation.
$(
#[cfg_attr(docsrs, doc(cfg($($doc)*)))]
@@ -91,12 +140,12 @@ macro_rules! make_timer {
static $tq: TimerQueue<$mono_name> = TimerQueue::new();
impl $mono_name {
- /// Start monotonic timer. Must be called only once.
- /// `tim_clock_hz` shows to which frequency `TIMx` clock source is configured.
+ /// Starts the monotonic timer.
+ /// - `tim_clock_hz`: `TIMx` peripheral clock frequency.
+ /// - `_interrupt_token`: Required for correct timer interrupt handling.
+ /// This method must be called only once.
pub fn start(tim_clock_hz: u32, _interrupt_token: impl crate::InterruptToken<Self>) {
- pac::RCC.apbenr1().modify(|r| r.$set_tim_en(true));
- pac::RCC.apbrstr1().modify(|r| r.$set_tim_rst(true));
- pac::RCC.apbrstr1().modify(|r| r.$set_tim_rst(false));
+ enable_timer();
$timer.cr1().modify(|r| r.set_cen(false));
@@ -229,21 +278,32 @@ macro_rules! make_timer {
};
}
-make_timer!(
- Tim2,
- TIM2,
- u32,
- set_tim2en,
- set_tim2rst,
- TIMER2_OVERFLOWS,
- TIMER2_TQ
-);
-make_timer!(
- Tim3,
- TIM3,
- u16,
- set_tim3en,
- set_tim3rst,
- TIMER3_OVERFLOWS,
- TIMER3_TQ
-);
+#[cfg(feature = "stm32_tim2")]
+enable_timer!(apbenr1, set_tim2en, apbrstr1, set_tim2rst);
+#[cfg(feature = "stm32_tim2")]
+make_timer!(Tim2, TIM2, u32, TIMER2_OVERFLOWS, TIMER2_TQ);
+
+#[cfg(feature = "stm32_tim3")]
+enable_timer!(apbenr1, set_tim3en, apbrstr1, set_tim3rst);
+#[cfg(feature = "stm32_tim3")]
+make_timer!(Tim3, TIM3, u16, TIMER3_OVERFLOWS, TIMER3_TQ);
+
+#[cfg(feature = "stm32_tim4")]
+enable_timer!(apbenr1, set_tim4en, apbrstr1, set_tim4rst);
+#[cfg(feature = "stm32_tim4")]
+make_timer!(Tim4, TIM4, u16, TIMER4_OVERFLOWS, TIMER4_TQ);
+
+#[cfg(feature = "stm32_tim5")]
+enable_timer!(apbenr1, set_tim5en, apbrstr1, set_tim5rst);
+#[cfg(feature = "stm32_tim5")]
+make_timer!(Tim5, TIM5, u16, TIMER5_OVERFLOWS, TIMER5_TQ);
+
+#[cfg(feature = "stm32_tim12")]
+enable_timer!(apb1enr, set_tim12en, apb1rstr, set_tim12rst);
+#[cfg(feature = "stm32_tim12")]
+make_timer!(Tim12, TIM12, u16, TIMER12_OVERFLOWS, TIMER12_TQ);
+
+#[cfg(feature = "stm32_tim15")]
+enable_timer!(apbenr2, set_tim15en, apbrstr2, set_tim15rst);
+#[cfg(feature = "stm32_tim15")]
+make_timer!(Tim15, TIM15, u16, TIMER15_OVERFLOWS, TIMER15_TQ);