aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/stm32f1
diff options
context:
space:
mode:
Diffstat (limited to 'libmaple/stm32f1')
-rw-r--r--libmaple/stm32f1/timer.c125
1 files changed, 10 insertions, 115 deletions
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
}