Upgrade gcc4mbed project used by Smoothie.
[clinton/Smoothieware.git] / gcc4mbed / external / mbed / LPC1768 / core_cmFunc.h
CommitLineData
8fcce42e
AG
1/**************************************************************************//**\r
2 * @file core_cmFunc.h\r
3 * @brief CMSIS Cortex-M Core Function Access Header File\r
4 * @version V3.00\r
5 * @date 09. December 2011\r
6 *\r
7 * @note\r
8 * Copyright (C) 2009-2011 ARM Limited. All rights reserved.\r
9 *\r
10 * @par\r
11 * ARM Limited (ARM) is supplying this software for use with Cortex-M \r
12 * processor based microcontrollers. This file can be freely distributed \r
13 * within development tools that are supporting such ARM based processors. \r
14 *\r
15 * @par\r
16 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
17 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
19 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
20 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
21 *\r
22 ******************************************************************************/\r
23\r
24#ifndef __CORE_CMFUNC_H\r
25#define __CORE_CMFUNC_H\r
26\r
27\r
28/* ########################### Core Function Access ########################### */\r
29/** \ingroup CMSIS_Core_FunctionInterface \r
30 \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\r
31 @{\r
32 */\r
33\r
34#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/\r
35/* ARM armcc specific functions */\r
36\r
37#if (__ARMCC_VERSION < 400677)\r
38 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"\r
39#endif\r
40\r
41/* intrinsic void __enable_irq(); */\r
42/* intrinsic void __disable_irq(); */\r
43\r
44/** \brief Get Control Register\r
45\r
46 This function returns the content of the Control Register.\r
47\r
48 \return Control Register value\r
49 */\r
50static __INLINE uint32_t __get_CONTROL(void)\r
51{\r
52 register uint32_t __regControl __ASM("control");\r
53 return(__regControl);\r
54}\r
55\r
56\r
57/** \brief Set Control Register\r
58\r
59 This function writes the given value to the Control Register.\r
60\r
61 \param [in] control Control Register value to set\r
62 */\r
63static __INLINE void __set_CONTROL(uint32_t control)\r
64{\r
65 register uint32_t __regControl __ASM("control");\r
66 __regControl = control;\r
67}\r
68\r
69\r
70/** \brief Get IPSR Register\r
71\r
72 This function returns the content of the IPSR Register.\r
73\r
74 \return IPSR Register value\r
75 */\r
76static __INLINE uint32_t __get_IPSR(void)\r
77{\r
78 register uint32_t __regIPSR __ASM("ipsr");\r
79 return(__regIPSR);\r
80}\r
81\r
82\r
83/** \brief Get APSR Register\r
84\r
85 This function returns the content of the APSR Register.\r
86\r
87 \return APSR Register value\r
88 */\r
89static __INLINE uint32_t __get_APSR(void)\r
90{\r
91 register uint32_t __regAPSR __ASM("apsr");\r
92 return(__regAPSR);\r
93}\r
94\r
95\r
96/** \brief Get xPSR Register\r
97\r
98 This function returns the content of the xPSR Register.\r
99\r
100 \return xPSR Register value\r
101 */\r
102static __INLINE uint32_t __get_xPSR(void)\r
103{\r
104 register uint32_t __regXPSR __ASM("xpsr");\r
105 return(__regXPSR);\r
106}\r
107\r
108\r
109/** \brief Get Process Stack Pointer\r
110\r
111 This function returns the current value of the Process Stack Pointer (PSP).\r
112\r
113 \return PSP Register value\r
114 */\r
115static __INLINE uint32_t __get_PSP(void)\r
116{\r
117 register uint32_t __regProcessStackPointer __ASM("psp");\r
118 return(__regProcessStackPointer);\r
119}\r
120\r
121\r
122/** \brief Set Process Stack Pointer\r
123\r
124 This function assigns the given value to the Process Stack Pointer (PSP).\r
125\r
126 \param [in] topOfProcStack Process Stack Pointer value to set\r
127 */\r
128static __INLINE void __set_PSP(uint32_t topOfProcStack)\r
129{\r
130 register uint32_t __regProcessStackPointer __ASM("psp");\r
131 __regProcessStackPointer = topOfProcStack;\r
132}\r
133\r
134\r
135/** \brief Get Main Stack Pointer\r
136\r
137 This function returns the current value of the Main Stack Pointer (MSP).\r
138\r
139 \return MSP Register value\r
140 */\r
141static __INLINE uint32_t __get_MSP(void)\r
142{\r
143 register uint32_t __regMainStackPointer __ASM("msp");\r
144 return(__regMainStackPointer);\r
145}\r
146\r
147\r
148/** \brief Set Main Stack Pointer\r
149\r
150 This function assigns the given value to the Main Stack Pointer (MSP).\r
151\r
152 \param [in] topOfMainStack Main Stack Pointer value to set\r
153 */\r
154static __INLINE void __set_MSP(uint32_t topOfMainStack)\r
155{\r
156 register uint32_t __regMainStackPointer __ASM("msp");\r
157 __regMainStackPointer = topOfMainStack;\r
158}\r
159\r
160\r
161/** \brief Get Priority Mask\r
162\r
163 This function returns the current state of the priority mask bit from the Priority Mask Register.\r
164\r
165 \return Priority Mask value\r
166 */\r
167static __INLINE uint32_t __get_PRIMASK(void)\r
168{\r
169 register uint32_t __regPriMask __ASM("primask");\r
170 return(__regPriMask);\r
171}\r
172\r
173\r
174/** \brief Set Priority Mask\r
175\r
176 This function assigns the given value to the Priority Mask Register.\r
177\r
178 \param [in] priMask Priority Mask\r
179 */\r
180static __INLINE void __set_PRIMASK(uint32_t priMask)\r
181{\r
182 register uint32_t __regPriMask __ASM("primask");\r
183 __regPriMask = (priMask);\r
184}\r
185 \r
186\r
187#if (__CORTEX_M >= 0x03)\r
188\r
189/** \brief Enable FIQ\r
190\r
191 This function enables FIQ interrupts by clearing the F-bit in the CPSR.\r
192 Can only be executed in Privileged modes.\r
193 */\r
194#define __enable_fault_irq __enable_fiq\r
195\r
196\r
197/** \brief Disable FIQ\r
198\r
199 This function disables FIQ interrupts by setting the F-bit in the CPSR.\r
200 Can only be executed in Privileged modes.\r
201 */\r
202#define __disable_fault_irq __disable_fiq\r
203\r
204\r
205/** \brief Get Base Priority\r
206\r
207 This function returns the current value of the Base Priority register.\r
208\r
209 \return Base Priority register value\r
210 */\r
211static __INLINE uint32_t __get_BASEPRI(void)\r
212{\r
213 register uint32_t __regBasePri __ASM("basepri");\r
214 return(__regBasePri);\r
215}\r
216\r
217\r
218/** \brief Set Base Priority\r
219\r
220 This function assigns the given value to the Base Priority register.\r
221\r
222 \param [in] basePri Base Priority value to set\r
223 */\r
224static __INLINE void __set_BASEPRI(uint32_t basePri)\r
225{\r
226 register uint32_t __regBasePri __ASM("basepri");\r
227 __regBasePri = (basePri & 0xff);\r
228}\r
229 \r
230\r
231/** \brief Get Fault Mask\r
232\r
233 This function returns the current value of the Fault Mask register.\r
234\r
235 \return Fault Mask register value\r
236 */\r
237static __INLINE uint32_t __get_FAULTMASK(void)\r
238{\r
239 register uint32_t __regFaultMask __ASM("faultmask");\r
240 return(__regFaultMask);\r
241}\r
242\r
243\r
244/** \brief Set Fault Mask\r
245\r
246 This function assigns the given value to the Fault Mask register.\r
247\r
248 \param [in] faultMask Fault Mask value to set\r
249 */\r
250static __INLINE void __set_FAULTMASK(uint32_t faultMask)\r
251{\r
252 register uint32_t __regFaultMask __ASM("faultmask");\r
253 __regFaultMask = (faultMask & (uint32_t)1);\r
254}\r
255\r
256#endif /* (__CORTEX_M >= 0x03) */\r
257\r
258\r
259#if (__CORTEX_M == 0x04)\r
260\r
261/** \brief Get FPSCR\r
262\r
263 This function returns the current value of the Floating Point Status/Control register.\r
264\r
265 \return Floating Point Status/Control register value\r
266 */\r
267static __INLINE uint32_t __get_FPSCR(void)\r
268{\r
269#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
270 register uint32_t __regfpscr __ASM("fpscr");\r
271 return(__regfpscr);\r
272#else\r
273 return(0);\r
274#endif\r
275}\r
276\r
277\r
278/** \brief Set FPSCR\r
279\r
280 This function assigns the given value to the Floating Point Status/Control register.\r
281\r
282 \param [in] fpscr Floating Point Status/Control value to set\r
283 */\r
284static __INLINE void __set_FPSCR(uint32_t fpscr)\r
285{\r
286#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
287 register uint32_t __regfpscr __ASM("fpscr");\r
288 __regfpscr = (fpscr);\r
289#endif\r
290}\r
291\r
292#endif /* (__CORTEX_M == 0x04) */\r
293\r
294\r
295#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/\r
296/* IAR iccarm specific functions */\r
297\r
298#include <cmsis_iar.h>\r
299\r
300#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/\r
301/* GNU gcc specific functions */\r
302\r
303/** \brief Enable IRQ Interrupts\r
304\r
305 This function enables IRQ interrupts by clearing the I-bit in the CPSR.\r
306 Can only be executed in Privileged modes.\r
307 */\r
308__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void)\r
309{\r
310 __ASM volatile ("cpsie i");\r
311}\r
312\r
313\r
314/** \brief Disable IRQ Interrupts\r
315\r
316 This function disables IRQ interrupts by setting the I-bit in the CPSR.\r
317 Can only be executed in Privileged modes.\r
318 */\r
319__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void)\r
320{\r
321 __ASM volatile ("cpsid i");\r
322}\r
323\r
324\r
325/** \brief Get Control Register\r
326\r
327 This function returns the content of the Control Register.\r
328\r
329 \return Control Register value\r
330 */\r
331__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void)\r
332{\r
333 uint32_t result;\r
334\r
335 __ASM volatile ("MRS %0, control" : "=r" (result) );\r
336 return(result);\r
337}\r
338\r
339\r
340/** \brief Set Control Register\r
341\r
342 This function writes the given value to the Control Register.\r
343\r
344 \param [in] control Control Register value to set\r
345 */\r
346__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control)\r
347{\r
348 __ASM volatile ("MSR control, %0" : : "r" (control) );\r
349}\r
350\r
351\r
352/** \brief Get IPSR Register\r
353\r
354 This function returns the content of the IPSR Register.\r
355\r
356 \return IPSR Register value\r
357 */\r
358__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void)\r
359{\r
360 uint32_t result;\r
361\r
362 __ASM volatile ("MRS %0, ipsr" : "=r" (result) );\r
363 return(result);\r
364}\r
365\r
366\r
367/** \brief Get APSR Register\r
368\r
369 This function returns the content of the APSR Register.\r
370\r
371 \return APSR Register value\r
372 */\r
373__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void)\r
374{\r
375 uint32_t result;\r
376\r
377 __ASM volatile ("MRS %0, apsr" : "=r" (result) );\r
378 return(result);\r
379}\r
380\r
381\r
382/** \brief Get xPSR Register\r
383\r
384 This function returns the content of the xPSR Register.\r
385\r
386 \return xPSR Register value\r
387 */\r
388__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void)\r
389{\r
390 uint32_t result;\r
391\r
392 __ASM volatile ("MRS %0, xpsr" : "=r" (result) );\r
393 return(result);\r
394}\r
395\r
396\r
397/** \brief Get Process Stack Pointer\r
398\r
399 This function returns the current value of the Process Stack Pointer (PSP).\r
400\r
401 \return PSP Register value\r
402 */\r
403__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void)\r
404{\r
405 register uint32_t result;\r
406\r
407 __ASM volatile ("MRS %0, psp\n" : "=r" (result) );\r
408 return(result);\r
409}\r
410 \r
411\r
412/** \brief Set Process Stack Pointer\r
413\r
414 This function assigns the given value to the Process Stack Pointer (PSP).\r
415\r
416 \param [in] topOfProcStack Process Stack Pointer value to set\r
417 */\r
418__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack)\r
419{\r
420 __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );\r
421}\r
422\r
423\r
424/** \brief Get Main Stack Pointer\r
425\r
426 This function returns the current value of the Main Stack Pointer (MSP).\r
427\r
428 \return MSP Register value\r
429 */\r
430__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void)\r
431{\r
432 register uint32_t result;\r
433\r
434 __ASM volatile ("MRS %0, msp\n" : "=r" (result) );\r
435 return(result);\r
436}\r
437 \r
438\r
439/** \brief Set Main Stack Pointer\r
440\r
441 This function assigns the given value to the Main Stack Pointer (MSP).\r
442\r
443 \param [in] topOfMainStack Main Stack Pointer value to set\r
444 */\r
445__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack)\r
446{\r
447 __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );\r
448}\r
449\r
450\r
451/** \brief Get Priority Mask\r
452\r
453 This function returns the current state of the priority mask bit from the Priority Mask Register.\r
454\r
455 \return Priority Mask value\r
456 */\r
457__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void)\r
458{\r
459 uint32_t result;\r
460\r
461 __ASM volatile ("MRS %0, primask" : "=r" (result) );\r
462 return(result);\r
463}\r
464\r
465\r
466/** \brief Set Priority Mask\r
467\r
468 This function assigns the given value to the Priority Mask Register.\r
469\r
470 \param [in] priMask Priority Mask\r
471 */\r
472__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask)\r
473{\r
474 __ASM volatile ("MSR primask, %0" : : "r" (priMask) );\r
475}\r
476 \r
477\r
478#if (__CORTEX_M >= 0x03)\r
479\r
480/** \brief Enable FIQ\r
481\r
482 This function enables FIQ interrupts by clearing the F-bit in the CPSR.\r
483 Can only be executed in Privileged modes.\r
484 */\r
485__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void)\r
486{\r
487 __ASM volatile ("cpsie f");\r
488}\r
489\r
490\r
491/** \brief Disable FIQ\r
492\r
493 This function disables FIQ interrupts by setting the F-bit in the CPSR.\r
494 Can only be executed in Privileged modes.\r
495 */\r
496__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void)\r
497{\r
498 __ASM volatile ("cpsid f");\r
499}\r
500\r
501\r
502/** \brief Get Base Priority\r
503\r
504 This function returns the current value of the Base Priority register.\r
505\r
506 \return Base Priority register value\r
507 */\r
508__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void)\r
509{\r
510 uint32_t result;\r
511 \r
512 __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );\r
513 return(result);\r
514}\r
515\r
516\r
517/** \brief Set Base Priority\r
518\r
519 This function assigns the given value to the Base Priority register.\r
520\r
521 \param [in] basePri Base Priority value to set\r
522 */\r
523__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value)\r
524{\r
525 __ASM volatile ("MSR basepri, %0" : : "r" (value) );\r
526}\r
527\r
528\r
529/** \brief Get Fault Mask\r
530\r
531 This function returns the current value of the Fault Mask register.\r
532\r
533 \return Fault Mask register value\r
534 */\r
535__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void)\r
536{\r
537 uint32_t result;\r
538 \r
539 __ASM volatile ("MRS %0, faultmask" : "=r" (result) );\r
540 return(result);\r
541}\r
542\r
543\r
544/** \brief Set Fault Mask\r
545\r
546 This function assigns the given value to the Fault Mask register.\r
547\r
548 \param [in] faultMask Fault Mask value to set\r
549 */\r
550__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask)\r
551{\r
552 __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );\r
553}\r
554\r
555#endif /* (__CORTEX_M >= 0x03) */\r
556\r
557\r
558#if (__CORTEX_M == 0x04)\r
559\r
560/** \brief Get FPSCR\r
561\r
562 This function returns the current value of the Floating Point Status/Control register.\r
563\r
564 \return Floating Point Status/Control register value\r
565 */\r
566__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void)\r
567{\r
568#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
569 uint32_t result;\r
570\r
571 __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );\r
572 return(result);\r
573#else\r
574 return(0);\r
575#endif\r
576}\r
577\r
578\r
579/** \brief Set FPSCR\r
580\r
581 This function assigns the given value to the Floating Point Status/Control register.\r
582\r
583 \param [in] fpscr Floating Point Status/Control value to set\r
584 */\r
585__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr)\r
586{\r
587#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
588 __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );\r
589#endif\r
590}\r
591\r
592#endif /* (__CORTEX_M == 0x04) */\r
593\r
594\r
595#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/\r
596/* TASKING carm specific functions */\r
597\r
598/*\r
599 * The CMSIS functions have been implemented as intrinsics in the compiler.\r
600 * Please use "carm -?i" to get an up to date list of all instrinsics,\r
601 * Including the CMSIS ones.\r
602 */\r
603\r
604#endif\r
605\r
606/*@} end of CMSIS_Core_RegAccFunctions */\r
607\r
608\r
609#endif /* __CORE_CMFUNC_H */\r