aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmaple/include/libmaple/timer.h42
-rw-r--r--libmaple/stm32f1/timer.c125
-rw-r--r--libmaple/stm32f2/timer.c77
-rw-r--r--libmaple/timer.c132
4 files changed, 184 insertions, 192 deletions
diff --git a/libmaple/include/libmaple/timer.h b/libmaple/include/libmaple/timer.h
index 5d9650c..3563749 100644
--- a/libmaple/include/libmaple/timer.h
+++ b/libmaple/include/libmaple/timer.h
@@ -134,6 +134,48 @@ typedef struct timer_dev {
* @see timer_detach_interrupt() */
} timer_dev;
+#if STM32_HAVE_TIMER(1)
+extern timer_dev *TIMER1;
+#endif
+#if STM32_HAVE_TIMER(2)
+extern timer_dev *TIMER2;
+#endif
+#if STM32_HAVE_TIMER(3)
+extern timer_dev *TIMER3;
+#endif
+#if STM32_HAVE_TIMER(4)
+extern timer_dev *TIMER4;
+#endif
+#if STM32_HAVE_TIMER(5)
+extern timer_dev *TIMER5;
+#endif
+#if STM32_HAVE_TIMER(6)
+extern timer_dev *TIMER6;
+#endif
+#if STM32_HAVE_TIMER(7)
+extern timer_dev *TIMER7;
+#endif
+#if STM32_HAVE_TIMER(8)
+extern timer_dev *TIMER8;
+#endif
+#if STM32_HAVE_TIMER(9)
+extern timer_dev *TIMER9;
+#endif
+#if STM32_HAVE_TIMER(10)
+extern timer_dev *TIMER10;
+#endif
+#if STM32_HAVE_TIMER(11)
+extern timer_dev *TIMER11;
+#endif
+#if STM32_HAVE_TIMER(12)
+extern timer_dev *TIMER12;
+#endif
+#if STM32_HAVE_TIMER(13)
+extern timer_dev *TIMER13;
+#endif
+#if STM32_HAVE_TIMER(14)
+extern timer_dev *TIMER14;
+#endif
/*
* Register bit definitions
diff --git a/libmaple/stm32f1/timer.c b/libmaple/stm32f1/timer.c
index 8671695..8b9e976 100644
--- a/libmaple/stm32f1/timer.c
+++ b/libmaple/stm32f1/timer.c
@@ -30,118 +30,11 @@
* @brief STM32F1 timer.
*/
-/* Notes:
- *
- * - We use STM32F1 density test macros throughout to avoid defining
- * symbols or linking in code that would use timers that are
- * unavailable in a given density. For example, TIM5 doesn't exist
- * on medium-density, and TIM9 doesn't exist on high-density, so we
- * don't define or use TIM5 when being compiled for medium-density,
- * and similarly for TIM9 and high-density.
- *
- * This makes a mess, but helps avoid bloat and ensures backwards
- * compatibility. Since the mess is manageable and there don't seem
- * to be any plans on ST's part to add new STM32F1 lines or
- * densities, we'll live with it.
- */
-
#include <libmaple/timer.h>
+#include <libmaple/stm32.h>
#include "timer_private.h"
/*
- * Devices
- *
- * Defer to the timer_private API.
- */
-
-static timer_dev timer1 = ADVANCED_TIMER(1);
-static timer_dev timer2 = GENERAL_TIMER(2);
-static timer_dev timer3 = GENERAL_TIMER(3);
-static timer_dev timer4 = GENERAL_TIMER(4);
-
-/** Timer 1 device (advanced) */
-timer_dev *TIMER1 = &timer1;
-/** Timer 2 device (general-purpose) */
-timer_dev *TIMER2 = &timer2;
-/** Timer 3 device (general-purpose) */
-timer_dev *TIMER3 = &timer3;
-/** Timer 4 device (general-purpose) */
-timer_dev *TIMER4 = &timer4;
-
-#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY)
-static timer_dev timer5 = GENERAL_TIMER(5);
-static timer_dev timer6 = BASIC_TIMER(6);
-static timer_dev timer7 = BASIC_TIMER(7);
-static timer_dev timer8 = ADVANCED_TIMER(8);
-
-/** Timer 5 device (general-purpose) */
-timer_dev *TIMER5 = &timer5;
-/** Timer 6 device (basic) */
-timer_dev *TIMER6 = &timer6;
-/** Timer 7 device (basic) */
-timer_dev *TIMER7 = &timer7;
-/** Timer 8 device (advanced) */
-timer_dev *TIMER8 = &timer8;
-#endif /* defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) */
-
-#ifdef STM32_XL_DENSITY
-/* TIM9 has UIE, CC1IE, CC2IE, TIE bits in DIER. */
-static timer_dev timer9 = RESTRICTED_GENERAL_TIMER(9, TIMER_DIER_TIE_BIT);
-/* TIM10 has UIE, CC1IE. */
-static timer_dev timer10 = RESTRICTED_GENERAL_TIMER(10, TIMER_DIER_CC1IE_BIT);
-/* TIM11 has UIE, CC1IE. */
-static timer_dev timer11 = RESTRICTED_GENERAL_TIMER(11, TIMER_DIER_CC1IE_BIT);
-/* TIM12 has UIE, CC1IE, CC2IE, TIE. */
-static timer_dev timer12 = RESTRICTED_GENERAL_TIMER(12, TIMER_DIER_TIE_BIT);
-/* TIM13 has UIE, CC1IE. */
-static timer_dev timer13 = RESTRICTED_GENERAL_TIMER(13, TIMER_DIER_CC1IE_BIT);
-/* TIM14 has UIE, CC1IE. */
-static timer_dev timer14 = RESTRICTED_GENERAL_TIMER(14, TIMER_DIER_CC1IE_BIT);
-
-/** Timer 9 device (general-purpose) */
-timer_dev *TIMER9 = &timer9;
-/** Timer 10 device (general-purpose) */
-timer_dev *TIMER10 = &timer10;
-/** Timer 11 device (general-purpose) */
-timer_dev *TIMER11 = &timer11;
-/** Timer 12 device (general-purpose) */
-timer_dev *TIMER12 = &timer12;
-/** Timer 13 device (general-purpose) */
-timer_dev *TIMER13 = &timer13;
-/** Timer 14 device (general-purpose) */
-timer_dev *TIMER14 = &timer14;
-#endif /* STM32_XL_DENSITY */
-
-/*
- * Routines
- */
-
-/**
- * @brief Call a function on timer devices.
- * @param fn Function to call on each timer device.
- */
-void timer_foreach(void (*fn)(timer_dev*)) {
- fn(TIMER1);
- fn(TIMER2);
- fn(TIMER3);
- fn(TIMER4);
-#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY)
- fn(TIMER5);
- fn(TIMER6);
- fn(TIMER7);
- fn(TIMER8);
-#endif
-#ifdef STM32_XL_DENSITY
- fn(TIMER9);
- fn(TIMER10);
- fn(TIMER11);
- fn(TIMER12);
- fn(TIMER13);
- fn(TIMER14);
-#endif
-}
-
-/*
* IRQ handlers
*
* Defer to the timer_private dispatch API.
@@ -149,26 +42,28 @@ void timer_foreach(void (*fn)(timer_dev*)) {
* FIXME: The names of these handlers are inaccurate since XL-density
* devices came out. Update these to match the STM32F2 names, maybe
* using some weak symbol magic to preserve backwards compatibility if
- * possible.
+ * possible. Once that's done, we can just move the IRQ handlers into
+ * the top-level libmaple/timer.c, and there will be no need for this
+ * file.
*/
void __irq_tim1_brk(void) {
dispatch_adv_brk(TIMER1);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(9)
dispatch_tim_9_12(TIMER9);
#endif
}
void __irq_tim1_up(void) {
dispatch_adv_up(TIMER1);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(10)
dispatch_tim_10_11_13_14(TIMER10);
#endif
}
void __irq_tim1_trg_com(void) {
dispatch_adv_trg_com(TIMER1);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(11)
dispatch_tim_10_11_13_14(TIMER11);
#endif
}
@@ -204,21 +99,21 @@ void __irq_tim7(void) {
void __irq_tim8_brk(void) {
dispatch_adv_brk(TIMER8);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(12)
dispatch_tim_9_12(TIMER12);
#endif
}
void __irq_tim8_up(void) {
dispatch_adv_up(TIMER8);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(13)
dispatch_tim_10_11_13_14(TIMER13);
#endif
}
void __irq_tim8_trg_com(void) {
dispatch_adv_trg_com(TIMER8);
-#ifdef STM32_XL_DENSITY
+#if STM32_HAVE_TIMER(14)
dispatch_tim_10_11_13_14(TIMER14);
#endif
}
diff --git a/libmaple/stm32f2/timer.c b/libmaple/stm32f2/timer.c
index 99dbf48..a85bea0 100644
--- a/libmaple/stm32f2/timer.c
+++ b/libmaple/stm32f2/timer.c
@@ -34,87 +34,10 @@
#include "timer_private.h"
/*
- * Devices
- *
- * Defer to the timer_private API for declaring these.
- */
-
-static timer_dev timer1 = ADVANCED_TIMER(1);
-static timer_dev timer2 = GENERAL_TIMER(2);
-static timer_dev timer3 = GENERAL_TIMER(3);
-static timer_dev timer4 = GENERAL_TIMER(4);
-static timer_dev timer5 = GENERAL_TIMER(5);
-static timer_dev timer6 = BASIC_TIMER(6);
-static timer_dev timer7 = BASIC_TIMER(7);
-static timer_dev timer8 = ADVANCED_TIMER(8);
-/* TIM9 has UIE, CC1IE, CC2IE, TIE bits in DIER. */
-static timer_dev timer9 = RESTRICTED_GENERAL_TIMER(9, TIMER_DIER_TIE_BIT);
-/* TIM10 has UIE, CC1IE. */
-static timer_dev timer10 = RESTRICTED_GENERAL_TIMER(10, TIMER_DIER_CC1IE_BIT);
-/* TIM11 has UIE, CC1IE. */
-static timer_dev timer11 = RESTRICTED_GENERAL_TIMER(11, TIMER_DIER_CC1IE_BIT);
-/* TIM12 has UIE, CC1IE, CC2IE, TIE. */
-static timer_dev timer12 = RESTRICTED_GENERAL_TIMER(12, TIMER_DIER_TIE_BIT);
-/* TIM13 has UIE, CC1IE. */
-static timer_dev timer13 = RESTRICTED_GENERAL_TIMER(13, TIMER_DIER_CC1IE_BIT);
-/* TIM14 has UIE, CC1IE. */
-static timer_dev timer14 = RESTRICTED_GENERAL_TIMER(14, TIMER_DIER_CC1IE_BIT);
-
-/** Timer 1 device (advanced) */
-timer_dev *TIMER1 = &timer1;
-/** Timer 2 device (general-purpose) */
-timer_dev *TIMER2 = &timer2;
-/** Timer 3 device (general-purpose) */
-timer_dev *TIMER3 = &timer3;
-/** Timer 4 device (general-purpose) */
-timer_dev *TIMER4 = &timer4;
-/** Timer 5 device (general-purpose) */
-timer_dev *TIMER5 = &timer5;
-/** Timer 6 device (basic) */
-timer_dev *TIMER6 = &timer6;
-/** Timer 7 device (basic) */
-timer_dev *TIMER7 = &timer7;
-/** Timer 8 device (advanced) */
-timer_dev *TIMER8 = &timer8;
-/** Timer 9 device (general-purpose) */
-timer_dev *TIMER9 = &timer9;
-/** Timer 10 device (general-purpose) */
-timer_dev *TIMER10 = &timer10;
-/** Timer 11 device (general-purpose) */
-timer_dev *TIMER11 = &timer11;
-/** Timer 12 device (general-purpose) */
-timer_dev *TIMER12 = &timer12;
-/** Timer 13 device (general-purpose) */
-timer_dev *TIMER13 = &timer13;
-/** Timer 14 device (general-purpose) */
-timer_dev *TIMER14 = &timer14;
-
-/*
* Routines
*/
/**
- * @brief Call a function on timer devices.
- * @param fn Function to call on each timer device.
- */
-void timer_foreach(void (*fn)(timer_dev*)) {
- fn(TIMER1);
- fn(TIMER2);
- fn(TIMER3);
- fn(TIMER4);
- fn(TIMER5);
- fn(TIMER6);
- fn(TIMER7);
- fn(TIMER8);
- fn(TIMER9);
- fn(TIMER10);
- fn(TIMER11);
- fn(TIMER12);
- fn(TIMER13);
- fn(TIMER14);
-}
-
-/**
* @brief Get the GPIO alternate function corresponding to a timer.
*
* For example, if dev is TIMER1, this function returns
diff --git a/libmaple/timer.c b/libmaple/timer.c
index cd9448a..24ae7fa 100644
--- a/libmaple/timer.c
+++ b/libmaple/timer.c
@@ -31,6 +31,8 @@
*/
#include <libmaple/timer.h>
+#include <libmaple/stm32.h>
+#include "timer_private.h"
static void disable_channel(timer_dev *dev, uint8 channel);
static void pwm_mode(timer_dev *dev, uint8 channel);
@@ -38,6 +40,136 @@ static void output_compare_mode(timer_dev *dev, uint8 channel);
static inline void enable_irq(timer_dev *dev, uint8 interrupt);
+/*
+ * Devices
+ *
+ * Defer to the timer_private API for declaring these.
+ */
+
+#if STM32_HAVE_TIMER(1)
+static timer_dev timer1 = ADVANCED_TIMER(1);
+/** Timer 1 device (advanced) */
+timer_dev *TIMER1 = &timer1;
+#endif
+#if STM32_HAVE_TIMER(2)
+static timer_dev timer2 = GENERAL_TIMER(2);
+/** Timer 2 device (general-purpose) */
+timer_dev *TIMER2 = &timer2;
+#endif
+#if STM32_HAVE_TIMER(3)
+static timer_dev timer3 = GENERAL_TIMER(3);
+/** Timer 3 device (general-purpose) */
+timer_dev *TIMER3 = &timer3;
+#endif
+#if STM32_HAVE_TIMER(4)
+static timer_dev timer4 = GENERAL_TIMER(4);
+/** Timer 4 device (general-purpose) */
+timer_dev *TIMER4 = &timer4;
+#endif
+#if STM32_HAVE_TIMER(5)
+static timer_dev timer5 = GENERAL_TIMER(5);
+/** Timer 5 device (general-purpose) */
+timer_dev *TIMER5 = &timer5;
+#endif
+#if STM32_HAVE_TIMER(6)
+static timer_dev timer6 = BASIC_TIMER(6);
+/** Timer 6 device (basic) */
+timer_dev *TIMER6 = &timer6;
+#endif
+#if STM32_HAVE_TIMER(7)
+static timer_dev timer7 = BASIC_TIMER(7);
+/** Timer 7 device (basic) */
+timer_dev *TIMER7 = &timer7;
+#endif
+#if STM32_HAVE_TIMER(8)
+static timer_dev timer8 = ADVANCED_TIMER(8);
+/** Timer 8 device (advanced) */
+timer_dev *TIMER8 = &timer8;
+#endif
+#if STM32_HAVE_TIMER(9)
+static timer_dev timer9 = RESTRICTED_GENERAL_TIMER(9, TIMER_DIER_TIE_BIT);
+/** Timer 9 device (general-purpose) */
+timer_dev *TIMER9 = &timer9;
+#endif
+#if STM32_HAVE_TIMER(10)
+static timer_dev timer10 = RESTRICTED_GENERAL_TIMER(10, TIMER_DIER_CC1IE_BIT);
+/** Timer 10 device (general-purpose) */
+timer_dev *TIMER10 = &timer10;
+#endif
+#if STM32_HAVE_TIMER(11)
+static timer_dev timer11 = RESTRICTED_GENERAL_TIMER(11, TIMER_DIER_CC1IE_BIT);
+/** Timer 11 device (general-purpose) */
+timer_dev *TIMER11 = &timer11;
+#endif
+#if STM32_HAVE_TIMER(12)
+static timer_dev timer12 = RESTRICTED_GENERAL_TIMER(12, TIMER_DIER_TIE_BIT);
+/** Timer 12 device (general-purpose) */
+timer_dev *TIMER12 = &timer12;
+#endif
+#if STM32_HAVE_TIMER(13)
+static timer_dev timer13 = RESTRICTED_GENERAL_TIMER(13, TIMER_DIER_CC1IE_BIT);
+/** Timer 13 device (general-purpose) */
+timer_dev *TIMER13 = &timer13;
+#endif
+#if STM32_HAVE_TIMER(14)
+static timer_dev timer14 = RESTRICTED_GENERAL_TIMER(14, TIMER_DIER_CC1IE_BIT);
+/** Timer 14 device (general-purpose) */
+timer_dev *TIMER14 = &timer14;
+#endif
+
+/*
+ * Routines
+ */
+
+/**
+ * @brief Call a function on timer devices.
+ * @param fn Function to call on each timer device.
+ */
+void timer_foreach(void (*fn)(timer_dev*)) {
+#if STM32_HAVE_TIMER(1)
+ fn(TIMER1);
+#endif
+#if STM32_HAVE_TIMER(2)
+ fn(TIMER2);
+#endif
+#if STM32_HAVE_TIMER(3)
+ fn(TIMER3);
+#endif
+#if STM32_HAVE_TIMER(4)
+ fn(TIMER4);
+#endif
+#if STM32_HAVE_TIMER(5)
+ fn(TIMER5);
+#endif
+#if STM32_HAVE_TIMER(6)
+ fn(TIMER6);
+#endif
+#if STM32_HAVE_TIMER(7)
+ fn(TIMER7);
+#endif
+#if STM32_HAVE_TIMER(8)
+ fn(TIMER8);
+#endif
+#if STM32_HAVE_TIMER(9)
+ fn(TIMER9);
+#endif
+#if STM32_HAVE_TIMER(10)
+ fn(TIMER10);
+#endif
+#if STM32_HAVE_TIMER(11)
+ fn(TIMER11);
+#endif
+#if STM32_HAVE_TIMER(12)
+ fn(TIMER12);
+#endif
+#if STM32_HAVE_TIMER(13)
+ fn(TIMER13);
+#endif
+#if STM32_HAVE_TIMER(14)
+ fn(TIMER14);
+#endif
+}
+
/**
* Initialize a timer, and reset its register map.
* @param dev Timer to initialize