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