aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/systick.h
diff options
context:
space:
mode:
Diffstat (limited to 'libmaple/systick.h')
-rw-r--r--libmaple/systick.h46
1 files changed, 38 insertions, 8 deletions
diff --git a/libmaple/systick.h b/libmaple/systick.h
index 33a3cf8..35b4cb9 100644
--- a/libmaple/systick.h
+++ b/libmaple/systick.h
@@ -31,30 +31,60 @@
#ifndef _SYSTICK_H_
#define _SYSTICK_H_
-#include "libmaple.h"
+#include "libmaple_types.h"
+#include "util.h"
#ifdef __cplusplus
extern "C"{
#endif
-#define SYSTICK_CSR 0xE000E010 // Control and status register
-#define SYSTICK_CNT 0xE000E018 // Current value register
+/** SysTick register map type */
+typedef struct systick_reg_map {
+ __io uint32 CSR; /**< Control and status register */
+ __io uint32 RVR; /**< Reload value register */
+ __io uint32 CNT; /**< Current value register ("count") */
+ __io uint32 CVR; /**< Calibration value register */
+} systick_reg_map;
-#define SYSTICK_CSR_COUNTFLAG BIT(16)
+/** SysTick register map base pointer */
+#define SYSTICK_BASE ((struct systick_reg_map*)0xE000E010)
-/** System elapsed time in milliseconds */
+/*
+ * Register bit definitions.
+ */
+
+/* Control and status register */
+
+#define SYSTICK_CSR_COUNTFLAG BIT(16)
+#define SYSTICK_CSR_CLKSOURCE BIT(2)
+#define SYSTICK_CSR_CLKSOURCE_EXTERNAL 0
+#define SYSTICK_CSR_CLKSOURCE_CORE BIT(2)
+#define SYSTICK_CSR_TICKINT BIT(1)
+#define SYSTICK_CSR_TICKINT_PEND BIT(1)
+#define SYSTICK_CSR_TICKINT_NO_PEND 0
+#define SYSTICK_CSR_ENABLE BIT(0)
+#define SYSTICK_CSR_ENABLE_MULTISHOT BIT(0)
+#define SYSTICK_CSR_ENABLE_DISABLED 0
+
+/* Calibration value register */
+
+#define SYSTICK_CVR_NOREF BIT(31)
+#define SYSTICK_CVR_SKEW BIT(30)
+#define SYSTICK_CVR_TENMS 0xFFFFFF
+
+/** System elapsed time, in milliseconds */
extern volatile uint32 systick_timer_millis;
void systick_init(uint32 reload_val);
void systick_disable();
-void systick_resume();
+void systick_enable();
static inline uint32 systick_get_count(void) {
- return __read(SYSTICK_CNT);
+ return SYSTICK_BASE->CNT;
}
static inline uint32 systick_check_underflow(void) {
- return (__read(SYSTICK_CSR) & SYSTICK_CSR_COUNTFLAG);
+ return SYSTICK_BASE->CSR & SYSTICK_CSR_COUNTFLAG;
}
#ifdef __cplusplus