]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/ASF/thirdparty/CMSIS/Include/core_cmFunc.h
Starting point for the SAMD20 demo.
[freertos] / FreeRTOS / Demo / CORTEX_M0+_Atmel_SAMD20_XPlained / RTOSDemo / src / ASF / thirdparty / CMSIS / Include / core_cmFunc.h
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     19. January 2012\r
6  *\r
7  * @note\r
8  * Copyright (C) 2009-2012 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
50 __STATIC_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
63 __STATIC_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
76 __STATIC_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
89 __STATIC_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
102 __STATIC_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
115 __STATIC_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
128 __STATIC_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
141 __STATIC_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
154 __STATIC_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
167 __STATIC_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
180 __STATIC_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
211 __STATIC_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
224 __STATIC_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
237 __STATIC_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
250 __STATIC_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
267 __STATIC_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
284 __STATIC_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 \r
301 #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/\r
302 /* TI CCS specific functions */\r
303 \r
304 #include <cmsis_ccs.h>\r
305 \r
306 \r
307 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/\r
308 /* GNU gcc specific functions */\r
309 \r
310 /** \brief  Enable IRQ Interrupts\r
311 \r
312   This function enables IRQ interrupts by clearing the I-bit in the CPSR.\r
313   Can only be executed in Privileged modes.\r
314  */\r
315 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)\r
316 {\r
317   __ASM volatile ("cpsie i");\r
318 }\r
319 \r
320 \r
321 /** \brief  Disable IRQ Interrupts\r
322 \r
323   This function disables IRQ interrupts by setting the I-bit in the CPSR.\r
324   Can only be executed in Privileged modes.\r
325  */\r
326 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)\r
327 {\r
328   __ASM volatile ("cpsid i");\r
329 }\r
330 \r
331 \r
332 /** \brief  Get Control Register\r
333 \r
334     This function returns the content of the Control Register.\r
335 \r
336     \return               Control Register value\r
337  */\r
338 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)\r
339 {\r
340   uint32_t result;\r
341 \r
342   __ASM volatile ("MRS %0, control" : "=r" (result) );\r
343   return(result);\r
344 }\r
345 \r
346 \r
347 /** \brief  Set Control Register\r
348 \r
349     This function writes the given value to the Control Register.\r
350 \r
351     \param [in]    control  Control Register value to set\r
352  */\r
353 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)\r
354 {\r
355   __ASM volatile ("MSR control, %0" : : "r" (control) );\r
356 }\r
357 \r
358 \r
359 /** \brief  Get IPSR Register\r
360 \r
361     This function returns the content of the IPSR Register.\r
362 \r
363     \return               IPSR Register value\r
364  */\r
365 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)\r
366 {\r
367   uint32_t result;\r
368 \r
369   __ASM volatile ("MRS %0, ipsr" : "=r" (result) );\r
370   return(result);\r
371 }\r
372 \r
373 \r
374 /** \brief  Get APSR Register\r
375 \r
376     This function returns the content of the APSR Register.\r
377 \r
378     \return               APSR Register value\r
379  */\r
380 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)\r
381 {\r
382   uint32_t result;\r
383 \r
384   __ASM volatile ("MRS %0, apsr" : "=r" (result) );\r
385   return(result);\r
386 }\r
387 \r
388 \r
389 /** \brief  Get xPSR Register\r
390 \r
391     This function returns the content of the xPSR Register.\r
392 \r
393     \return               xPSR Register value\r
394  */\r
395 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)\r
396 {\r
397   uint32_t result;\r
398 \r
399   __ASM volatile ("MRS %0, xpsr" : "=r" (result) );\r
400   return(result);\r
401 }\r
402 \r
403 \r
404 /** \brief  Get Process Stack Pointer\r
405 \r
406     This function returns the current value of the Process Stack Pointer (PSP).\r
407 \r
408     \return               PSP Register value\r
409  */\r
410 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)\r
411 {\r
412   register uint32_t result;\r
413 \r
414   __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );\r
415   return(result);\r
416 }\r
417  \r
418 \r
419 /** \brief  Set Process Stack Pointer\r
420 \r
421     This function assigns the given value to the Process Stack Pointer (PSP).\r
422 \r
423     \param [in]    topOfProcStack  Process Stack Pointer value to set\r
424  */\r
425 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)\r
426 {\r
427   __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );\r
428 }\r
429 \r
430 \r
431 /** \brief  Get Main Stack Pointer\r
432 \r
433     This function returns the current value of the Main Stack Pointer (MSP).\r
434 \r
435     \return               MSP Register value\r
436  */\r
437 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)\r
438 {\r
439   register uint32_t result;\r
440 \r
441   __ASM volatile ("MRS %0, msp\n" : "=r" (result) );\r
442   return(result);\r
443 }\r
444  \r
445 \r
446 /** \brief  Set Main Stack Pointer\r
447 \r
448     This function assigns the given value to the Main Stack Pointer (MSP).\r
449 \r
450     \param [in]    topOfMainStack  Main Stack Pointer value to set\r
451  */\r
452 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)\r
453 {\r
454   __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );\r
455 }\r
456 \r
457 \r
458 /** \brief  Get Priority Mask\r
459 \r
460     This function returns the current state of the priority mask bit from the Priority Mask Register.\r
461 \r
462     \return               Priority Mask value\r
463  */\r
464 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)\r
465 {\r
466   uint32_t result;\r
467 \r
468   __ASM volatile ("MRS %0, primask" : "=r" (result) );\r
469   return(result);\r
470 }\r
471 \r
472 \r
473 /** \brief  Set Priority Mask\r
474 \r
475     This function assigns the given value to the Priority Mask Register.\r
476 \r
477     \param [in]    priMask  Priority Mask\r
478  */\r
479 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)\r
480 {\r
481   __ASM volatile ("MSR primask, %0" : : "r" (priMask) );\r
482 }\r
483  \r
484 \r
485 #if       (__CORTEX_M >= 0x03)\r
486 \r
487 /** \brief  Enable FIQ\r
488 \r
489     This function enables FIQ interrupts by clearing the F-bit in the CPSR.\r
490     Can only be executed in Privileged modes.\r
491  */\r
492 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)\r
493 {\r
494   __ASM volatile ("cpsie f");\r
495 }\r
496 \r
497 \r
498 /** \brief  Disable FIQ\r
499 \r
500     This function disables FIQ interrupts by setting the F-bit in the CPSR.\r
501     Can only be executed in Privileged modes.\r
502  */\r
503 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)\r
504 {\r
505   __ASM volatile ("cpsid f");\r
506 }\r
507 \r
508 \r
509 /** \brief  Get Base Priority\r
510 \r
511     This function returns the current value of the Base Priority register.\r
512 \r
513     \return               Base Priority register value\r
514  */\r
515 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)\r
516 {\r
517   uint32_t result;\r
518   \r
519   __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );\r
520   return(result);\r
521 }\r
522 \r
523 \r
524 /** \brief  Set Base Priority\r
525 \r
526     This function assigns the given value to the Base Priority register.\r
527 \r
528     \param [in]    basePri  Base Priority value to set\r
529  */\r
530 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)\r
531 {\r
532   __ASM volatile ("MSR basepri, %0" : : "r" (value) );\r
533 }\r
534 \r
535 \r
536 /** \brief  Get Fault Mask\r
537 \r
538     This function returns the current value of the Fault Mask register.\r
539 \r
540     \return               Fault Mask register value\r
541  */\r
542 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)\r
543 {\r
544   uint32_t result;\r
545   \r
546   __ASM volatile ("MRS %0, faultmask" : "=r" (result) );\r
547   return(result);\r
548 }\r
549 \r
550 \r
551 /** \brief  Set Fault Mask\r
552 \r
553     This function assigns the given value to the Fault Mask register.\r
554 \r
555     \param [in]    faultMask  Fault Mask value to set\r
556  */\r
557 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)\r
558 {\r
559   __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );\r
560 }\r
561 \r
562 #endif /* (__CORTEX_M >= 0x03) */\r
563 \r
564 \r
565 #if       (__CORTEX_M == 0x04)\r
566 \r
567 /** \brief  Get FPSCR\r
568 \r
569     This function returns the current value of the Floating Point Status/Control register.\r
570 \r
571     \return               Floating Point Status/Control register value\r
572  */\r
573 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)\r
574 {\r
575 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
576   uint32_t result;\r
577 \r
578   __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );\r
579   return(result);\r
580 #else\r
581    return(0);\r
582 #endif\r
583 }\r
584 \r
585 \r
586 /** \brief  Set FPSCR\r
587 \r
588     This function assigns the given value to the Floating Point Status/Control register.\r
589 \r
590     \param [in]    fpscr  Floating Point Status/Control value to set\r
591  */\r
592 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)\r
593 {\r
594 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r
595   __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );\r
596 #endif\r
597 }\r
598 \r
599 #endif /* (__CORTEX_M == 0x04) */\r
600 \r
601 \r
602 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/\r
603 /* TASKING carm specific functions */\r
604 \r
605 /*\r
606  * The CMSIS functions have been implemented as intrinsics in the compiler.\r
607  * Please use "carm -?i" to get an up to date list of all instrinsics,\r
608  * Including the CMSIS ones.\r
609  */\r
610 \r
611 #endif\r
612 \r
613 /*@} end of CMSIS_Core_RegAccFunctions */\r
614 \r
615 \r
616 #endif /* __CORE_CMFUNC_H */\r