]> begriffs open source - cmsis-freertos/blob - Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c
Set error state if no delay or already expired
[cmsis-freertos] / Demo / CORTEX_LM3S811_IAR / LuminaryCode / systick.c
1 //*****************************************************************************
2 //
3 // systick.c - Driver for the SysTick timer in NVIC.
4 //
5 // Copyright (c) 2005,2006 Luminary Micro, Inc.  All rights reserved.
6 //
7 // Software License Agreement
8 //
9 // Luminary Micro, Inc. (LMI) is supplying this software for use solely and
10 // exclusively on LMI's Stellaris Family of microcontroller products.
11 //
12 // The software is owned by LMI and/or its suppliers, and is protected under
13 // applicable copyright laws.  All rights are reserved.  Any use in violation
14 // of the foregoing restrictions may subject the user to criminal sanctions
15 // under applicable laws, as well as to civil liability for the breach of the
16 // terms and conditions of this license.
17 //
18 // THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
19 // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
20 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
21 // LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
22 // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
23 //
24 // This is part of revision 991 of the Stellaris Driver Library.
25 //
26 //*****************************************************************************
27
28 //*****************************************************************************
29 //
30 //! \addtogroup systick_api
31 //! @{
32 //
33 //*****************************************************************************
34
35 #include "../hw_ints.h"
36 #include "../hw_nvic.h"
37 #include "../hw_types.h"
38 #include "debug.h"
39 #include "interrupt.h"
40 #include "systick.h"
41
42 //*****************************************************************************
43 //
44 //! Enables the SysTick counter.
45 //!
46 //! This will start the SysTick counter.  If an interrupt handler has been
47 //! registered, it will be called when the SysTick counter rolls over.
48 //!
49 //! \return None.
50 //
51 //*****************************************************************************
52 #if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN)
53 void
54 SysTickEnable(void)
55 {
56     //
57     // Enable SysTick.
58     //
59     HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE;
60 }
61 #endif
62
63 //*****************************************************************************
64 //
65 //! Disables the SysTick counter.
66 //!
67 //! This will stop the SysTick counter.  If an interrupt handler has been
68 //! registered, it will no longer be called until SysTick is restarted.
69 //!
70 //! \return None.
71 //
72 //*****************************************************************************
73 #if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN)
74 void
75 SysTickDisable(void)
76 {
77     //
78     // Disable SysTick.
79     //
80     HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_ENABLE);
81 }
82 #endif
83
84 //*****************************************************************************
85 //
86 //! Registers an interrupt handler for the SysTick interrupt.
87 //!
88 //! \param pfnHandler is a pointer to the function to be called when the
89 //! SysTick interrupt occurs.
90 //!
91 //! This sets the handler to be called when a SysTick interrupt occurs.
92 //!
93 //! \sa IntRegister() for important information about registering interrupt
94 //! handlers.
95 //!
96 //! \return None.
97 //
98 //*****************************************************************************
99 #if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN)
100 void
101 SysTickIntRegister(void (*pfnHandler)(void))
102 {
103     //
104     // Register the interrupt handler, returning an error if an error occurs.
105     //
106     IntRegister(FAULT_SYSTICK, pfnHandler);
107
108     //
109     // Enable the SysTick interrupt.
110     //
111     HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN;
112 }
113 #endif
114
115 //*****************************************************************************
116 //
117 //! Unregisters the interrupt handler for the SysTick interrupt.
118 //!
119 //! This function will clear the handler to be called when a SysTick interrupt
120 //! occurs.
121 //!
122 //! \sa IntRegister() for important information about registering interrupt
123 //! handlers.
124 //!
125 //! \return None.
126 //
127 //*****************************************************************************
128 #if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN)
129 void
130 SysTickIntUnregister(void)
131 {
132     //
133     // Disable the SysTick interrupt.
134     //
135     HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN);
136
137     //
138     // Unregister the interrupt handler.
139     //
140     IntUnregister(FAULT_SYSTICK);
141 }
142 #endif
143
144 //*****************************************************************************
145 //
146 //! Enables the SysTick interrupt.
147 //!
148 //! This function will enable the SysTick interrupt, allowing it to be
149 //! reflected to the processor.
150 //!
151 //! \return None.
152 //
153 //*****************************************************************************
154 #if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN)
155 void
156 SysTickIntEnable(void)
157 {
158     //
159     // Enable the SysTick interrupt.
160     //
161     HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN;
162 }
163 #endif
164
165 //*****************************************************************************
166 //
167 //! Disables the SysTick interrupt.
168 //!
169 //! This function will disable the SysTick interrupt, preventing it from being
170 //! reflected to the processor.
171 //!
172 //! \return None.
173 //
174 //*****************************************************************************
175 #if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN)
176 void
177 SysTickIntDisable(void)
178 {
179     //
180     // Disable the SysTick interrupt.
181     //
182     HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN);
183 }
184 #endif
185
186 //*****************************************************************************
187 //
188 //! Sets the period of the SysTick counter.
189 //!
190 //! \param ulPeriod is the number of clock ticks in each period of the SysTick
191 //! counter; must be between 1 and 16,777,216, inclusive.
192 //!
193 //! This function sets the rate at which the SysTick counter wraps; this
194 //! equates to the number of processor clocks between interrupts.
195 //!
196 //! \return None.
197 //
198 //*****************************************************************************
199 #if defined(GROUP_periodset) || defined(BUILD_ALL) || defined(DOXYGEN)
200 void
201 SysTickPeriodSet(unsigned long ulPeriod)
202 {
203     //
204     // Check the arguments.
205     //
206     ASSERT((ulPeriod > 0) && (ulPeriod <= 16777216));
207
208     //
209     // Set the period of the SysTick counter.
210     //
211     HWREG(NVIC_ST_RELOAD) = ulPeriod - 1;
212 }
213 #endif
214
215 //*****************************************************************************
216 //
217 //! Gets the period of the SysTick counter.
218 //!
219 //! This function returns the rate at which the SysTick counter wraps; this
220 //! equates to the number of processor clocks between interrupts.
221 //!
222 //! \return Returns the period of the SysTick counter.
223 //
224 //*****************************************************************************
225 #if defined(GROUP_periodget) || defined(BUILD_ALL) || defined(DOXYGEN)
226 unsigned long
227 SysTickPeriodGet(void)
228 {
229     //
230     // Return the period of the SysTick counter.
231     //
232     return(HWREG(NVIC_ST_RELOAD) + 1);
233 }
234 #endif
235
236 //*****************************************************************************
237 //
238 //! Gets the current value of the SysTick counter.
239 //!
240 //! This function returns the current value of the SysTick counter; this will
241 //! be a value between the period - 1 and zero, inclusive.
242 //!
243 //! \return Returns the current value of the SysTick counter.
244 //
245 //*****************************************************************************
246 #if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN)
247 unsigned long
248 SysTickValueGet(void)
249 {
250     //
251     // Return the current value of the SysTick counter.
252     //
253     return(HWREG(NVIC_ST_CURRENT));
254 }
255 #endif
256
257 //*****************************************************************************
258 //
259 // Close the Doxygen group.
260 //! @}
261 //
262 //*****************************************************************************