]> git.sur5r.net Git - freertos/blob
c999b1c83b0bd19fad57f629bcf4d510042663bb
[freertos] /
1 /**************************************************************************//**\r
2  * @file     core_cmFunc.h\r
3  * @brief    CMSIS Cortex-M Core Function Access Header File\r
4  * @version  V2.10\r
5  * @date     26. July 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
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 ISPR Register\r
71 \r
72     This function returns the content of the ISPR Register.\r
73 \r
74     \return               ISPR 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 #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 ISPR Register\r
353 \r
354     This function returns the content of the ISPR Register.\r
355 \r
356     \return               ISPR 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