1 /******************************************************************************
\r
3 * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Source File
\r
5 * @date: 24. Feb. 2009
\r
6 *----------------------------------------------------------------------------
\r
8 * Copyright (C) 2009 ARM Limited. All rights reserved.
\r
10 * ARM Limited (ARM) is supplying this software for use with Cortex-Mx
\r
11 * processor based microcontrollers. This file can be freely distributed
\r
12 * within development tools that are supporting such ARM based processors.
\r
14 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
\r
15 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
\r
16 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
\r
17 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
\r
18 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
\r
20 ******************************************************************************/
\r
27 /* define compiler specific symbols */
\r
28 #if defined ( __CC_ARM )
\r
29 #define __ASM __asm /*!< asm keyword for armcc */
\r
30 #define __INLINE __inline /*!< inline keyword for armcc */
\r
32 #elif defined ( __ICCARM__ )
\r
33 #define __ASM __asm /*!< asm keyword for iarcc */
\r
34 #define __INLINE inline /*!< inline keyword for iarcc. Only avaiable in High optimization mode! */
\r
35 #define __nop __no_operation /*!< no operation intrinsic in iarcc */
\r
37 #elif defined ( __GNUC__ )
\r
38 #define __ASM asm /*!< asm keyword for gcc */
\r
39 #define __INLINE inline /*!< inline keyword for gcc */
\r
44 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
\r
47 * @brief Return the Process Stack Pointer
\r
50 * @return uint32_t ProcessStackPointer
\r
52 * Return the actual process stack pointer
\r
54 __ASM uint32_t __get_PSP(void)
\r
61 * @brief Set the Process Stack Pointer
\r
63 * @param uint32_t Process Stack Pointer
\r
66 * Assign the value ProcessStackPointer to the MSP
\r
67 * (process stack pointer) Cortex processor register
\r
69 __ASM void __set_PSP(uint32_t topOfProcStack)
\r
76 * @brief Return the Main Stack Pointer
\r
79 * @return uint32_t Main Stack Pointer
\r
81 * Return the current value of the MSP (main stack pointer)
\r
82 * Cortex processor register
\r
84 __ASM uint32_t __get_MSP(void)
\r
91 * @brief Set the Main Stack Pointer
\r
93 * @param uint32_t Main Stack Pointer
\r
96 * Assign the value mainStackPointer to the MSP
\r
97 * (main stack pointer) Cortex processor register
\r
99 __ASM void __set_MSP(uint32_t mainStackPointer)
\r
106 * @brief Reverse byte order in unsigned short value
\r
108 * @param uint16_t value to reverse
\r
109 * @return uint32_t reversed value
\r
111 * Reverse byte order in unsigned short value
\r
113 __ASM uint32_t __REV16(uint16_t value)
\r
120 * @brief Reverse byte order in signed short value with sign extension to integer
\r
122 * @param int16_t value to reverse
\r
123 * @return int32_t reversed value
\r
125 * Reverse byte order in signed short value with sign extension to integer
\r
127 __ASM int32_t __REVSH(int16_t value)
\r
134 #if (__ARMCC_VERSION < 400000)
\r
137 * @brief Remove the exclusive lock created by ldrex
\r
142 * Removes the exclusive lock which is created by ldrex.
\r
144 __ASM void __CLREX(void)
\r
150 * @brief Return the Base Priority value
\r
153 * @return uint32_t BasePriority
\r
155 * Return the content of the base priority register
\r
157 __ASM uint32_t __get_BASEPRI(void)
\r
164 * @brief Set the Base Priority value
\r
166 * @param uint32_t BasePriority
\r
169 * Set the base priority register
\r
171 __ASM void __set_BASEPRI(uint32_t basePri)
\r
178 * @brief Return the Priority Mask value
\r
181 * @return uint32_t PriMask
\r
183 * Return the state of the priority mask bit from the priority mask
\r
186 __ASM uint32_t __get_PRIMASK(void)
\r
193 * @brief Set the Priority Mask value
\r
195 * @param uint32_t PriMask
\r
198 * Set the priority mask bit in the priority mask register
\r
200 __ASM void __set_PRIMASK(uint32_t priMask)
\r
207 * @brief Return the Fault Mask value
\r
210 * @return uint32_t FaultMask
\r
212 * Return the content of the fault mask register
\r
214 __ASM uint32_t __get_FAULTMASK(void)
\r
221 * @brief Set the Fault Mask value
\r
223 * @param uint32_t faultMask value
\r
226 * Set the fault mask register
\r
228 __ASM void __set_FAULTMASK(uint32_t faultMask)
\r
235 * @brief Return the Control Register value
\r
238 * @return uint32_t Control value
\r
240 * Return the content of the control register
\r
242 __ASM uint32_t __get_CONTROL(void)
\r
249 * @brief Set the Control Register value
\r
251 * @param uint32_t Control value
\r
254 * Set the control register
\r
256 __ASM void __set_CONTROL(uint32_t control)
\r
262 #endif /* __ARMCC_VERSION */
\r
265 #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/
\r
266 #pragma diag_suppress=Pe940
\r
269 * @brief Return the Process Stack Pointer
\r
272 * @return uint32_t ProcessStackPointer
\r
274 * Return the actual process stack pointer
\r
276 uint32_t __get_PSP(void)
\r
278 __ASM("mrs r0, psp");
\r
283 * @brief Set the Process Stack Pointer
\r
285 * @param uint32_t Process Stack Pointer
\r
288 * Assign the value ProcessStackPointer to the MSP
\r
289 * (process stack pointer) Cortex processor register
\r
291 void __set_PSP(uint32_t topOfProcStack)
\r
293 __ASM("msr psp, r0");
\r
298 * @brief Return the Main Stack Pointer
\r
301 * @return uint32_t Main Stack Pointer
\r
303 * Return the current value of the MSP (main stack pointer)
\r
304 * Cortex processor register
\r
306 uint32_t __get_MSP(void)
\r
308 __ASM("mrs r0, msp");
\r
313 * @brief Set the Main Stack Pointer
\r
315 * @param uint32_t Main Stack Pointer
\r
318 * Assign the value mainStackPointer to the MSP
\r
319 * (main stack pointer) Cortex processor register
\r
321 void __set_MSP(uint32_t topOfMainStack)
\r
323 __ASM("msr msp, r0");
\r
328 * @brief Reverse byte order in unsigned short value
\r
330 * @param uint16_t value to reverse
\r
331 * @return uint32_t reversed value
\r
333 * Reverse byte order in unsigned short value
\r
335 uint32_t __REV16(uint16_t value)
\r
337 __ASM("rev16 r0, r0");
\r
342 * @brief Reverse bit order of value
\r
344 * @param uint32_t value to reverse
\r
345 * @return uint32_t reversed value
\r
347 * Reverse bit order of value
\r
349 uint32_t __RBIT(uint32_t value)
\r
351 __ASM("rbit r0, r0");
\r
356 * @brief LDR Exclusive
\r
358 * @param uint8_t* address
\r
359 * @return uint8_t value of (*address)
\r
361 * Exclusive LDR command
\r
363 uint8_t __LDREXB(uint8_t *addr)
\r
365 __ASM("ldrexb r0, [r0]");
\r
370 * @brief LDR Exclusive
\r
372 * @param uint16_t* address
\r
373 * @return uint16_t value of (*address)
\r
375 * Exclusive LDR command
\r
377 uint16_t __LDREXH(uint16_t *addr)
\r
379 __ASM("ldrexh r0, [r0]");
\r
384 * @brief LDR Exclusive
\r
386 * @param uint32_t* address
\r
387 * @return uint32_t value of (*address)
\r
389 * Exclusive LDR command
\r
391 uint32_t __LDREXW(uint32_t *addr)
\r
393 __ASM("ldrex r0, [r0]");
\r
398 * @brief STR Exclusive
\r
400 * @param uint8_t *address
\r
401 * @param uint8_t value to store
\r
402 * @return uint32_t successful / failed
\r
404 * Exclusive STR command
\r
406 uint32_t __STREXB(uint8_t value, uint8_t *addr)
\r
408 __ASM("strexb r0, r0, [r1]");
\r
413 * @brief STR Exclusive
\r
415 * @param uint16_t *address
\r
416 * @param uint16_t value to store
\r
417 * @return uint32_t successful / failed
\r
419 * Exclusive STR command
\r
421 uint32_t __STREXH(uint16_t value, uint16_t *addr)
\r
423 __ASM("strexh r0, r0, [r1]");
\r
428 * @brief STR Exclusive
\r
430 * @param uint32_t *address
\r
431 * @param uint32_t value to store
\r
432 * @return uint32_t successful / failed
\r
434 * Exclusive STR command
\r
436 uint32_t __STREXW(uint32_t value, uint32_t *addr)
\r
438 __ASM("strex r0, r0, [r1]");
\r
442 #pragma diag_default=Pe940
\r
445 #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
\r
448 * @brief Return the Process Stack Pointer
\r
451 * @return uint32_t ProcessStackPointer
\r
453 * Return the actual process stack pointer
\r
455 uint32_t __get_PSP(void)
\r
459 __ASM volatile ("MRS %0, psp" : "=r" (result) );
\r
464 * @brief Set the Process Stack Pointer
\r
466 * @param uint32_t Process Stack Pointer
\r
469 * Assign the value ProcessStackPointer to the MSP
\r
470 * (process stack pointer) Cortex processor register
\r
472 void __set_PSP(uint32_t topOfProcStack)
\r
474 __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) );
\r
478 * @brief Return the Main Stack Pointer
\r
481 * @return uint32_t Main Stack Pointer
\r
483 * Return the current value of the MSP (main stack pointer)
\r
484 * Cortex processor register
\r
486 uint32_t __get_MSP(void)
\r
490 __ASM volatile ("MRS %0, msp" : "=r" (result) );
\r
495 * @brief Set the Main Stack Pointer
\r
497 * @param uint32_t Main Stack Pointer
\r
500 * Assign the value mainStackPointer to the MSP
\r
501 * (main stack pointer) Cortex processor register
\r
503 void __set_MSP(uint32_t topOfMainStack)
\r
505 __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) );
\r
509 * @brief Return the Base Priority value
\r
512 * @return uint32_t BasePriority
\r
514 * Return the content of the base priority register
\r
516 uint32_t __get_BASEPRI(void)
\r
520 __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
\r
525 * @brief Set the Base Priority value
\r
527 * @param uint32_t BasePriority
\r
530 * Set the base priority register
\r
532 void __set_BASEPRI(uint32_t value)
\r
534 __ASM volatile ("MSR basepri, %0" : : "r" (value) );
\r
538 * @brief Return the Priority Mask value
\r
541 * @return uint32_t PriMask
\r
543 * Return the state of the priority mask bit from the priority mask
\r
546 uint32_t __get_PRIMASK(void)
\r
550 __ASM volatile ("MRS %0, primask" : "=r" (result) );
\r
555 * @brief Set the Priority Mask value
\r
557 * @param uint32_t PriMask
\r
560 * Set the priority mask bit in the priority mask register
\r
562 void __set_PRIMASK(uint32_t priMask)
\r
564 __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
\r
568 * @brief Return the Fault Mask value
\r
571 * @return uint32_t FaultMask
\r
573 * Return the content of the fault mask register
\r
575 uint32_t __get_FAULTMASK(void)
\r
579 __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
\r
584 * @brief Set the Fault Mask value
\r
586 * @param uint32_t faultMask value
\r
589 * Set the fault mask register
\r
591 void __set_FAULTMASK(uint32_t faultMask)
\r
593 __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
\r
597 * @brief Reverse byte order in integer value
\r
599 * @param uint32_t value to reverse
\r
600 * @return uint32_t reversed value
\r
602 * Reverse byte order in integer value
\r
604 uint32_t __REV(uint32_t value)
\r
608 __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
\r
613 * @brief Reverse byte order in unsigned short value
\r
615 * @param uint16_t value to reverse
\r
616 * @return uint32_t reversed value
\r
618 * Reverse byte order in unsigned short value
\r
620 uint32_t __REV16(uint16_t value)
\r
624 __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
\r
629 * @brief Reverse byte order in signed short value with sign extension to integer
\r
631 * @param int32_t value to reverse
\r
632 * @return int32_t reversed value
\r
634 * Reverse byte order in signed short value with sign extension to integer
\r
636 int32_t __REVSH(int16_t value)
\r
640 __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
\r
645 * @brief Reverse bit order of value
\r
647 * @param uint32_t value to reverse
\r
648 * @return uint32_t reversed value
\r
650 * Reverse bit order of value
\r
652 uint32_t __RBIT(uint32_t value)
\r
656 __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
\r
661 * @brief LDR Exclusive
\r
663 * @param uint8_t* address
\r
664 * @return uint8_t value of (*address)
\r
666 * Exclusive LDR command
\r
668 uint8_t __LDREXB(uint8_t *addr)
\r
672 __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
\r
677 * @brief LDR Exclusive
\r
679 * @param uint16_t* address
\r
680 * @return uint16_t value of (*address)
\r
682 * Exclusive LDR command
\r
684 uint16_t __LDREXH(uint16_t *addr)
\r
688 __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
\r
693 * @brief LDR Exclusive
\r
695 * @param uint32_t* address
\r
696 * @return uint32_t value of (*address)
\r
698 * Exclusive LDR command
\r
700 uint32_t __LDREXW(uint32_t *addr)
\r
704 __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
\r
709 * @brief STR Exclusive
\r
711 * @param uint8_t *address
\r
712 * @param uint8_t value to store
\r
713 * @return uint32_t successful / failed
\r
715 * Exclusive STR command
\r
717 uint32_t __STREXB(uint8_t value, uint8_t *addr)
\r
721 __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
\r
726 * @brief STR Exclusive
\r
728 * @param uint16_t *address
\r
729 * @param uint16_t value to store
\r
730 * @return uint32_t successful / failed
\r
732 * Exclusive STR command
\r
734 uint32_t __STREXH(uint16_t value, uint16_t *addr)
\r
738 __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
\r
743 * @brief STR Exclusive
\r
745 * @param uint32_t *address
\r
746 * @param uint32_t value to store
\r
747 * @return uint32_t successful / failed
\r
749 * Exclusive STR command
\r
751 uint32_t __STREXW(uint32_t value, uint32_t *addr)
\r
755 __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
\r
760 * @brief Return the Control Register value
\r
763 * @return uint32_t Control value
\r
765 * Return the content of the control register
\r
767 uint32_t __get_CONTROL(void)
\r
771 __ASM volatile ("MRS %0, control" : "=r" (result) );
\r
776 * @brief Set the Control Register value
\r
778 * @param uint32_t Control value
\r
781 * Set the control register
\r
783 void __set_CONTROL(uint32_t control)
\r
785 __ASM volatile ("MSR control, %0" : : "r" (control) );
\r