source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/mbed/cmsis/core_cmFunc.h@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

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