Add firmware wireframe
This commit is contained in:
		
						commit
						66381c3cb6
					
				
					 23 changed files with 13167 additions and 0 deletions
				
			
		
							
								
								
									
										69
									
								
								third_party/core/cmsis_nvic.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								third_party/core/cmsis_nvic.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | |||
| /* mbed Microcontroller Library
 | ||||
|  * CMSIS-style functionality to support dynamic vectors | ||||
|  ******************************************************************************* | ||||
|  * Copyright (c) 2011 ARM Limited. All rights reserved. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright notice, | ||||
|  *    this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|  *    this list of conditions and the following disclaimer in the documentation | ||||
|  *    and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of ARM Limited nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
|  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
|  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
|  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  ******************************************************************************* | ||||
|  */ | ||||
| 
 | ||||
| #ifndef MBED_CMSIS_NVIC_H | ||||
| #define MBED_CMSIS_NVIC_H | ||||
| 
 | ||||
| #include "cmsis.h" | ||||
| 
 | ||||
| #define NVIC_USER_IRQ_OFFSET YOTTA_CFG_CMSIS_NVIC_USER_IRQ_OFFSET | ||||
| #define NVIC_USER_IRQ_NUMBER YOTTA_CFG_CMSIS_NVIC_USER_IRQ_NUMBER | ||||
| #define NVIC_NUM_VECTORS     (NVIC_USER_IRQ_OFFSET + NVIC_USER_IRQ_NUMBER) | ||||
| 
 | ||||
| #define NVIC_RAM_VECTOR_ADDRESS   YOTTA_CFG_CMSIS_NVIC_RAM_VECTOR_ADDRESS | ||||
| #define NVIC_FLASH_VECTOR_ADDRESS YOTTA_CFG_CMSIS_NVIC_FLASH_VECTOR_ADDRESS | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /** Set the ISR for IRQn
 | ||||
|  * | ||||
|  * Sets an Interrupt Service Routine vector for IRQn; if the feature is available, the vector table is relocated to SRAM | ||||
|  * the first time this function is called | ||||
|  * @param[in] IRQn   The Interrupt Request number for which a vector will be registered | ||||
|  * @param[in] vector The ISR vector to register for IRQn | ||||
|  */ | ||||
| void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector); | ||||
| 
 | ||||
| /** Get the ISR registered for IRQn
 | ||||
|  * | ||||
|  * Reads the Interrupt Service Routine currently registered for IRQn | ||||
|  * @param[in] IRQn   The Interrupt Request number the vector of which will be read | ||||
|  * @return           Returns the ISR registered for IRQn | ||||
|  */ | ||||
| uint32_t NVIC_GetVector(IRQn_Type IRQn); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										682
									
								
								third_party/core/core_cm0.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										682
									
								
								third_party/core/core_cm0.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,682 @@ | |||
| /**************************************************************************//**
 | ||||
|  * @file     core_cm0.h | ||||
|  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File | ||||
|  * @version  V3.20 | ||||
|  * @date     25. February 2013 | ||||
|  * | ||||
|  * @note | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| /* Copyright (c) 2009 - 2013 ARM LIMITED
 | ||||
| 
 | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #if defined ( __ICCARM__ ) | ||||
|  #pragma system_include  /* treat file as system include file for MISRA check */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __CORE_CM0_H_GENERIC | ||||
| #define __CORE_CM0_H_GENERIC | ||||
| 
 | ||||
| /** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
 | ||||
|   CMSIS violates the following MISRA-C:2004 rules: | ||||
| 
 | ||||
|    \li Required Rule 8.5, object/function definition in header file.<br> | ||||
|      Function definitions in header files are used to allow 'inlining'. | ||||
| 
 | ||||
|    \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | ||||
|      Unions are used for effective representation of core registers. | ||||
| 
 | ||||
|    \li Advisory Rule 19.7, Function-like macro defined.<br> | ||||
|      Function-like macros are used to allow more efficient code. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                 CMSIS definitions | ||||
|  ******************************************************************************/ | ||||
| /** \ingroup Cortex_M0
 | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /*  CMSIS CM0 definitions */ | ||||
| #define __CM0_CMSIS_VERSION_MAIN  (0x03)                                   /*!< [31:16] CMSIS HAL main version   */ | ||||
| #define __CM0_CMSIS_VERSION_SUB   (0x20)                                   /*!< [15:0]  CMSIS HAL sub version    */ | ||||
| #define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | \ | ||||
|                                     __CM0_CMSIS_VERSION_SUB          )     /*!< CMSIS HAL version number         */ | ||||
| 
 | ||||
| #define __CORTEX_M                (0x00)                                   /*!< Cortex-M Core                    */ | ||||
| 
 | ||||
| 
 | ||||
| #if   defined ( __CC_ARM ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */ | ||||
|   #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */ | ||||
|   #define __STATIC_INLINE  static __inline | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all
 | ||||
| */ | ||||
| #define __FPU_USED       0 | ||||
| 
 | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #if defined __FPU_VFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h>                      /* standard types definitions                      */ | ||||
| #include <core_cmInstr.h>                /* Core Instruction Access                         */ | ||||
| #include <core_cmFunc.h>                 /* Core Function Access                            */ | ||||
| 
 | ||||
| #endif /* __CORE_CM0_H_GENERIC */ | ||||
| 
 | ||||
| #ifndef __CMSIS_GENERIC | ||||
| 
 | ||||
| #ifndef __CORE_CM0_H_DEPENDANT | ||||
| #define __CORE_CM0_H_DEPENDANT | ||||
| 
 | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM0_REV | ||||
|     #define __CM0_REV               0x0000 | ||||
|     #warning "__CM0_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2 | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0 | ||||
|     #warning "__Vendor_SysTickConfig not defined in device header file; using default!" | ||||
|   #endif | ||||
| #endif | ||||
| 
 | ||||
| /* IO definitions (access restrictions to peripheral registers) */ | ||||
| /**
 | ||||
|     \defgroup CMSIS_glob_defs CMSIS Global Defines | ||||
| 
 | ||||
|     <strong>IO Type Qualifiers</strong> are used | ||||
|     \li to specify the access to peripheral variables. | ||||
|     \li for automatic generation of peripheral register debug information. | ||||
| */ | ||||
| #ifdef __cplusplus | ||||
|   #define   __I     volatile             /*!< Defines 'read only' permissions                 */ | ||||
| #else | ||||
|   #define   __I     volatile const       /*!< Defines 'read only' permissions                 */ | ||||
| #endif | ||||
| #define     __O     volatile             /*!< Defines 'write only' permissions                */ | ||||
| #define     __IO    volatile             /*!< Defines 'read / write' permissions              */ | ||||
| 
 | ||||
| /*@} end of group Cortex_M0 */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                 Register Abstraction | ||||
|   Core Register contain: | ||||
|   - Core Register | ||||
|   - Core NVIC Register | ||||
|   - Core SCB Register | ||||
|   - Core SysTick Register | ||||
|  ******************************************************************************/ | ||||
| /** \defgroup CMSIS_core_register Defines and Type Definitions
 | ||||
|     \brief Type definitions and defines for Cortex-M processor based devices. | ||||
| */ | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_CORE  Status and Control Registers | ||||
|     \brief  Core Register type definitions. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Union type to access the Application Program Status Register (APSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
| #if (__CORTEX_M != 0x04) | ||||
|     uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */ | ||||
| #else | ||||
|     uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */ | ||||
|     uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */ | ||||
|     uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */ | ||||
| #endif | ||||
|     uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } APSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Interrupt Program Status Register (IPSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */ | ||||
|     uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } IPSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */ | ||||
| #if (__CORTEX_M != 0x04) | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */ | ||||
| #else | ||||
|     uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */ | ||||
|     uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */ | ||||
|     uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */ | ||||
| #endif | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */ | ||||
|     uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */ | ||||
|     uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } xPSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Control Registers (CONTROL).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */ | ||||
|     uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */ | ||||
|     uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } CONTROL_Type; | ||||
| 
 | ||||
| /*@} end of group CMSIS_CORE */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC) | ||||
|     \brief      Type definitions for the NVIC Registers | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */ | ||||
|        uint32_t RESERVED0[31]; | ||||
|   __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */ | ||||
|        uint32_t RSERVED1[31]; | ||||
|   __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */ | ||||
|        uint32_t RESERVED2[31]; | ||||
|   __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */ | ||||
|        uint32_t RESERVED3[31]; | ||||
|        uint32_t RESERVED4[64]; | ||||
|   __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */ | ||||
| }  NVIC_Type; | ||||
| 
 | ||||
| /*@} end of group CMSIS_NVIC */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_SCB     System Control Block (SCB) | ||||
|     \brief      Type definitions for the System Control Block Registers | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the System Control Block (SCB).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */ | ||||
|   __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */ | ||||
|        uint32_t RESERVED0; | ||||
|   __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */ | ||||
|   __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */ | ||||
|   __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */ | ||||
|        uint32_t RESERVED1; | ||||
|   __IO uint32_t SHP[2];                  /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */ | ||||
|   __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */ | ||||
| } SCB_Type; | ||||
| 
 | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */ | ||||
| #define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */ | ||||
| 
 | ||||
| /* SCB Interrupt Control State Register Definitions */ | ||||
| #define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */ | ||||
| #define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */ | ||||
| 
 | ||||
| /* SCB Application Interrupt and Reset Control Register Definitions */ | ||||
| #define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */ | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */ | ||||
| 
 | ||||
| /* SCB System Control Register Definitions */ | ||||
| #define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
| 
 | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
| 
 | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */ | ||||
| #define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */ | ||||
| 
 | ||||
| /* SCB Configuration Control Register Definitions */ | ||||
| #define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
| 
 | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */ | ||||
| #define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */ | ||||
| 
 | ||||
| /* SCB System Handler Control and State Register Definitions */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */ | ||||
| 
 | ||||
| /*@} end of group CMSIS_SCB */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_SysTick     System Tick Timer (SysTick) | ||||
|     \brief      Type definitions for the System Timer Registers. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the System Timer (SysTick).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */ | ||||
|   __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */ | ||||
|   __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */ | ||||
| } SysTick_Type; | ||||
| 
 | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */ | ||||
| #define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */ | ||||
| 
 | ||||
| /* SysTick Reload Register Definitions */ | ||||
| #define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */ | ||||
| #define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */ | ||||
| 
 | ||||
| /* SysTick Current Register Definitions */ | ||||
| #define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */ | ||||
| #define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */ | ||||
| 
 | ||||
| /* SysTick Calibration Register Definitions */ | ||||
| #define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
| 
 | ||||
| #define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
| 
 | ||||
| #define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */ | ||||
| 
 | ||||
| /*@} end of group CMSIS_SysTick */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug) | ||||
|     \brief      Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) | ||||
|                 are only accessible over DAP and not via processor. Therefore | ||||
|                 they are not covered by the Cortex-M0 header file. | ||||
|   @{ | ||||
|  */ | ||||
| /*@} end of group CMSIS_CoreDebug */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_core_base     Core Definitions | ||||
|     \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /* Memory mapping of Cortex-M0 Hardware */ | ||||
| #define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */ | ||||
| #define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */ | ||||
| #define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */ | ||||
| #define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */ | ||||
| 
 | ||||
| #define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */ | ||||
| #define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */ | ||||
| #define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */ | ||||
| 
 | ||||
| 
 | ||||
| /*@} */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                Hardware Abstraction Layer | ||||
|   Core Function Interface contains: | ||||
|   - Core NVIC Functions | ||||
|   - Core SysTick Functions | ||||
|   - Core Register Access Functions | ||||
|  ******************************************************************************/ | ||||
| /** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
 | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* ##########################   NVIC functions  #################################### */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface
 | ||||
|     \defgroup CMSIS_Core_NVICFunctions NVIC Functions | ||||
|     \brief      Functions that manage interrupts and exceptions via the NVIC. | ||||
|     @{ | ||||
|  */ | ||||
| 
 | ||||
| /* Interrupt Priorities are WORD accessible only under ARMv6M                   */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  (((uint32_t)(IRQn)       )    &  0x03) * 8 ) | ||||
| #define _SHP_IDX(IRQn)           ( ((((uint32_t)(IRQn) & 0x0F)-8) >>    2)     ) | ||||
| #define _IP_IDX(IRQn)            (   ((uint32_t)(IRQn)            >>    2)     ) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Enable External Interrupt
 | ||||
| 
 | ||||
|     The function enables a device-specific interrupt in the NVIC interrupt controller. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Disable External Interrupt
 | ||||
| 
 | ||||
|     The function disables a device-specific interrupt in the NVIC interrupt controller. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Pending Interrupt
 | ||||
| 
 | ||||
|     The function reads the pending register in the NVIC and returns the pending bit | ||||
|     for the specified interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. | ||||
| 
 | ||||
|     \return             0  Interrupt status is not pending. | ||||
|     \return             1  Interrupt status is pending. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Pending Interrupt
 | ||||
| 
 | ||||
|     The function sets the pending bit of an external interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Clear Pending Interrupt
 | ||||
| 
 | ||||
|     The function clears the pending bit of an external interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Interrupt Priority
 | ||||
| 
 | ||||
|     The function sets the priority of an interrupt. | ||||
| 
 | ||||
|     \note The priority cannot be set for every core interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. | ||||
|     \param [in]  priority  Priority to set. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if(IRQn < 0) { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | | ||||
|         (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } | ||||
|   else { | ||||
|     NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | | ||||
|         (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Interrupt Priority
 | ||||
| 
 | ||||
|     The function reads the priority of an interrupt. The interrupt | ||||
|     number can be positive to specify an external (device specific) | ||||
|     interrupt, or negative to specify an internal (core) interrupt. | ||||
| 
 | ||||
| 
 | ||||
|     \param [in]   IRQn  Interrupt number. | ||||
|     \return             Interrupt Priority. Value is aligned automatically to the implemented | ||||
|                         priority bits of the microcontroller. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) | ||||
| { | ||||
| 
 | ||||
|   if(IRQn < 0) { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */ | ||||
|   else { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  System Reset
 | ||||
| 
 | ||||
|     The function initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                     /* Ensure all outstanding memory accesses included
 | ||||
|                                                                   buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                     /* Ensure completion of memory access */ | ||||
|   while(1);                                                    /* wait until reset */ | ||||
| } | ||||
| 
 | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface
 | ||||
|     \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|     \brief      Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| #if (__Vendor_SysTickConfig == 0) | ||||
| 
 | ||||
| /** \brief  System Tick Configuration
 | ||||
| 
 | ||||
|     The function initializes the System Timer and its interrupt, and starts the System Tick Timer. | ||||
|     Counter is in free running mode to generate periodic interrupts. | ||||
| 
 | ||||
|     \param [in]  ticks  Number of ticks between two interrupts. | ||||
| 
 | ||||
|     \return          0  Function succeeded. | ||||
|     \return          1  Function failed. | ||||
| 
 | ||||
|     \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the | ||||
|     function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | ||||
|     must contain a vendor-specific implementation of this function. | ||||
| 
 | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) | ||||
| { | ||||
|   if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */ | ||||
| 
 | ||||
|   SysTick->LOAD  = ticks - 1;                                  /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */ | ||||
|   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | | ||||
|                    SysTick_CTRL_TICKINT_Msk   | | ||||
|                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */ | ||||
|   return (0);                                                  /* Function successful */ | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif /* __CORE_CM0_H_DEPENDANT */ | ||||
| 
 | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										793
									
								
								third_party/core/core_cm0plus.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										793
									
								
								third_party/core/core_cm0plus.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,793 @@ | |||
| /**************************************************************************//**
 | ||||
|  * @file     core_cm0plus.h | ||||
|  * @brief    CMSIS Cortex-M0+ Core Peripheral Access Layer Header File | ||||
|  * @version  V3.20 | ||||
|  * @date     25. February 2013 | ||||
|  * | ||||
|  * @note | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| /* Copyright (c) 2009 - 2013 ARM LIMITED
 | ||||
| 
 | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #if defined ( __ICCARM__ ) | ||||
|  #pragma system_include  /* treat file as system include file for MISRA check */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __CORE_CM0PLUS_H_GENERIC | ||||
| #define __CORE_CM0PLUS_H_GENERIC | ||||
| 
 | ||||
| /** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
 | ||||
|   CMSIS violates the following MISRA-C:2004 rules: | ||||
| 
 | ||||
|    \li Required Rule 8.5, object/function definition in header file.<br> | ||||
|      Function definitions in header files are used to allow 'inlining'. | ||||
| 
 | ||||
|    \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | ||||
|      Unions are used for effective representation of core registers. | ||||
| 
 | ||||
|    \li Advisory Rule 19.7, Function-like macro defined.<br> | ||||
|      Function-like macros are used to allow more efficient code. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                 CMSIS definitions | ||||
|  ******************************************************************************/ | ||||
| /** \ingroup Cortex-M0+
 | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /*  CMSIS CM0P definitions */ | ||||
| #define __CM0PLUS_CMSIS_VERSION_MAIN (0x03)                                /*!< [31:16] CMSIS HAL main version   */ | ||||
| #define __CM0PLUS_CMSIS_VERSION_SUB  (0x20)                                /*!< [15:0]  CMSIS HAL sub version    */ | ||||
| #define __CM0PLUS_CMSIS_VERSION      ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ | ||||
|                                        __CM0PLUS_CMSIS_VERSION_SUB)        /*!< CMSIS HAL version number         */ | ||||
| 
 | ||||
| #define __CORTEX_M                (0x00)                                   /*!< Cortex-M Core                    */ | ||||
| 
 | ||||
| 
 | ||||
| #if   defined ( __CC_ARM ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */ | ||||
|   #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */ | ||||
|   #define __STATIC_INLINE  static __inline | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */ | ||||
|   #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */ | ||||
|   #define __STATIC_INLINE  static inline | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all
 | ||||
| */ | ||||
| #define __FPU_USED       0 | ||||
| 
 | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #if defined __FPU_VFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h>                      /* standard types definitions                      */ | ||||
| #include <core_cmInstr.h>                /* Core Instruction Access                         */ | ||||
| #include <core_cmFunc.h>                 /* Core Function Access                            */ | ||||
| 
 | ||||
| #endif /* __CORE_CM0PLUS_H_GENERIC */ | ||||
| 
 | ||||
| #ifndef __CMSIS_GENERIC | ||||
| 
 | ||||
| #ifndef __CORE_CM0PLUS_H_DEPENDANT | ||||
| #define __CORE_CM0PLUS_H_DEPENDANT | ||||
| 
 | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM0PLUS_REV | ||||
|     #define __CM0PLUS_REV             0x0000 | ||||
|     #warning "__CM0PLUS_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __MPU_PRESENT | ||||
|     #define __MPU_PRESENT             0 | ||||
|     #warning "__MPU_PRESENT not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __VTOR_PRESENT | ||||
|     #define __VTOR_PRESENT            0 | ||||
|     #warning "__VTOR_PRESENT not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2 | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
| 
 | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0 | ||||
|     #warning "__Vendor_SysTickConfig not defined in device header file; using default!" | ||||
|   #endif | ||||
| #endif | ||||
| 
 | ||||
| /* IO definitions (access restrictions to peripheral registers) */ | ||||
| /**
 | ||||
|     \defgroup CMSIS_glob_defs CMSIS Global Defines | ||||
| 
 | ||||
|     <strong>IO Type Qualifiers</strong> are used | ||||
|     \li to specify the access to peripheral variables. | ||||
|     \li for automatic generation of peripheral register debug information. | ||||
| */ | ||||
| #ifdef __cplusplus | ||||
|   #define   __I     volatile             /*!< Defines 'read only' permissions                 */ | ||||
| #else | ||||
|   #define   __I     volatile const       /*!< Defines 'read only' permissions                 */ | ||||
| #endif | ||||
| #define     __O     volatile             /*!< Defines 'write only' permissions                */ | ||||
| #define     __IO    volatile             /*!< Defines 'read / write' permissions              */ | ||||
| 
 | ||||
| /*@} end of group Cortex-M0+ */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                 Register Abstraction | ||||
|   Core Register contain: | ||||
|   - Core Register | ||||
|   - Core NVIC Register | ||||
|   - Core SCB Register | ||||
|   - Core SysTick Register | ||||
|   - Core MPU Register | ||||
|  ******************************************************************************/ | ||||
| /** \defgroup CMSIS_core_register Defines and Type Definitions
 | ||||
|     \brief Type definitions and defines for Cortex-M processor based devices. | ||||
| */ | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_CORE  Status and Control Registers | ||||
|     \brief  Core Register type definitions. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Union type to access the Application Program Status Register (APSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
| #if (__CORTEX_M != 0x04) | ||||
|     uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */ | ||||
| #else | ||||
|     uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */ | ||||
|     uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */ | ||||
|     uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */ | ||||
| #endif | ||||
|     uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } APSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Interrupt Program Status Register (IPSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */ | ||||
|     uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } IPSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */ | ||||
| #if (__CORTEX_M != 0x04) | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */ | ||||
| #else | ||||
|     uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */ | ||||
|     uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */ | ||||
|     uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */ | ||||
| #endif | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */ | ||||
|     uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */ | ||||
|     uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } xPSR_Type; | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Union type to access the Control Registers (CONTROL).
 | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */ | ||||
|     uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */ | ||||
|     uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */ | ||||
|   } b;                                   /*!< Structure used for bit  access                  */ | ||||
|   uint32_t w;                            /*!< Type      used for word access                  */ | ||||
| } CONTROL_Type; | ||||
| 
 | ||||
| /*@} end of group CMSIS_CORE */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC) | ||||
|     \brief      Type definitions for the NVIC Registers | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */ | ||||
|        uint32_t RESERVED0[31]; | ||||
|   __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */ | ||||
|        uint32_t RSERVED1[31]; | ||||
|   __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */ | ||||
|        uint32_t RESERVED2[31]; | ||||
|   __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */ | ||||
|        uint32_t RESERVED3[31]; | ||||
|        uint32_t RESERVED4[64]; | ||||
|   __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */ | ||||
| }  NVIC_Type; | ||||
| 
 | ||||
| /*@} end of group CMSIS_NVIC */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_SCB     System Control Block (SCB) | ||||
|     \brief      Type definitions for the System Control Block Registers | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the System Control Block (SCB).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */ | ||||
|   __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */ | ||||
| #if (__VTOR_PRESENT == 1) | ||||
|   __IO uint32_t VTOR;                    /*!< Offset: 0x008 (R/W)  Vector Table Offset Register                          */ | ||||
| #else | ||||
|        uint32_t RESERVED0; | ||||
| #endif | ||||
|   __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */ | ||||
|   __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */ | ||||
|   __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */ | ||||
|        uint32_t RESERVED1; | ||||
|   __IO uint32_t SHP[2];                  /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */ | ||||
|   __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */ | ||||
| } SCB_Type; | ||||
| 
 | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
| 
 | ||||
| #define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */ | ||||
| #define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */ | ||||
| 
 | ||||
| /* SCB Interrupt Control State Register Definitions */ | ||||
| #define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
| 
 | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */ | ||||
| #define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */ | ||||
| 
 | ||||
| #if (__VTOR_PRESENT == 1) | ||||
| /* SCB Interrupt Control State Register Definitions */ | ||||
| #define SCB_VTOR_TBLOFF_Pos                 8                                             /*!< SCB VTOR: TBLOFF Position */ | ||||
| #define SCB_VTOR_TBLOFF_Msk                (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */ | ||||
| #endif | ||||
| 
 | ||||
| /* SCB Application Interrupt and Reset Control Register Definitions */ | ||||
| #define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
| 
 | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */ | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */ | ||||
| 
 | ||||
| /* SCB System Control Register Definitions */ | ||||
| #define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
| 
 | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
| 
 | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */ | ||||
| #define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */ | ||||
| 
 | ||||
| /* SCB Configuration Control Register Definitions */ | ||||
| #define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
| 
 | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */ | ||||
| #define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */ | ||||
| 
 | ||||
| /* SCB System Handler Control and State Register Definitions */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */ | ||||
| 
 | ||||
| /*@} end of group CMSIS_SCB */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_SysTick     System Tick Timer (SysTick) | ||||
|     \brief      Type definitions for the System Timer Registers. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the System Timer (SysTick).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */ | ||||
|   __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */ | ||||
|   __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */ | ||||
| } SysTick_Type; | ||||
| 
 | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
| 
 | ||||
| #define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */ | ||||
| #define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */ | ||||
| 
 | ||||
| /* SysTick Reload Register Definitions */ | ||||
| #define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */ | ||||
| #define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */ | ||||
| 
 | ||||
| /* SysTick Current Register Definitions */ | ||||
| #define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */ | ||||
| #define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */ | ||||
| 
 | ||||
| /* SysTick Calibration Register Definitions */ | ||||
| #define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
| 
 | ||||
| #define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
| 
 | ||||
| #define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */ | ||||
| 
 | ||||
| /*@} end of group CMSIS_SysTick */ | ||||
| 
 | ||||
| #if (__MPU_PRESENT == 1) | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_MPU     Memory Protection Unit (MPU) | ||||
|     \brief      Type definitions for the Memory Protection Unit (MPU) | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /** \brief  Structure type to access the Memory Protection Unit (MPU).
 | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __I  uint32_t TYPE;                    /*!< Offset: 0x000 (R/ )  MPU Type Register                              */ | ||||
|   __IO uint32_t CTRL;                    /*!< Offset: 0x004 (R/W)  MPU Control Register                           */ | ||||
|   __IO uint32_t RNR;                     /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register                     */ | ||||
|   __IO uint32_t RBAR;                    /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register               */ | ||||
|   __IO uint32_t RASR;                    /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register         */ | ||||
| } MPU_Type; | ||||
| 
 | ||||
| /* MPU Type Register */ | ||||
| #define MPU_TYPE_IREGION_Pos               16                                             /*!< MPU TYPE: IREGION Position */ | ||||
| #define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */ | ||||
| 
 | ||||
| #define MPU_TYPE_DREGION_Pos                8                                             /*!< MPU TYPE: DREGION Position */ | ||||
| #define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */ | ||||
| 
 | ||||
| #define MPU_TYPE_SEPARATE_Pos               0                                             /*!< MPU TYPE: SEPARATE Position */ | ||||
| #define MPU_TYPE_SEPARATE_Msk              (1UL << MPU_TYPE_SEPARATE_Pos)                 /*!< MPU TYPE: SEPARATE Mask */ | ||||
| 
 | ||||
| /* MPU Control Register */ | ||||
| #define MPU_CTRL_PRIVDEFENA_Pos             2                                             /*!< MPU CTRL: PRIVDEFENA Position */ | ||||
| #define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */ | ||||
| 
 | ||||
| #define MPU_CTRL_HFNMIENA_Pos               1                                             /*!< MPU CTRL: HFNMIENA Position */ | ||||
| #define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */ | ||||
| 
 | ||||
| #define MPU_CTRL_ENABLE_Pos                 0                                             /*!< MPU CTRL: ENABLE Position */ | ||||
| #define MPU_CTRL_ENABLE_Msk                (1UL << MPU_CTRL_ENABLE_Pos)                   /*!< MPU CTRL: ENABLE Mask */ | ||||
| 
 | ||||
| /* MPU Region Number Register */ | ||||
| #define MPU_RNR_REGION_Pos                  0                                             /*!< MPU RNR: REGION Position */ | ||||
| #define MPU_RNR_REGION_Msk                 (0xFFUL << MPU_RNR_REGION_Pos)                 /*!< MPU RNR: REGION Mask */ | ||||
| 
 | ||||
| /* MPU Region Base Address Register */ | ||||
| #define MPU_RBAR_ADDR_Pos                   8                                             /*!< MPU RBAR: ADDR Position */ | ||||
| #define MPU_RBAR_ADDR_Msk                  (0xFFFFFFUL << MPU_RBAR_ADDR_Pos)              /*!< MPU RBAR: ADDR Mask */ | ||||
| 
 | ||||
| #define MPU_RBAR_VALID_Pos                  4                                             /*!< MPU RBAR: VALID Position */ | ||||
| #define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */ | ||||
| 
 | ||||
| #define MPU_RBAR_REGION_Pos                 0                                             /*!< MPU RBAR: REGION Position */ | ||||
| #define MPU_RBAR_REGION_Msk                (0xFUL << MPU_RBAR_REGION_Pos)                 /*!< MPU RBAR: REGION Mask */ | ||||
| 
 | ||||
| /* MPU Region Attribute and Size Register */ | ||||
| #define MPU_RASR_ATTRS_Pos                 16                                             /*!< MPU RASR: MPU Region Attribute field Position */ | ||||
| #define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_XN_Pos                    28                                             /*!< MPU RASR: ATTRS.XN Position */ | ||||
| #define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_AP_Pos                    24                                             /*!< MPU RASR: ATTRS.AP Position */ | ||||
| #define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_TEX_Pos                   19                                             /*!< MPU RASR: ATTRS.TEX Position */ | ||||
| #define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_S_Pos                     18                                             /*!< MPU RASR: ATTRS.S Position */ | ||||
| #define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_C_Pos                     17                                             /*!< MPU RASR: ATTRS.C Position */ | ||||
| #define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_B_Pos                     16                                             /*!< MPU RASR: ATTRS.B Position */ | ||||
| #define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_SRD_Pos                    8                                             /*!< MPU RASR: Sub-Region Disable Position */ | ||||
| #define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_SIZE_Pos                   1                                             /*!< MPU RASR: Region Size Field Position */ | ||||
| #define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */ | ||||
| 
 | ||||
| #define MPU_RASR_ENABLE_Pos                 0                                             /*!< MPU RASR: Region enable bit Position */ | ||||
| #define MPU_RASR_ENABLE_Msk                (1UL << MPU_RASR_ENABLE_Pos)                   /*!< MPU RASR: Region enable bit Disable Mask */ | ||||
| 
 | ||||
| /*@} end of group CMSIS_MPU */ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup  CMSIS_core_register
 | ||||
|     \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug) | ||||
|     \brief      Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) | ||||
|                 are only accessible over DAP and not via processor. Therefore | ||||
|                 they are not covered by the Cortex-M0 header file. | ||||
|   @{ | ||||
|  */ | ||||
| /*@} end of group CMSIS_CoreDebug */ | ||||
| 
 | ||||
| 
 | ||||
| /** \ingroup    CMSIS_core_register
 | ||||
|     \defgroup   CMSIS_core_base     Core Definitions | ||||
|     \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| /* Memory mapping of Cortex-M0+ Hardware */ | ||||
| #define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */ | ||||
| #define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */ | ||||
| #define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */ | ||||
| #define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */ | ||||
| 
 | ||||
| #define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */ | ||||
| #define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */ | ||||
| #define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */ | ||||
| 
 | ||||
| #if (__MPU_PRESENT == 1) | ||||
|   #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit             */ | ||||
|   #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit             */ | ||||
| #endif | ||||
| 
 | ||||
| /*@} */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                Hardware Abstraction Layer | ||||
|   Core Function Interface contains: | ||||
|   - Core NVIC Functions | ||||
|   - Core SysTick Functions | ||||
|   - Core Register Access Functions | ||||
|  ******************************************************************************/ | ||||
| /** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
 | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* ##########################   NVIC functions  #################################### */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface
 | ||||
|     \defgroup CMSIS_Core_NVICFunctions NVIC Functions | ||||
|     \brief      Functions that manage interrupts and exceptions via the NVIC. | ||||
|     @{ | ||||
|  */ | ||||
| 
 | ||||
| /* Interrupt Priorities are WORD accessible only under ARMv6M                   */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  (((uint32_t)(IRQn)       )    &  0x03) * 8 ) | ||||
| #define _SHP_IDX(IRQn)           ( ((((uint32_t)(IRQn) & 0x0F)-8) >>    2)     ) | ||||
| #define _IP_IDX(IRQn)            (   ((uint32_t)(IRQn)            >>    2)     ) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Enable External Interrupt
 | ||||
| 
 | ||||
|     The function enables a device-specific interrupt in the NVIC interrupt controller. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Disable External Interrupt
 | ||||
| 
 | ||||
|     The function disables a device-specific interrupt in the NVIC interrupt controller. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Pending Interrupt
 | ||||
| 
 | ||||
|     The function reads the pending register in the NVIC and returns the pending bit | ||||
|     for the specified interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. | ||||
| 
 | ||||
|     \return             0  Interrupt status is not pending. | ||||
|     \return             1  Interrupt status is pending. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Pending Interrupt
 | ||||
| 
 | ||||
|     The function sets the pending bit of an external interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Clear Pending Interrupt
 | ||||
| 
 | ||||
|     The function clears the pending bit of an external interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  External interrupt number. Value cannot be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Interrupt Priority
 | ||||
| 
 | ||||
|     The function sets the priority of an interrupt. | ||||
| 
 | ||||
|     \note The priority cannot be set for every core interrupt. | ||||
| 
 | ||||
|     \param [in]      IRQn  Interrupt number. | ||||
|     \param [in]  priority  Priority to set. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if(IRQn < 0) { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | | ||||
|         (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } | ||||
|   else { | ||||
|     NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | | ||||
|         (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Interrupt Priority
 | ||||
| 
 | ||||
|     The function reads the priority of an interrupt. The interrupt | ||||
|     number can be positive to specify an external (device specific) | ||||
|     interrupt, or negative to specify an internal (core) interrupt. | ||||
| 
 | ||||
| 
 | ||||
|     \param [in]   IRQn  Interrupt number. | ||||
|     \return             Interrupt Priority. Value is aligned automatically to the implemented | ||||
|                         priority bits of the microcontroller. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) | ||||
| { | ||||
| 
 | ||||
|   if(IRQn < 0) { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */ | ||||
|   else { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  System Reset
 | ||||
| 
 | ||||
|     The function initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                     /* Ensure all outstanding memory accesses included
 | ||||
|                                                                   buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                     /* Ensure completion of memory access */ | ||||
|   while(1);                                                    /* wait until reset */ | ||||
| } | ||||
| 
 | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface
 | ||||
|     \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|     \brief      Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| #if (__Vendor_SysTickConfig == 0) | ||||
| 
 | ||||
| /** \brief  System Tick Configuration
 | ||||
| 
 | ||||
|     The function initializes the System Timer and its interrupt, and starts the System Tick Timer. | ||||
|     Counter is in free running mode to generate periodic interrupts. | ||||
| 
 | ||||
|     \param [in]  ticks  Number of ticks between two interrupts. | ||||
| 
 | ||||
|     \return          0  Function succeeded. | ||||
|     \return          1  Function failed. | ||||
| 
 | ||||
|     \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the | ||||
|     function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | ||||
|     must contain a vendor-specific implementation of this function. | ||||
| 
 | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) | ||||
| { | ||||
|   if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */ | ||||
| 
 | ||||
|   SysTick->LOAD  = ticks - 1;                                  /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */ | ||||
|   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | | ||||
|                    SysTick_CTRL_TICKINT_Msk   | | ||||
|                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */ | ||||
|   return (0);                                                  /* Function successful */ | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif /* __CORE_CM0PLUS_H_DEPENDANT */ | ||||
| 
 | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										1627
									
								
								third_party/core/core_cm3.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1627
									
								
								third_party/core/core_cm3.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1772
									
								
								third_party/core/core_cm4.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1772
									
								
								third_party/core/core_cm4.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										673
									
								
								third_party/core/core_cm4_simd.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										673
									
								
								third_party/core/core_cm4_simd.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,673 @@ | |||
| /**************************************************************************//**
 | ||||
|  * @file     core_cm4_simd.h | ||||
|  * @brief    CMSIS Cortex-M4 SIMD Header File | ||||
|  * @version  V3.20 | ||||
|  * @date     25. February 2013 | ||||
|  * | ||||
|  * @note | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| /* Copyright (c) 2009 - 2013 ARM LIMITED
 | ||||
| 
 | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __CORE_CM4_SIMD_H | ||||
| #define __CORE_CM4_SIMD_H | ||||
| 
 | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  *                Hardware Abstraction Layer | ||||
|  ******************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| /* ###################  Compiler specific Intrinsics  ########################### */ | ||||
| /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
 | ||||
|   Access to dedicated SIMD instructions | ||||
|   @{ | ||||
| */ | ||||
| 
 | ||||
| #if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ | ||||
| /* ARM armcc specific functions */ | ||||
| 
 | ||||
| /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| #define __SADD8                           __sadd8 | ||||
| #define __QADD8                           __qadd8 | ||||
| #define __SHADD8                          __shadd8 | ||||
| #define __UADD8                           __uadd8 | ||||
| #define __UQADD8                          __uqadd8 | ||||
| #define __UHADD8                          __uhadd8 | ||||
| #define __SSUB8                           __ssub8 | ||||
| #define __QSUB8                           __qsub8 | ||||
| #define __SHSUB8                          __shsub8 | ||||
| #define __USUB8                           __usub8 | ||||
| #define __UQSUB8                          __uqsub8 | ||||
| #define __UHSUB8                          __uhsub8 | ||||
| #define __SADD16                          __sadd16 | ||||
| #define __QADD16                          __qadd16 | ||||
| #define __SHADD16                         __shadd16 | ||||
| #define __UADD16                          __uadd16 | ||||
| #define __UQADD16                         __uqadd16 | ||||
| #define __UHADD16                         __uhadd16 | ||||
| #define __SSUB16                          __ssub16 | ||||
| #define __QSUB16                          __qsub16 | ||||
| #define __SHSUB16                         __shsub16 | ||||
| #define __USUB16                          __usub16 | ||||
| #define __UQSUB16                         __uqsub16 | ||||
| #define __UHSUB16                         __uhsub16 | ||||
| #define __SASX                            __sasx | ||||
| #define __QASX                            __qasx | ||||
| #define __SHASX                           __shasx | ||||
| #define __UASX                            __uasx | ||||
| #define __UQASX                           __uqasx | ||||
| #define __UHASX                           __uhasx | ||||
| #define __SSAX                            __ssax | ||||
| #define __QSAX                            __qsax | ||||
| #define __SHSAX                           __shsax | ||||
| #define __USAX                            __usax | ||||
| #define __UQSAX                           __uqsax | ||||
| #define __UHSAX                           __uhsax | ||||
| #define __USAD8                           __usad8 | ||||
| #define __USADA8                          __usada8 | ||||
| #define __SSAT16                          __ssat16 | ||||
| #define __USAT16                          __usat16 | ||||
| #define __UXTB16                          __uxtb16 | ||||
| #define __UXTAB16                         __uxtab16 | ||||
| #define __SXTB16                          __sxtb16 | ||||
| #define __SXTAB16                         __sxtab16 | ||||
| #define __SMUAD                           __smuad | ||||
| #define __SMUADX                          __smuadx | ||||
| #define __SMLAD                           __smlad | ||||
| #define __SMLADX                          __smladx | ||||
| #define __SMLALD                          __smlald | ||||
| #define __SMLALDX                         __smlaldx | ||||
| #define __SMUSD                           __smusd | ||||
| #define __SMUSDX                          __smusdx | ||||
| #define __SMLSD                           __smlsd | ||||
| #define __SMLSDX                          __smlsdx | ||||
| #define __SMLSLD                          __smlsld | ||||
| #define __SMLSLDX                         __smlsldx | ||||
| #define __SEL                             __sel | ||||
| #define __QADD                            __qadd | ||||
| #define __QSUB                            __qsub | ||||
| 
 | ||||
| #define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \ | ||||
|                                            ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  ) | ||||
| 
 | ||||
| #define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \ | ||||
|                                            ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  ) | ||||
| 
 | ||||
| #define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ | ||||
|                                                       ((int64_t)(ARG3) << 32)      ) >> 32)) | ||||
| 
 | ||||
| /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ | ||||
| /* IAR iccarm specific functions */ | ||||
| 
 | ||||
| /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| #include <cmsis_iar.h> | ||||
| 
 | ||||
| /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ | ||||
| /* TI CCS specific functions */ | ||||
| 
 | ||||
| /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| #include <cmsis_ccs.h> | ||||
| 
 | ||||
| /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ | ||||
| /* GNU gcc specific functions */ | ||||
| 
 | ||||
| /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| #define __SSAT16(ARG1,ARG2) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1); \ | ||||
|   __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| #define __USAT16(ARG1,ARG2) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1); \ | ||||
|   __ASM ("usat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| #define __SMLALD(ARG1,ARG2,ARG3) \ | ||||
| ({ \ | ||||
|   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ | ||||
|   __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ | ||||
|   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ | ||||
|  }) | ||||
| 
 | ||||
| #define __SMLALDX(ARG1,ARG2,ARG3) \ | ||||
| ({ \ | ||||
|   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ | ||||
|   __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ | ||||
|   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ | ||||
|  }) | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| #define __SMLSLD(ARG1,ARG2,ARG3) \ | ||||
| ({ \ | ||||
|   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ | ||||
|   __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ | ||||
|   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ | ||||
|  }) | ||||
| 
 | ||||
| #define __SMLSLDX(ARG1,ARG2,ARG3) \ | ||||
| ({ \ | ||||
|   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ | ||||
|   __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ | ||||
|   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ | ||||
|  }) | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| #define __PKHBT(ARG1,ARG2,ARG3) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ | ||||
|   __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| #define __PKHTB(ARG1,ARG2,ARG3) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ | ||||
|   if (ARG3 == 0) \ | ||||
|     __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2)  ); \ | ||||
|   else \ | ||||
|     __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) | ||||
| { | ||||
|  int32_t result; | ||||
| 
 | ||||
|  __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r"  (op1), "r" (op2), "r" (op3) ); | ||||
|  return(result); | ||||
| } | ||||
| 
 | ||||
| /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ | ||||
| /* TASKING carm specific functions */ | ||||
| 
 | ||||
| 
 | ||||
| /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| /* not yet supported */ | ||||
| /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /*@} end of group CMSIS_SIMD_intrinsics */ | ||||
| 
 | ||||
| 
 | ||||
| #endif /* __CORE_CM4_SIMD_H */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										638
									
								
								third_party/core/core_cmFunc.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										638
									
								
								third_party/core/core_cmFunc.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,638 @@ | |||
| /**************************************************************************//**
 | ||||
|  * @file     core_cmFunc.h | ||||
|  * @brief    CMSIS Cortex-M Core Function Access Header File | ||||
|  * @version  V3.20 | ||||
|  * @date     25. February 2013 | ||||
|  * | ||||
|  * @note | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| /* Copyright (c) 2009 - 2013 ARM LIMITED
 | ||||
| 
 | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef __CORE_CMFUNC_H | ||||
| #define __CORE_CMFUNC_H | ||||
| 
 | ||||
| 
 | ||||
| /* ###########################  Core Function Access  ########################### */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface
 | ||||
|     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions | ||||
|   @{ | ||||
|  */ | ||||
| 
 | ||||
| #if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ | ||||
| /* ARM armcc specific functions */ | ||||
| 
 | ||||
| #if (__ARMCC_VERSION < 400677) | ||||
|   #error "Please use ARM Compiler Toolchain V4.0.677 or later!" | ||||
| #endif | ||||
| 
 | ||||
| /* intrinsic void __enable_irq();     */ | ||||
| /* intrinsic void __disable_irq();    */ | ||||
| 
 | ||||
| /** \brief  Get Control Register
 | ||||
| 
 | ||||
|     This function returns the content of the Control Register. | ||||
| 
 | ||||
|     \return               Control Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_CONTROL(void) | ||||
| { | ||||
|   register uint32_t __regControl         __ASM("control"); | ||||
|   return(__regControl); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Control Register
 | ||||
| 
 | ||||
|     This function writes the given value to the Control Register. | ||||
| 
 | ||||
|     \param [in]    control  Control Register value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_CONTROL(uint32_t control) | ||||
| { | ||||
|   register uint32_t __regControl         __ASM("control"); | ||||
|   __regControl = control; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get IPSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the IPSR Register. | ||||
| 
 | ||||
|     \return               IPSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_IPSR(void) | ||||
| { | ||||
|   register uint32_t __regIPSR          __ASM("ipsr"); | ||||
|   return(__regIPSR); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get APSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the APSR Register. | ||||
| 
 | ||||
|     \return               APSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_APSR(void) | ||||
| { | ||||
|   register uint32_t __regAPSR          __ASM("apsr"); | ||||
|   return(__regAPSR); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get xPSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the xPSR Register. | ||||
| 
 | ||||
|     \return               xPSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_xPSR(void) | ||||
| { | ||||
|   register uint32_t __regXPSR          __ASM("xpsr"); | ||||
|   return(__regXPSR); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Process Stack Pointer
 | ||||
| 
 | ||||
|     This function returns the current value of the Process Stack Pointer (PSP). | ||||
| 
 | ||||
|     \return               PSP Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_PSP(void) | ||||
| { | ||||
|   register uint32_t __regProcessStackPointer  __ASM("psp"); | ||||
|   return(__regProcessStackPointer); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Process Stack Pointer
 | ||||
| 
 | ||||
|     This function assigns the given value to the Process Stack Pointer (PSP). | ||||
| 
 | ||||
|     \param [in]    topOfProcStack  Process Stack Pointer value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) | ||||
| { | ||||
|   register uint32_t __regProcessStackPointer  __ASM("psp"); | ||||
|   __regProcessStackPointer = topOfProcStack; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Main Stack Pointer
 | ||||
| 
 | ||||
|     This function returns the current value of the Main Stack Pointer (MSP). | ||||
| 
 | ||||
|     \return               MSP Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_MSP(void) | ||||
| { | ||||
|   register uint32_t __regMainStackPointer     __ASM("msp"); | ||||
|   return(__regMainStackPointer); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Main Stack Pointer
 | ||||
| 
 | ||||
|     This function assigns the given value to the Main Stack Pointer (MSP). | ||||
| 
 | ||||
|     \param [in]    topOfMainStack  Main Stack Pointer value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) | ||||
| { | ||||
|   register uint32_t __regMainStackPointer     __ASM("msp"); | ||||
|   __regMainStackPointer = topOfMainStack; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Priority Mask
 | ||||
| 
 | ||||
|     This function returns the current state of the priority mask bit from the Priority Mask Register. | ||||
| 
 | ||||
|     \return               Priority Mask value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_PRIMASK(void) | ||||
| { | ||||
|   register uint32_t __regPriMask         __ASM("primask"); | ||||
|   return(__regPriMask); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Priority Mask
 | ||||
| 
 | ||||
|     This function assigns the given value to the Priority Mask Register. | ||||
| 
 | ||||
|     \param [in]    priMask  Priority Mask | ||||
|  */ | ||||
| __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) | ||||
| { | ||||
|   register uint32_t __regPriMask         __ASM("primask"); | ||||
|   __regPriMask = (priMask); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M >= 0x03) | ||||
| 
 | ||||
| /** \brief  Enable FIQ
 | ||||
| 
 | ||||
|     This function enables FIQ interrupts by clearing the F-bit in the CPSR. | ||||
|     Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __enable_fault_irq                __enable_fiq | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Disable FIQ
 | ||||
| 
 | ||||
|     This function disables FIQ interrupts by setting the F-bit in the CPSR. | ||||
|     Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __disable_fault_irq               __disable_fiq | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Base Priority
 | ||||
| 
 | ||||
|     This function returns the current value of the Base Priority register. | ||||
| 
 | ||||
|     \return               Base Priority register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t  __get_BASEPRI(void) | ||||
| { | ||||
|   register uint32_t __regBasePri         __ASM("basepri"); | ||||
|   return(__regBasePri); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Base Priority
 | ||||
| 
 | ||||
|     This function assigns the given value to the Base Priority register. | ||||
| 
 | ||||
|     \param [in]    basePri  Base Priority value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) | ||||
| { | ||||
|   register uint32_t __regBasePri         __ASM("basepri"); | ||||
|   __regBasePri = (basePri & 0xff); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Fault Mask
 | ||||
| 
 | ||||
|     This function returns the current value of the Fault Mask register. | ||||
| 
 | ||||
|     \return               Fault Mask register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_FAULTMASK(void) | ||||
| { | ||||
|   register uint32_t __regFaultMask       __ASM("faultmask"); | ||||
|   return(__regFaultMask); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Fault Mask
 | ||||
| 
 | ||||
|     This function assigns the given value to the Fault Mask register. | ||||
| 
 | ||||
|     \param [in]    faultMask  Fault Mask value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) | ||||
| { | ||||
|   register uint32_t __regFaultMask       __ASM("faultmask"); | ||||
|   __regFaultMask = (faultMask & (uint32_t)1); | ||||
| } | ||||
| 
 | ||||
| #endif /* (__CORTEX_M >= 0x03) */ | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M == 0x04) | ||||
| 
 | ||||
| /** \brief  Get FPSCR
 | ||||
| 
 | ||||
|     This function returns the current value of the Floating Point Status/Control register. | ||||
| 
 | ||||
|     \return               Floating Point Status/Control register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_FPSCR(void) | ||||
| { | ||||
| #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   return(__regfpscr); | ||||
| #else | ||||
|    return(0); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set FPSCR
 | ||||
| 
 | ||||
|     This function assigns the given value to the Floating Point Status/Control register. | ||||
| 
 | ||||
|     \param [in]    fpscr  Floating Point Status/Control value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) | ||||
| { | ||||
| #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   __regfpscr = (fpscr); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #endif /* (__CORTEX_M == 0x04) */ | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ | ||||
| /* IAR iccarm specific functions */ | ||||
| 
 | ||||
| #include <cmsis_iar.h> | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ | ||||
| /* TI CCS specific functions */ | ||||
| 
 | ||||
| #include <cmsis_ccs.h> | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ | ||||
| /* GNU gcc specific functions */ | ||||
| 
 | ||||
| /** \brief  Enable IRQ Interrupts
 | ||||
| 
 | ||||
|   This function enables IRQ interrupts by clearing the I-bit in the CPSR. | ||||
|   Can only be executed in Privileged modes. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) | ||||
| { | ||||
|   __ASM volatile ("cpsie i" : : : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Disable IRQ Interrupts
 | ||||
| 
 | ||||
|   This function disables IRQ interrupts by setting the I-bit in the CPSR. | ||||
|   Can only be executed in Privileged modes. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) | ||||
| { | ||||
|   __ASM volatile ("cpsid i" : : : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Control Register
 | ||||
| 
 | ||||
|     This function returns the content of the Control Register. | ||||
| 
 | ||||
|     \return               Control Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, control" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Control Register
 | ||||
| 
 | ||||
|     This function writes the given value to the Control Register. | ||||
| 
 | ||||
|     \param [in]    control  Control Register value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) | ||||
| { | ||||
|   __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get IPSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the IPSR Register. | ||||
| 
 | ||||
|     \return               IPSR Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get APSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the APSR Register. | ||||
| 
 | ||||
|     \return               APSR Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, apsr" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get xPSR Register
 | ||||
| 
 | ||||
|     This function returns the content of the xPSR Register. | ||||
| 
 | ||||
|     \return               xPSR Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Process Stack Pointer
 | ||||
| 
 | ||||
|     This function returns the current value of the Process Stack Pointer (PSP). | ||||
| 
 | ||||
|     \return               PSP Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) | ||||
| { | ||||
|   register uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, psp\n"  : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Process Stack Pointer
 | ||||
| 
 | ||||
|     This function assigns the given value to the Process Stack Pointer (PSP). | ||||
| 
 | ||||
|     \param [in]    topOfProcStack  Process Stack Pointer value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) | ||||
| { | ||||
|   __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Main Stack Pointer
 | ||||
| 
 | ||||
|     This function returns the current value of the Main Stack Pointer (MSP). | ||||
| 
 | ||||
|     \return               MSP Register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) | ||||
| { | ||||
|   register uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Main Stack Pointer
 | ||||
| 
 | ||||
|     This function assigns the given value to the Main Stack Pointer (MSP). | ||||
| 
 | ||||
|     \param [in]    topOfMainStack  Main Stack Pointer value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) | ||||
| { | ||||
|   __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Priority Mask
 | ||||
| 
 | ||||
|     This function returns the current state of the priority mask bit from the Priority Mask Register. | ||||
| 
 | ||||
|     \return               Priority Mask value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, primask" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Priority Mask
 | ||||
| 
 | ||||
|     This function assigns the given value to the Priority Mask Register. | ||||
| 
 | ||||
|     \param [in]    priMask  Priority Mask | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) | ||||
| { | ||||
|   __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M >= 0x03) | ||||
| 
 | ||||
| /** \brief  Enable FIQ
 | ||||
| 
 | ||||
|     This function enables FIQ interrupts by clearing the F-bit in the CPSR. | ||||
|     Can only be executed in Privileged modes. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) | ||||
| { | ||||
|   __ASM volatile ("cpsie f" : : : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Disable FIQ
 | ||||
| 
 | ||||
|     This function disables FIQ interrupts by setting the F-bit in the CPSR. | ||||
|     Can only be executed in Privileged modes. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) | ||||
| { | ||||
|   __ASM volatile ("cpsid f" : : : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Base Priority
 | ||||
| 
 | ||||
|     This function returns the current value of the Base Priority register. | ||||
| 
 | ||||
|     \return               Base Priority register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Base Priority
 | ||||
| 
 | ||||
|     This function assigns the given value to the Base Priority register. | ||||
| 
 | ||||
|     \param [in]    basePri  Base Priority value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) | ||||
| { | ||||
|   __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Get Fault Mask
 | ||||
| 
 | ||||
|     This function returns the current value of the Fault Mask register. | ||||
| 
 | ||||
|     \return               Fault Mask register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set Fault Mask
 | ||||
| 
 | ||||
|     This function assigns the given value to the Fault Mask register. | ||||
| 
 | ||||
|     \param [in]    faultMask  Fault Mask value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) | ||||
| { | ||||
|   __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); | ||||
| } | ||||
| 
 | ||||
| #endif /* (__CORTEX_M >= 0x03) */ | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M == 0x04) | ||||
| 
 | ||||
| /** \brief  Get FPSCR
 | ||||
| 
 | ||||
|     This function returns the current value of the Floating Point Status/Control register. | ||||
| 
 | ||||
|     \return               Floating Point Status/Control register value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) | ||||
| { | ||||
| #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   /* Empty asm statement works as a scheduling barrier */ | ||||
|   __ASM volatile (""); | ||||
|   __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); | ||||
|   __ASM volatile (""); | ||||
|   return(result); | ||||
| #else | ||||
|    return(0); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Set FPSCR
 | ||||
| 
 | ||||
|     This function assigns the given value to the Floating Point Status/Control register. | ||||
| 
 | ||||
|     \param [in]    fpscr  Floating Point Status/Control value to set | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) | ||||
| { | ||||
| #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | ||||
|   /* Empty asm statement works as a scheduling barrier */ | ||||
|   __ASM volatile (""); | ||||
|   __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); | ||||
|   __ASM volatile (""); | ||||
| #else | ||||
|   (void) fpscr; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #endif /* (__CORTEX_M == 0x04) */ | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ | ||||
| /* TASKING carm specific functions */ | ||||
| 
 | ||||
| /*
 | ||||
|  * The CMSIS functions have been implemented as intrinsics in the compiler. | ||||
|  * Please use "carm -?i" to get an up to date list of all instrinsics, | ||||
|  * Including the CMSIS ones. | ||||
|  */ | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /*@} end of CMSIS_Core_RegAccFunctions */ | ||||
| 
 | ||||
| 
 | ||||
| #endif /* __CORE_CMFUNC_H */ | ||||
							
								
								
									
										688
									
								
								third_party/core/core_cmInstr.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										688
									
								
								third_party/core/core_cmInstr.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,688 @@ | |||
| /**************************************************************************//**
 | ||||
|  * @file     core_cmInstr.h | ||||
|  * @brief    CMSIS Cortex-M Core Instruction Access Header File | ||||
|  * @version  V3.20 | ||||
|  * @date     05. March 2013 | ||||
|  * | ||||
|  * @note | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| /* Copyright (c) 2009 - 2013 ARM LIMITED
 | ||||
| 
 | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef __CORE_CMINSTR_H | ||||
| #define __CORE_CMINSTR_H | ||||
| 
 | ||||
| 
 | ||||
| /* ##########################  Core Instruction Access  ######################### */ | ||||
| /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
 | ||||
|   Access to dedicated instructions | ||||
|   @{ | ||||
| */ | ||||
| 
 | ||||
| #if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ | ||||
| /* ARM armcc specific functions */ | ||||
| 
 | ||||
| #if (__ARMCC_VERSION < 400677) | ||||
|   #error "Please use ARM Compiler Toolchain V4.0.677 or later!" | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  No Operation
 | ||||
| 
 | ||||
|     No Operation does nothing. This instruction can be used for code alignment purposes. | ||||
|  */ | ||||
| #define __NOP                             __nop | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Wait For Interrupt
 | ||||
| 
 | ||||
|     Wait For Interrupt is a hint instruction that suspends execution | ||||
|     until one of a number of events occurs. | ||||
|  */ | ||||
| #define __WFI                             __wfi | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Wait For Event
 | ||||
| 
 | ||||
|     Wait For Event is a hint instruction that permits the processor to enter | ||||
|     a low-power state until one of a number of events occurs. | ||||
|  */ | ||||
| #define __WFE                             __wfe | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Send Event
 | ||||
| 
 | ||||
|     Send Event is a hint instruction. It causes an event to be signaled to the CPU. | ||||
|  */ | ||||
| #define __SEV                             __sev | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Instruction Synchronization Barrier
 | ||||
| 
 | ||||
|     Instruction Synchronization Barrier flushes the pipeline in the processor, | ||||
|     so that all instructions following the ISB are fetched from cache or | ||||
|     memory, after the instruction has been completed. | ||||
|  */ | ||||
| #define __ISB()                           __isb(0xF) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Data Synchronization Barrier
 | ||||
| 
 | ||||
|     This function acts as a special kind of Data Memory Barrier. | ||||
|     It completes when all explicit memory accesses before this instruction complete. | ||||
|  */ | ||||
| #define __DSB()                           __dsb(0xF) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Data Memory Barrier
 | ||||
| 
 | ||||
|     This function ensures the apparent order of the explicit memory operations before | ||||
|     and after the instruction, without ensuring their completion. | ||||
|  */ | ||||
| #define __DMB()                           __dmb(0xF) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Reverse byte order (32 bit)
 | ||||
| 
 | ||||
|     This function reverses the byte order in integer value. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| #define __REV                             __rev | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Reverse byte order (16 bit)
 | ||||
| 
 | ||||
|     This function reverses the byte order in two unsigned short values. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) | ||||
| { | ||||
|   rev16 r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /** \brief  Reverse byte order in signed short value
 | ||||
| 
 | ||||
|     This function reverses the byte order in a signed short value with sign extension to integer. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) | ||||
| { | ||||
|   revsh r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Rotate Right in unsigned value (32 bit)
 | ||||
| 
 | ||||
|     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. | ||||
| 
 | ||||
|     \param [in]    value  Value to rotate | ||||
|     \param [in]    value  Number of Bits to rotate | ||||
|     \return               Rotated value | ||||
|  */ | ||||
| #define __ROR                             __ror | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Breakpoint
 | ||||
| 
 | ||||
|     This function causes the processor to enter Debug state. | ||||
|     Debug tools can use this to investigate system state when the instruction at a particular address is reached. | ||||
| 
 | ||||
|     \param [in]    value  is ignored by the processor. | ||||
|                    If required, a debugger can use it to store additional information about the breakpoint. | ||||
|  */ | ||||
| #define __BKPT(value)                       __breakpoint(value) | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M >= 0x03) | ||||
| 
 | ||||
| /** \brief  Reverse bit order of value
 | ||||
| 
 | ||||
|     This function reverses the bit order of the given value. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| #define __RBIT                            __rbit | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (8 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 8 bit value. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| #define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr)) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (16 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 16 bit values. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| #define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr)) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (32 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 32 bit values. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| #define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr)) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (8 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 8 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| #define __STREXB(value, ptr)              __strex(value, ptr) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (16 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 16 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| #define __STREXH(value, ptr)              __strex(value, ptr) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (32 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 32 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| #define __STREXW(value, ptr)              __strex(value, ptr) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Remove the exclusive lock
 | ||||
| 
 | ||||
|     This function removes the exclusive lock which is created by LDREX. | ||||
| 
 | ||||
|  */ | ||||
| #define __CLREX                           __clrex | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Signed Saturate
 | ||||
| 
 | ||||
|     This function saturates a signed value. | ||||
| 
 | ||||
|     \param [in]  value  Value to be saturated | ||||
|     \param [in]    sat  Bit position to saturate to (1..32) | ||||
|     \return             Saturated value | ||||
|  */ | ||||
| #define __SSAT                            __ssat | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Unsigned Saturate
 | ||||
| 
 | ||||
|     This function saturates an unsigned value. | ||||
| 
 | ||||
|     \param [in]  value  Value to be saturated | ||||
|     \param [in]    sat  Bit position to saturate to (0..31) | ||||
|     \return             Saturated value | ||||
|  */ | ||||
| #define __USAT                            __usat | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Count leading zeros
 | ||||
| 
 | ||||
|     This function counts the number of leading zeros of a data value. | ||||
| 
 | ||||
|     \param [in]  value  Value to count the leading zeros | ||||
|     \return             number of leading zeros in value | ||||
|  */ | ||||
| #define __CLZ                             __clz | ||||
| 
 | ||||
| #endif /* (__CORTEX_M >= 0x03) */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ | ||||
| /* IAR iccarm specific functions */ | ||||
| 
 | ||||
| #include <cmsis_iar.h> | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ | ||||
| /* TI CCS specific functions */ | ||||
| 
 | ||||
| #include <cmsis_ccs.h> | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ | ||||
| /* GNU gcc specific functions */ | ||||
| 
 | ||||
| /* Define macros for porting to both thumb1 and thumb2.
 | ||||
|  * For thumb1, use low register (r0-r7), specified by constrant "l" | ||||
|  * Otherwise, use general registers, specified by constrant "r" */ | ||||
| #if defined (__thumb__) && !defined (__thumb2__) | ||||
| #define __CMSIS_GCC_OUT_REG(r) "=l" (r) | ||||
| #define __CMSIS_GCC_USE_REG(r) "l" (r) | ||||
| #else | ||||
| #define __CMSIS_GCC_OUT_REG(r) "=r" (r) | ||||
| #define __CMSIS_GCC_USE_REG(r) "r" (r) | ||||
| #endif | ||||
| 
 | ||||
| /** \brief  No Operation
 | ||||
| 
 | ||||
|     No Operation does nothing. This instruction can be used for code alignment purposes. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) | ||||
| { | ||||
|   __ASM volatile ("nop"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Wait For Interrupt
 | ||||
| 
 | ||||
|     Wait For Interrupt is a hint instruction that suspends execution | ||||
|     until one of a number of events occurs. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) | ||||
| { | ||||
|   __ASM volatile ("wfi"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Wait For Event
 | ||||
| 
 | ||||
|     Wait For Event is a hint instruction that permits the processor to enter | ||||
|     a low-power state until one of a number of events occurs. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) | ||||
| { | ||||
|   __ASM volatile ("wfe"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Send Event
 | ||||
| 
 | ||||
|     Send Event is a hint instruction. It causes an event to be signaled to the CPU. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) | ||||
| { | ||||
|   __ASM volatile ("sev"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Instruction Synchronization Barrier
 | ||||
| 
 | ||||
|     Instruction Synchronization Barrier flushes the pipeline in the processor, | ||||
|     so that all instructions following the ISB are fetched from cache or | ||||
|     memory, after the instruction has been completed. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) | ||||
| { | ||||
|   __ASM volatile ("isb"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Data Synchronization Barrier
 | ||||
| 
 | ||||
|     This function acts as a special kind of Data Memory Barrier. | ||||
|     It completes when all explicit memory accesses before this instruction complete. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) | ||||
| { | ||||
|   __ASM volatile ("dsb"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Data Memory Barrier
 | ||||
| 
 | ||||
|     This function ensures the apparent order of the explicit memory operations before | ||||
|     and after the instruction, without ensuring their completion. | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) | ||||
| { | ||||
|   __ASM volatile ("dmb"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Reverse byte order (32 bit)
 | ||||
| 
 | ||||
|     This function reverses the byte order in integer value. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) | ||||
| { | ||||
| #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) | ||||
|   return __builtin_bswap32(value); | ||||
| #else | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); | ||||
|   return(result); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Reverse byte order (16 bit)
 | ||||
| 
 | ||||
|     This function reverses the byte order in two unsigned short values. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Reverse byte order in signed short value
 | ||||
| 
 | ||||
|     This function reverses the byte order in a signed short value with sign extension to integer. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) | ||||
| { | ||||
| #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) | ||||
|   return (short)__builtin_bswap16(value); | ||||
| #else | ||||
|   uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); | ||||
|   return(result); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Rotate Right in unsigned value (32 bit)
 | ||||
| 
 | ||||
|     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. | ||||
| 
 | ||||
|     \param [in]    value  Value to rotate | ||||
|     \param [in]    value  Number of Bits to rotate | ||||
|     \return               Rotated value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) | ||||
| { | ||||
|   return (op1 >> op2) | (op1 << (32 - op2));  | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Breakpoint
 | ||||
| 
 | ||||
|     This function causes the processor to enter Debug state. | ||||
|     Debug tools can use this to investigate system state when the instruction at a particular address is reached. | ||||
| 
 | ||||
|     \param [in]    value  is ignored by the processor. | ||||
|                    If required, a debugger can use it to store additional information about the breakpoint. | ||||
|  */ | ||||
| #define __BKPT(value)                       __ASM volatile ("bkpt "#value) | ||||
| 
 | ||||
| 
 | ||||
| #if       (__CORTEX_M >= 0x03) | ||||
| 
 | ||||
| /** \brief  Reverse bit order of value
 | ||||
| 
 | ||||
|     This function reverses the bit order of the given value. | ||||
| 
 | ||||
|     \param [in]    value  Value to reverse | ||||
|     \return               Reversed value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) | ||||
| { | ||||
|   uint32_t result; | ||||
| 
 | ||||
|    __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (8 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 8 bit value. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) | ||||
| { | ||||
|     uint32_t result; | ||||
| 
 | ||||
| #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) | ||||
|    __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); | ||||
| #else | ||||
|     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
 | ||||
|        accepted by assembler. So has to use following less efficient pattern. | ||||
|     */ | ||||
|    __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); | ||||
| #endif | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (16 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 16 bit values. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) | ||||
| { | ||||
|     uint32_t result; | ||||
| 
 | ||||
| #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) | ||||
|    __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); | ||||
| #else | ||||
|     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
 | ||||
|        accepted by assembler. So has to use following less efficient pattern. | ||||
|     */ | ||||
|    __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); | ||||
| #endif | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  LDR Exclusive (32 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive LDR command for 32 bit values. | ||||
| 
 | ||||
|     \param [in]    ptr  Pointer to data | ||||
|     \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) | ||||
| { | ||||
|     uint32_t result; | ||||
| 
 | ||||
|    __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (8 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 8 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) | ||||
| { | ||||
|    uint32_t result; | ||||
| 
 | ||||
|    __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (16 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 16 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) | ||||
| { | ||||
|    uint32_t result; | ||||
| 
 | ||||
|    __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  STR Exclusive (32 bit)
 | ||||
| 
 | ||||
|     This function performs a exclusive STR command for 32 bit values. | ||||
| 
 | ||||
|     \param [in]  value  Value to store | ||||
|     \param [in]    ptr  Pointer to location | ||||
|     \return          0  Function succeeded | ||||
|     \return          1  Function failed | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) | ||||
| { | ||||
|    uint32_t result; | ||||
| 
 | ||||
|    __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); | ||||
|    return(result); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Remove the exclusive lock
 | ||||
| 
 | ||||
|     This function removes the exclusive lock which is created by LDREX. | ||||
| 
 | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) | ||||
| { | ||||
|   __ASM volatile ("clrex" ::: "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Signed Saturate
 | ||||
| 
 | ||||
|     This function saturates a signed value. | ||||
| 
 | ||||
|     \param [in]  value  Value to be saturated | ||||
|     \param [in]    sat  Bit position to saturate to (1..32) | ||||
|     \return             Saturated value | ||||
|  */ | ||||
| #define __SSAT(ARG1,ARG2) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1); \ | ||||
|   __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Unsigned Saturate
 | ||||
| 
 | ||||
|     This function saturates an unsigned value. | ||||
| 
 | ||||
|     \param [in]  value  Value to be saturated | ||||
|     \param [in]    sat  Bit position to saturate to (0..31) | ||||
|     \return             Saturated value | ||||
|  */ | ||||
| #define __USAT(ARG1,ARG2) \ | ||||
| ({                          \ | ||||
|   uint32_t __RES, __ARG1 = (ARG1); \ | ||||
|   __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \ | ||||
|   __RES; \ | ||||
|  }) | ||||
| 
 | ||||
| 
 | ||||
| /** \brief  Count leading zeros
 | ||||
| 
 | ||||
|     This function counts the number of leading zeros of a data value. | ||||
| 
 | ||||
|     \param [in]  value  Value to count the leading zeros | ||||
|     \return             number of leading zeros in value | ||||
|  */ | ||||
| __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) | ||||
| { | ||||
|    uint32_t result; | ||||
| 
 | ||||
|   __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); | ||||
|   return(result); | ||||
| } | ||||
| 
 | ||||
| #endif /* (__CORTEX_M >= 0x03) */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ | ||||
| /* TASKING carm specific functions */ | ||||
| 
 | ||||
| /*
 | ||||
|  * The CMSIS functions have been implemented as intrinsics in the compiler. | ||||
|  * Please use "carm -?i" to get an up to date list of all intrinsics, | ||||
|  * Including the CMSIS ones. | ||||
|  */ | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /*@}*/ /* end of group CMSIS_Core_InstructionInterface */ | ||||
| 
 | ||||
| #endif /* __CORE_CMINSTR_H */ | ||||
							
								
								
									
										36
									
								
								third_party/core/core_generic.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								third_party/core/core_generic.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| /*
 | ||||
|  * PackageLicenseDeclared: Apache-2.0 | ||||
|  * Copyright (c) 2015 ARM Limited | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __CMSIS_CORE_CORE_GENERIC_H__ | ||||
| #define __CMSIS_CORE_CORE_GENERIC_H__ | ||||
| 
 | ||||
| #define __CMSIS_GENERIC | ||||
| #if defined(TARGET_LIKE_CORTEX_M3) | ||||
|   #include "cmsis-core/core_cm3.h" | ||||
| #elif defined(TARGET_LIKE_CORTEX_M4) | ||||
|   #include "cmsis-core/core_cm4.h" | ||||
| #elif defined(TARGET_LIKE_CORTEX_M0) | ||||
|   #include "cmsis-core/core_cm0.h" | ||||
| #elif defined(TARGET_LIKE_CORTEX_M0PLUS) | ||||
|   #include "cmsis-core/core_cm0plus.h" | ||||
| #else | ||||
|   #error "Unknown platform for core_generic.h" | ||||
| #endif | ||||
| #undef __CMSIS_GENERIC | ||||
| 
 | ||||
| #endif // #ifndef __CMSIS_CORE_CORE_GENERIC_H__
 | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue