Go to the documentation of this file.00001
00024 #ifndef __CORE_CMFUNC_H
00025 #define __CORE_CMFUNC_H
00026
00027
00028
00034 #if defined ( __CC_ARM )
00035
00036
00037 #if (__ARMCC_VERSION < 400677)
00038 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
00039 #endif
00040
00041
00042
00043
00050 __STATIC_INLINE uint32_t __get_CONTROL(void)
00051 {
00052 register uint32_t __regControl __ASM("control");
00053 return(__regControl);
00054 }
00055
00056
00063 __STATIC_INLINE void __set_CONTROL(uint32_t control)
00064 {
00065 register uint32_t __regControl __ASM("control");
00066 __regControl = control;
00067 }
00068
00069
00076 __STATIC_INLINE uint32_t __get_IPSR(void)
00077 {
00078 register uint32_t __regIPSR __ASM("ipsr");
00079 return(__regIPSR);
00080 }
00081
00082
00089 __STATIC_INLINE uint32_t __get_APSR(void)
00090 {
00091 register uint32_t __regAPSR __ASM("apsr");
00092 return(__regAPSR);
00093 }
00094
00095
00102 __STATIC_INLINE uint32_t __get_xPSR(void)
00103 {
00104 register uint32_t __regXPSR __ASM("xpsr");
00105 return(__regXPSR);
00106 }
00107
00108
00115 __STATIC_INLINE uint32_t __get_PSP(void)
00116 {
00117 register uint32_t __regProcessStackPointer __ASM("psp");
00118 return(__regProcessStackPointer);
00119 }
00120
00121
00128 __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
00129 {
00130 register uint32_t __regProcessStackPointer __ASM("psp");
00131 __regProcessStackPointer = topOfProcStack;
00132 }
00133
00134
00141 __STATIC_INLINE uint32_t __get_MSP(void)
00142 {
00143 register uint32_t __regMainStackPointer __ASM("msp");
00144 return(__regMainStackPointer);
00145 }
00146
00147
00154 __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
00155 {
00156 register uint32_t __regMainStackPointer __ASM("msp");
00157 __regMainStackPointer = topOfMainStack;
00158 }
00159
00160
00167 __STATIC_INLINE uint32_t __get_PRIMASK(void)
00168 {
00169 register uint32_t __regPriMask __ASM("primask");
00170 return(__regPriMask);
00171 }
00172
00173
00180 __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
00181 {
00182 register uint32_t __regPriMask __ASM("primask");
00183 __regPriMask = (priMask);
00184 }
00185
00186
00187 #if (__CORTEX_M >= 0x03)
00188
00194 #define __enable_fault_irq __enable_fiq
00195
00196
00202 #define __disable_fault_irq __disable_fiq
00203
00204
00211 __STATIC_INLINE uint32_t __get_BASEPRI(void)
00212 {
00213 register uint32_t __regBasePri __ASM("basepri");
00214 return(__regBasePri);
00215 }
00216
00217
00224 __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
00225 {
00226 register uint32_t __regBasePri __ASM("basepri");
00227 __regBasePri = (basePri & 0xff);
00228 }
00229
00230
00237 __STATIC_INLINE uint32_t __get_FAULTMASK(void)
00238 {
00239 register uint32_t __regFaultMask __ASM("faultmask");
00240 return(__regFaultMask);
00241 }
00242
00243
00250 __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
00251 {
00252 register uint32_t __regFaultMask __ASM("faultmask");
00253 __regFaultMask = (faultMask & (uint32_t)1);
00254 }
00255
00256 #endif
00257
00258
00259 #if (__CORTEX_M == 0x04)
00260
00267 __STATIC_INLINE uint32_t __get_FPSCR(void)
00268 {
00269 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00270 register uint32_t __regfpscr __ASM("fpscr");
00271 return(__regfpscr);
00272 #else
00273 return(0);
00274 #endif
00275 }
00276
00277
00284 __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
00285 {
00286 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00287 register uint32_t __regfpscr __ASM("fpscr");
00288 __regfpscr = (fpscr);
00289 #endif
00290 }
00291
00292 #endif
00293
00294
00295 #elif defined ( __ICCARM__ )
00296
00297
00298 #include <cmsis_iar.h>
00299
00300
00301 #elif defined ( __TMS470__ )
00302
00303
00304 #include <cmsis_ccs.h>
00305
00306
00307 #elif defined ( __GNUC__ )
00308
00309
00315 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
00316 {
00317 __ASM volatile ("cpsie i");
00318 }
00319
00320
00326 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
00327 {
00328 __ASM volatile ("cpsid i");
00329 }
00330
00331
00338 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
00339 {
00340 uint32_t result;
00341
00342 __ASM volatile ("MRS %0, control" : "=r" (result) );
00343 return(result);
00344 }
00345
00346
00353 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
00354 {
00355 __ASM volatile ("MSR control, %0" : : "r" (control) );
00356 }
00357
00358
00365 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
00366 {
00367 uint32_t result;
00368
00369 __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
00370 return(result);
00371 }
00372
00373
00380 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
00381 {
00382 uint32_t result;
00383
00384 __ASM volatile ("MRS %0, apsr" : "=r" (result) );
00385 return(result);
00386 }
00387
00388
00395 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
00396 {
00397 uint32_t result;
00398
00399 __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
00400 return(result);
00401 }
00402
00403
00410 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
00411 {
00412 register uint32_t result;
00413
00414 __ASM volatile ("MRS %0, psp\n" : "=r" (result) );
00415 return(result);
00416 }
00417
00418
00425 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
00426 {
00427 __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );
00428 }
00429
00430
00437 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
00438 {
00439 register uint32_t result;
00440
00441 __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
00442 return(result);
00443 }
00444
00445
00452 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
00453 {
00454 __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );
00455 }
00456
00457
00464 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
00465 {
00466 uint32_t result;
00467
00468 __ASM volatile ("MRS %0, primask" : "=r" (result) );
00469 return(result);
00470 }
00471
00472
00479 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
00480 {
00481 __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
00482 }
00483
00484
00485 #if (__CORTEX_M >= 0x03)
00486
00492 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
00493 {
00494 __ASM volatile ("cpsie f");
00495 }
00496
00497
00503 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
00504 {
00505 __ASM volatile ("cpsid f");
00506 }
00507
00508
00515 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
00516 {
00517 uint32_t result;
00518
00519 __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
00520 return(result);
00521 }
00522
00523
00530 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
00531 {
00532 __ASM volatile ("MSR basepri, %0" : : "r" (value) );
00533 }
00534
00535
00542 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
00543 {
00544 uint32_t result;
00545
00546 __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
00547 return(result);
00548 }
00549
00550
00557 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
00558 {
00559 __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
00560 }
00561
00562 #endif
00563
00564
00565 #if (__CORTEX_M == 0x04)
00566
00573 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
00574 {
00575 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00576 uint32_t result;
00577
00578 __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
00579 return(result);
00580 #else
00581 return(0);
00582 #endif
00583 }
00584
00585
00592 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
00593 {
00594 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00595 __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );
00596 #endif
00597 }
00598
00599 #endif
00600
00601
00602 #elif defined ( __TASKING__ )
00603
00604
00605
00606
00607
00608
00609
00610
00611 #endif
00612
00616 #endif