Very big update according to API documented for LPC122x and LPC82x micro-controllers
[lpc11u3x] / include / core / systick.h
1 /****************************************************************************
2  *   core/systick.h
3  *
4  * System tick timer control
5  *
6  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
7  *
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  *************************************************************************** */
24 #ifndef CORE_SYSTICK_H
25 #define CORE_SYSTICK_H
27 #include "lib/stdint.h"
28 #include "core/lpc_regs.h"
30 /***************************************************************************** */
31 /*               System Tick Timer                                             */
32 /***************************************************************************** */
34 /* Driver for the internal systick timer of the LPC11u3x. */
36 /* Start the system tick timer
37  * Starting the systick timer also resets the internal tick counters.
38  * If you need a value that goes beyond one start/stop cycle and accross resets,
39  *    then it's up to you to keep track of this using systick_get_tick_count() and/or
40  *    systick_get_clock_cycles().
41  */
42 void systick_start(void);
44 /* Stop the system tick timer */
45 void systick_stop(void);
47 /* Reset the system tick timer, making it count down from the reload value again
48  * Reseting the systick timer also resets the internal tick counters.
49  * If you need a value that goes beyond one start/stop cycle and accross resets,
50  *    then it's up to you to keep track of this using systick_get_tick_count() and/or
51  *    systick_get_clock_cycles().
52  */
53 void systick_reset(void);
55 /* Get system tick timer current value (counts at get_main_clock() !)
56  * systick_get_timer_val returns a value between 0 and systick_get_timer_reload_val()
57  */
58 uint32_t systick_get_timer_val(void);
60 /* Get system tick timer reload value */
61 uint32_t systick_get_timer_reload_val(void);
63 /* Check if systick is running (return 1) or not (return 0) */
64 uint32_t is_systick_running(void);
66 /* Get the system tick period in ms
67  * A vaue of 0 means the system tick timer has not been configured.
68  * Note : calls to msleep() or usleep() will configure the system tick timer
69  *        with a value of 1ms if it was not configured yet.
70  */
71 uint32_t systick_get_tick_ms_period(void);
73 /* Get the number of system ticks ... since last wrapping of the counter, which
74  * is about 50 days with a 1ms system tick. */
75 uint32_t systick_get_tick_count(void);
77 /* Get the number of clock cycles ... since last wrapping of the counter. */
78 uint32_t systick_get_clock_cycles(void);
80 /* Power up the system tick timer.
81  * ms is the interval between system tick timer interrupts. If set to 0, the default
82  *     value is used, which should provide a 1ms period.
83  */
84 void systick_timer_on(uint32_t ms);
86 /* Removes the main clock from the selected timer block */
87 void systick_timer_off(void);
89 /* Register a callback to be called every 'period' system ticks.
90  * returns the callback number if registration was OK.
91  * returns negative value on error.
92  * The callback will get the "global_wrapping_system_ticks" as argument, which wraps every 50 days
93  *   or so with a 1ms tick
94  */
95 #define MAX_SYSTICK_CALLBACKS  4
96 int add_systick_callback(void (*callback) (uint32_t), uint16_t period);
97 /* Remove a registered callback, given the callback address used to register it. */
98 int remove_systick_callback(void (*callback) (uint32_t));
102 /* This function can be used when you are absolutly certain that systick timer is running, and when
103  * you need to sleep less than 1000us (1ms)
104  */
105 void usleep_short(uint32_t us);
109 /***************************************************************************** */
110 /*                    Cortex-M0 System Timer                                   */
111 /***************************************************************************** */
112 /* Cortex-M0 System Timer Registers */
113 struct lpc_system_tick {
114         volatile uint32_t control;     /* 0x000 : SysTick Control and Status Register (R/W) */
115         volatile uint32_t reload_val;  /* 0x004 : SysTick Reload Value Register (R/W) */
116         volatile uint32_t value;       /* 0x008 : SysTick Current Value Register (R/W) */
117         volatile const uint32_t calibration;  /* 0x00C : SysTick Calibration Register (R/ ) */
118 };
119 #define LPC_SYSTICK  ((struct lpc_system_tick*) LPC_SYSTICK_BASE) /* SysTick configuration struct */
121 /* SysTick Control / Status Register Definitions */
122 #define LPC_SYSTICK_CTRL_COUNTFLAG  (1UL << 16)   /* SysTick CTRL: COUNTFLAG Mask */
123 #define LPC_SYSTICK_CTRL_CLKSOURCE  (1UL << 2)    /* SysTick CTRL: CLKSOURCE Mask */
124 #define LPC_SYSTICK_CTRL_CLK_MAIN   (1UL << 2)    /* SysTick CTRL: CLKSOURCE is main clock */
125 #define LPC_SYSTICK_CTRL_TICKINT    (1UL << 1)    /* SysTick CTRL: TICKINT Mask */
126 #define LPC_SYSTICK_CTRL_ENABLE     (1UL << 0)    /* SysTick CTRL: ENABLE Mask */
128 /* SysTick Reload Register Definitions */
129 #define LPC_SYSTICK_LOAD_RELOAD     (0xFFFFFFUL)  /* SysTick LOAD: RELOAD Mask */
131 /* SysTick Current Register Definitions */
132 #define LPC_SYSTICK_VAL_CURRENT     (0xFFFFFFUL)  /* SysTick VAL: CURRENT Mask */
134 /* SysTick Calibration Register Definitions */
135 #define LPC_SYSTICK_CALIB_NOREF     (1UL << 31)   /* SysTick CALIB: NOREF Mask */
136 #define LPC_SYSTICK_CALIB_SKEW      (1UL << 30)   /* SysTick CALIB: SKEW Mask */
137 #define LPC_SYSTICK_CALIB_TENMS     (0xFFFFFFUL)  /* SysTick CALIB: TENMS Mask */
141 #endif /* CORE_SYSTICK_H */