aboutsummaryrefslogtreecommitdiffstats
path: root/wirish/HardwareTimer.cpp
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-06-01 03:26:19 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-06-01 03:27:05 -0400
commit73f2cefbdf6d8f255bc5284c64d315f38ee45616 (patch)
tree921a46ea5a1de17131b1cba3e6a42de52d870961 /wirish/HardwareTimer.cpp
parent5befb0826a1ff77994c55f42cd73ccf0905a5ce0 (diff)
downloadlibrambutan-73f2cefbdf6d8f255bc5284c64d315f38ee45616.tar.gz
librambutan-73f2cefbdf6d8f255bc5284c64d315f38ee45616.zip
Bring back HardwareTimer.
Untested, but the timers work on F2 (see exampes/test-timers.cpp), so I'm hoping this is mostly OK. Note that there's an issue with TIMER2 and TIMER5 on F2: these timers have 32-bit counters, and the HardwareTimer methods are all based on uint16 (like on F1). I'm sorely tempted to keep this as-is; exposing the extra bits is just extra documentation, and the HardwareTimer interface is already way too complicated. The interface should still _work_; it just hides the fact that you're missing out on the extra bits for some of the timers. Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Diffstat (limited to 'wirish/HardwareTimer.cpp')
-rw-r--r--wirish/HardwareTimer.cpp123
1 files changed, 102 insertions, 21 deletions
diff --git a/wirish/HardwareTimer.cpp b/wirish/HardwareTimer.cpp
index 52257bf..ca8ea63 100644
--- a/wirish/HardwareTimer.cpp
+++ b/wirish/HardwareTimer.cpp
@@ -30,33 +30,114 @@
// TODO [0.1.0] Remove deprecated pieces
-#ifdef STM32_MEDIUM_DENSITY
-#define NR_TIMERS 4
-#elif defined(STM32_HIGH_DENSITY)
-#define NR_TIMERS 8
+#define MAX_RELOAD ((1 << 16) - 1)
+
+/*
+ * Big ugly table of timers available on the MCU. Needed by the
+ * HardwareTimer constructor. Sigh; maybe predefined instances weren't
+ * such a bad idea. Oh well, at least the HardwareTimer interface is
+ * officially unstable since v0.0.12; we can always get rid of this
+ * later.
+ */
+
+#define MAX_NR_TIMERS 17 // No STM32 I've ever heard of has higher than TIMER17
+
+static timer_dev *devs[MAX_NR_TIMERS] = {
+#if STM32_HAVE_TIMER(1)
+ TIMER1,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(2)
+ TIMER2,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(3)
+ TIMER3,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(4)
+ TIMER4,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(5)
+ TIMER5,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(6)
+ TIMER6,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(7)
+ TIMER7,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(8)
+ TIMER8,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(9)
+ TIMER9,
#else
-#error "Unsupported density"
+ NULL,
#endif
+#if STM32_HAVE_TIMER(10)
+ TIMER10,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(11)
+ TIMER11,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(12)
+ TIMER12,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(13)
+ TIMER13,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(14)
+ TIMER14,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(15)
+ TIMER15,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(16)
+ TIMER16,
+#else
+ NULL,
+#endif
+#if STM32_HAVE_TIMER(17)
+ TIMER17,
+#else
+ NULL,
+#endif
+};
-#define MAX_RELOAD ((1 << 16) - 1)
+/*
+ * HardwareTimer routines
+ */
HardwareTimer::HardwareTimer(uint8 timerNum) {
- if (timerNum > NR_TIMERS) {
- ASSERT(0);
- }
- timer_dev *devs[] = {
- TIMER1,
- TIMER2,
- TIMER3,
- TIMER4,
-#ifdef STM32_HIGH_DENSITY
- TIMER5,
- TIMER6,
- TIMER7,
- TIMER8,
-#endif
- };
+ ASSERT(timerNum <= MAX_NR_TIMERS);
this->dev = devs[timerNum - 1];
+ ASSERT(this->dev != NULL);
}
void HardwareTimer::pause(void) {