generated from Template/H563ZI-HAL-CMake-Template
	fix: Set LF line endings for assembly files
This commit is contained in:
		
							
								
								
									
										411
									
								
								Drivers/CMSIS/Include/cachel1_armv7.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										411
									
								
								Drivers/CMSIS/Include/cachel1_armv7.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,411 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     cachel1_armv7.h | ||||
|  * @brief    CMSIS Level 1 Cache API for Armv7-M and later | ||||
|  * @version  V1.0.1 | ||||
|  * @date     19. April 2021 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2020-2021 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef ARM_CACHEL1_ARMV7_H | ||||
| #define ARM_CACHEL1_ARMV7_H | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_CacheFunctions Cache Functions | ||||
|   \brief    Functions that configure Instruction and Data cache. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /* Cache Size ID Register Macros */ | ||||
| #define CCSIDR_WAYS(x)         (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) | ||||
| #define CCSIDR_SETS(x)         (((x) & SCB_CCSIDR_NUMSETS_Msk      ) >> SCB_CCSIDR_NUMSETS_Pos      ) | ||||
|  | ||||
| #ifndef __SCB_DCACHE_LINE_SIZE | ||||
| #define __SCB_DCACHE_LINE_SIZE  32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __SCB_ICACHE_LINE_SIZE | ||||
| #define __SCB_ICACHE_LINE_SIZE  32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   \brief   Enable I-Cache | ||||
|   \details Turns on I-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_EnableICache (void) | ||||
| { | ||||
|   #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) | ||||
|     if (SCB->CCR & SCB_CCR_IC_Msk) return;  /* return if ICache is already enabled */ | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|     SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */ | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|     SCB->CCR |=  (uint32_t)SCB_CCR_IC_Msk;  /* enable I-Cache */ | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable I-Cache | ||||
|   \details Turns off I-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_DisableICache (void) | ||||
| { | ||||
|   #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|     SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk;  /* disable I-Cache */ | ||||
|     SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */ | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Invalidate I-Cache | ||||
|   \details Invalidates I-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_InvalidateICache (void) | ||||
| { | ||||
|   #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|     SCB->ICIALLU = 0UL; | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   I-Cache Invalidate by address | ||||
|   \details Invalidates I-Cache for the given address. | ||||
|            I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. | ||||
|            I-Cache memory blocks which are part of given address + given size are invalidated. | ||||
|   \param[in]   addr    address | ||||
|   \param[in]   isize   size of memory block (in number of bytes) | ||||
| */ | ||||
| __STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (volatile void *addr, int32_t isize) | ||||
| { | ||||
|   #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) | ||||
|     if ( isize > 0 ) { | ||||
|        int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); | ||||
|       uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; | ||||
|  | ||||
|       __DSB(); | ||||
|  | ||||
|       do { | ||||
|         SCB->ICIMVAU = op_addr;             /* register accepts only 32byte aligned values, only bits 31..5 are valid */ | ||||
|         op_addr += __SCB_ICACHE_LINE_SIZE; | ||||
|         op_size -= __SCB_ICACHE_LINE_SIZE; | ||||
|       } while ( op_size > 0 ); | ||||
|  | ||||
|       __DSB(); | ||||
|       __ISB(); | ||||
|     } | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Enable D-Cache | ||||
|   \details Turns on D-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_EnableDCache (void) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     uint32_t ccsidr; | ||||
|     uint32_t sets; | ||||
|     uint32_t ways; | ||||
|  | ||||
|     if (SCB->CCR & SCB_CCR_DC_Msk) return;  /* return if DCache is already enabled */ | ||||
|  | ||||
|     SCB->CSSELR = 0U;                       /* select Level 1 data cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     ccsidr = SCB->CCSIDR; | ||||
|  | ||||
|                                             /* invalidate D-Cache */ | ||||
|     sets = (uint32_t)(CCSIDR_SETS(ccsidr)); | ||||
|     do { | ||||
|       ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); | ||||
|       do { | ||||
|         SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | | ||||
|                       ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)  ); | ||||
|         #if defined ( __CC_ARM ) | ||||
|           __schedule_barrier(); | ||||
|         #endif | ||||
|       } while (ways-- != 0U); | ||||
|     } while(sets-- != 0U); | ||||
|     __DSB(); | ||||
|  | ||||
|     SCB->CCR |=  (uint32_t)SCB_CCR_DC_Msk;  /* enable D-Cache */ | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable D-Cache | ||||
|   \details Turns off D-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_DisableDCache (void) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     uint32_t ccsidr; | ||||
|     uint32_t sets; | ||||
|     uint32_t ways; | ||||
|  | ||||
|     SCB->CSSELR = 0U;                       /* select Level 1 data cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk;  /* disable D-Cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     ccsidr = SCB->CCSIDR; | ||||
|  | ||||
|                                             /* clean & invalidate D-Cache */ | ||||
|     sets = (uint32_t)(CCSIDR_SETS(ccsidr)); | ||||
|     do { | ||||
|       ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); | ||||
|       do { | ||||
|         SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | | ||||
|                        ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  ); | ||||
|         #if defined ( __CC_ARM ) | ||||
|           __schedule_barrier(); | ||||
|         #endif | ||||
|       } while (ways-- != 0U); | ||||
|     } while(sets-- != 0U); | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Invalidate D-Cache | ||||
|   \details Invalidates D-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_InvalidateDCache (void) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     uint32_t ccsidr; | ||||
|     uint32_t sets; | ||||
|     uint32_t ways; | ||||
|  | ||||
|     SCB->CSSELR = 0U;                       /* select Level 1 data cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     ccsidr = SCB->CCSIDR; | ||||
|  | ||||
|                                             /* invalidate D-Cache */ | ||||
|     sets = (uint32_t)(CCSIDR_SETS(ccsidr)); | ||||
|     do { | ||||
|       ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); | ||||
|       do { | ||||
|         SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | | ||||
|                       ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)  ); | ||||
|         #if defined ( __CC_ARM ) | ||||
|           __schedule_barrier(); | ||||
|         #endif | ||||
|       } while (ways-- != 0U); | ||||
|     } while(sets-- != 0U); | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clean D-Cache | ||||
|   \details Cleans D-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_CleanDCache (void) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     uint32_t ccsidr; | ||||
|     uint32_t sets; | ||||
|     uint32_t ways; | ||||
|  | ||||
|     SCB->CSSELR = 0U;                       /* select Level 1 data cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     ccsidr = SCB->CCSIDR; | ||||
|  | ||||
|                                             /* clean D-Cache */ | ||||
|     sets = (uint32_t)(CCSIDR_SETS(ccsidr)); | ||||
|     do { | ||||
|       ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); | ||||
|       do { | ||||
|         SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | | ||||
|                       ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)  ); | ||||
|         #if defined ( __CC_ARM ) | ||||
|           __schedule_barrier(); | ||||
|         #endif | ||||
|       } while (ways-- != 0U); | ||||
|     } while(sets-- != 0U); | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clean & Invalidate D-Cache | ||||
|   \details Cleans and Invalidates D-Cache | ||||
|   */ | ||||
| __STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     uint32_t ccsidr; | ||||
|     uint32_t sets; | ||||
|     uint32_t ways; | ||||
|  | ||||
|     SCB->CSSELR = 0U;                       /* select Level 1 data cache */ | ||||
|     __DSB(); | ||||
|  | ||||
|     ccsidr = SCB->CCSIDR; | ||||
|  | ||||
|                                             /* clean & invalidate D-Cache */ | ||||
|     sets = (uint32_t)(CCSIDR_SETS(ccsidr)); | ||||
|     do { | ||||
|       ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); | ||||
|       do { | ||||
|         SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | | ||||
|                        ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  ); | ||||
|         #if defined ( __CC_ARM ) | ||||
|           __schedule_barrier(); | ||||
|         #endif | ||||
|       } while (ways-- != 0U); | ||||
|     } while(sets-- != 0U); | ||||
|  | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   D-Cache Invalidate by address | ||||
|   \details Invalidates D-Cache for the given address. | ||||
|            D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. | ||||
|            D-Cache memory blocks which are part of given address + given size are invalidated. | ||||
|   \param[in]   addr    address | ||||
|   \param[in]   dsize   size of memory block (in number of bytes) | ||||
| */ | ||||
| __STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     if ( dsize > 0 ) { | ||||
|        int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); | ||||
|       uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; | ||||
|  | ||||
|       __DSB(); | ||||
|  | ||||
|       do { | ||||
|         SCB->DCIMVAC = op_addr;             /* register accepts only 32byte aligned values, only bits 31..5 are valid */ | ||||
|         op_addr += __SCB_DCACHE_LINE_SIZE; | ||||
|         op_size -= __SCB_DCACHE_LINE_SIZE; | ||||
|       } while ( op_size > 0 ); | ||||
|  | ||||
|       __DSB(); | ||||
|       __ISB(); | ||||
|     } | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   D-Cache Clean by address | ||||
|   \details Cleans D-Cache for the given address | ||||
|            D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. | ||||
|            D-Cache memory blocks which are part of given address + given size are cleaned. | ||||
|   \param[in]   addr    address | ||||
|   \param[in]   dsize   size of memory block (in number of bytes) | ||||
| */ | ||||
| __STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (volatile void *addr, int32_t dsize) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     if ( dsize > 0 ) { | ||||
|        int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); | ||||
|       uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; | ||||
|  | ||||
|       __DSB(); | ||||
|  | ||||
|       do { | ||||
|         SCB->DCCMVAC = op_addr;             /* register accepts only 32byte aligned values, only bits 31..5 are valid */ | ||||
|         op_addr += __SCB_DCACHE_LINE_SIZE; | ||||
|         op_size -= __SCB_DCACHE_LINE_SIZE; | ||||
|       } while ( op_size > 0 ); | ||||
|  | ||||
|       __DSB(); | ||||
|       __ISB(); | ||||
|     } | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   D-Cache Clean and Invalidate by address | ||||
|   \details Cleans and invalidates D_Cache for the given address | ||||
|            D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. | ||||
|            D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. | ||||
|   \param[in]   addr    address (aligned to 32-byte boundary) | ||||
|   \param[in]   dsize   size of memory block (in number of bytes) | ||||
| */ | ||||
| __STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) | ||||
| { | ||||
|   #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) | ||||
|     if ( dsize > 0 ) { | ||||
|        int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); | ||||
|       uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; | ||||
|  | ||||
|       __DSB(); | ||||
|  | ||||
|       do { | ||||
|         SCB->DCCIMVAC = op_addr;            /* register accepts only 32byte aligned values, only bits 31..5 are valid */ | ||||
|         op_addr +=          __SCB_DCACHE_LINE_SIZE; | ||||
|         op_size -=          __SCB_DCACHE_LINE_SIZE; | ||||
|       } while ( op_size > 0 ); | ||||
|  | ||||
|       __DSB(); | ||||
|       __ISB(); | ||||
|     } | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| /*@} end of CMSIS_Core_CacheFunctions */ | ||||
|  | ||||
| #endif /* ARM_CACHEL1_ARMV7_H */ | ||||
							
								
								
									
										888
									
								
								Drivers/CMSIS/Include/cmsis_armcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										888
									
								
								Drivers/CMSIS/Include/cmsis_armcc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,888 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_armcc.h | ||||
|  * @brief    CMSIS compiler ARMCC (Arm Compiler 5) header file | ||||
|  * @version  V5.3.2 | ||||
|  * @date     27. May 2021 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2021 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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_ARMCC_H | ||||
| #define __CMSIS_ARMCC_H | ||||
|  | ||||
|  | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) | ||||
|   #error "Please use Arm Compiler Toolchain V4.0.677 or later!" | ||||
| #endif | ||||
|  | ||||
| /* CMSIS compiler control architecture macros */ | ||||
| #if ((defined (__TARGET_ARCH_6_M  ) && (__TARGET_ARCH_6_M   == 1)) || \ | ||||
|      (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M  == 1))   ) | ||||
|   #define __ARM_ARCH_6M__           1 | ||||
| #endif | ||||
|  | ||||
| #if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1)) | ||||
|   #define __ARM_ARCH_7M__           1 | ||||
| #endif | ||||
|  | ||||
| #if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) | ||||
|   #define __ARM_ARCH_7EM__          1 | ||||
| #endif | ||||
|  | ||||
|   /* __ARM_ARCH_8M_BASE__  not applicable */ | ||||
|   /* __ARM_ARCH_8M_MAIN__  not applicable */ | ||||
|   /* __ARM_ARCH_8_1M_MAIN__  not applicable */ | ||||
|  | ||||
| /* CMSIS compiler control DSP macros */ | ||||
| #if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|   #define __ARM_FEATURE_DSP         1 | ||||
| #endif | ||||
|  | ||||
| /* CMSIS compiler specific defines */ | ||||
| #ifndef   __ASM | ||||
|   #define __ASM                                  __asm | ||||
| #endif | ||||
| #ifndef   __INLINE | ||||
|   #define __INLINE                               __inline | ||||
| #endif | ||||
| #ifndef   __STATIC_INLINE | ||||
|   #define __STATIC_INLINE                        static __inline | ||||
| #endif | ||||
| #ifndef   __STATIC_FORCEINLINE | ||||
|   #define __STATIC_FORCEINLINE                   static __forceinline | ||||
| #endif | ||||
| #ifndef   __NO_RETURN | ||||
|   #define __NO_RETURN                            __declspec(noreturn) | ||||
| #endif | ||||
| #ifndef   __USED | ||||
|   #define __USED                                 __attribute__((used)) | ||||
| #endif | ||||
| #ifndef   __WEAK | ||||
|   #define __WEAK                                 __attribute__((weak)) | ||||
| #endif | ||||
| #ifndef   __PACKED | ||||
|   #define __PACKED                               __attribute__((packed)) | ||||
| #endif | ||||
| #ifndef   __PACKED_STRUCT | ||||
|   #define __PACKED_STRUCT                        __packed struct | ||||
| #endif | ||||
| #ifndef   __PACKED_UNION | ||||
|   #define __PACKED_UNION                         __packed union | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|   #define __UNALIGNED_UINT32(x)                  (*((__packed uint32_t *)(x))) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|   #define __UNALIGNED_UINT16_WRITE(addr, val)    ((*((__packed uint16_t *)(addr))) = (val)) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT16_READ | ||||
|   #define __UNALIGNED_UINT16_READ(addr)          (*((const __packed uint16_t *)(addr))) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|   #define __UNALIGNED_UINT32_WRITE(addr, val)    ((*((__packed uint32_t *)(addr))) = (val)) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32_READ | ||||
|   #define __UNALIGNED_UINT32_READ(addr)          (*((const __packed uint32_t *)(addr))) | ||||
| #endif | ||||
| #ifndef   __ALIGNED | ||||
|   #define __ALIGNED(x)                           __attribute__((aligned(x))) | ||||
| #endif | ||||
| #ifndef   __RESTRICT | ||||
|   #define __RESTRICT                             __restrict | ||||
| #endif | ||||
| #ifndef   __COMPILER_BARRIER | ||||
|   #define __COMPILER_BARRIER()                   __memory_changed() | ||||
| #endif | ||||
|  | ||||
| /* #########################  Startup and Lowlevel Init  ######################## */ | ||||
|  | ||||
| #ifndef __PROGRAM_START | ||||
| #define __PROGRAM_START           __main | ||||
| #endif | ||||
|  | ||||
| #ifndef __INITIAL_SP | ||||
| #define __INITIAL_SP              Image$$ARM_LIB_STACK$$ZI$$Limit | ||||
| #endif | ||||
|  | ||||
| #ifndef __STACK_LIMIT | ||||
| #define __STACK_LIMIT             Image$$ARM_LIB_STACK$$ZI$$Base | ||||
| #endif | ||||
|  | ||||
| #ifndef __VECTOR_TABLE | ||||
| #define __VECTOR_TABLE            __Vectors | ||||
| #endif | ||||
|  | ||||
| #ifndef __VECTOR_TABLE_ATTRIBUTE | ||||
| #define __VECTOR_TABLE_ATTRIBUTE  __attribute__((used, section("RESET"))) | ||||
| #endif | ||||
|  | ||||
| /* ##########################  Core Instruction Access  ######################### */ | ||||
| /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface | ||||
|   Access to dedicated instructions | ||||
|   @{ | ||||
| */ | ||||
|  | ||||
| /** | ||||
|   \brief   No Operation | ||||
|   \details No Operation does nothing. This instruction can be used for code alignment purposes. | ||||
|  */ | ||||
| #define __NOP                             __nop | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Wait For Interrupt | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. | ||||
|  */ | ||||
| #define __SEV                             __sev | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Instruction Synchronization Barrier | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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) | ||||
|   \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #define __REV                             __rev | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Reverse byte order (16 bit) | ||||
|   \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. | ||||
|   \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 (16 bit) | ||||
|   \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) | ||||
| { | ||||
|   revsh r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Rotate Right in unsigned value (32 bit) | ||||
|   \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. | ||||
|   \param [in]    op1  Value to rotate | ||||
|   \param [in]    op2  Number of Bits to rotate | ||||
|   \return               Rotated value | ||||
|  */ | ||||
| #define __ROR                             __ror | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Breakpoint | ||||
|   \details 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) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Reverse bit order of value | ||||
|   \details Reverses the bit order of the given value. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|   #define __RBIT                          __rbit | ||||
| #else | ||||
| __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) | ||||
| { | ||||
|   uint32_t result; | ||||
|   uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ | ||||
|  | ||||
|   result = value;                      /* r will be reversed bits of v; first get LSB of v */ | ||||
|   for (value >>= 1U; value != 0U; value >>= 1U) | ||||
|   { | ||||
|     result <<= 1U; | ||||
|     result |= value & 1U; | ||||
|     s--; | ||||
|   } | ||||
|   result <<= s;                        /* shift when v's highest bits are zero */ | ||||
|   return result; | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Count leading zeros | ||||
|   \details 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 | ||||
|  | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (8 bit) | ||||
|   \details Executes a exclusive LDR instruction for 8 bit value. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXB(ptr)                                                        ((uint8_t ) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXB(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (16 bit) | ||||
|   \details Executes a exclusive LDR instruction for 16 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXH(ptr)                                                        ((uint16_t) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXH(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (32 bit) | ||||
|   \details Executes a exclusive LDR instruction for 32 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXW(ptr)                                                        ((uint32_t ) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXW(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (8 bit) | ||||
|   \details Executes a exclusive STR instruction for 8 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXB(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXB(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (16 bit) | ||||
|   \details Executes a exclusive STR instruction for 16 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXH(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXH(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (32 bit) | ||||
|   \details Executes a exclusive STR instruction for 32 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXW(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXW(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Remove the exclusive lock | ||||
|   \details Removes the exclusive lock which is created by LDREX. | ||||
|  */ | ||||
| #define __CLREX                           __clrex | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Signed Saturate | ||||
|   \details 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 | ||||
|   \details 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   Rotate Right with Extend (32 bit) | ||||
|   \details Moves each bit of a bitstring right by one bit. | ||||
|            The carry input is shifted in at the left end of the bitstring. | ||||
|   \param [in]    value  Value to rotate | ||||
|   \return               Rotated value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) | ||||
| { | ||||
|   rrx r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (8 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 8 bit value. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (16 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 16 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (32 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 32 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (8 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 8 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRBT(value, ptr)               __strt(value, ptr) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (16 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 16 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRHT(value, ptr)               __strt(value, ptr) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (32 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 32 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRT(value, ptr)                __strt(value, ptr) | ||||
|  | ||||
| #else  /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
| /** | ||||
|   \brief   Signed Saturate | ||||
|   \details Saturates a signed value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (1..32) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| __attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) | ||||
| { | ||||
|   if ((sat >= 1U) && (sat <= 32U)) | ||||
|   { | ||||
|     const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); | ||||
|     const int32_t min = -1 - max ; | ||||
|     if (val > max) | ||||
|     { | ||||
|       return max; | ||||
|     } | ||||
|     else if (val < min) | ||||
|     { | ||||
|       return min; | ||||
|     } | ||||
|   } | ||||
|   return val; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   Unsigned Saturate | ||||
|   \details Saturates an unsigned value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (0..31) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) | ||||
| { | ||||
|   if (sat <= 31U) | ||||
|   { | ||||
|     const uint32_t max = ((1U << sat) - 1U); | ||||
|     if (val > (int32_t)max) | ||||
|     { | ||||
|       return max; | ||||
|     } | ||||
|     else if (val < 0) | ||||
|     { | ||||
|       return 0U; | ||||
|     } | ||||
|   } | ||||
|   return (uint32_t)val; | ||||
| } | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
| /*@}*/ /* end of group CMSIS_Core_InstructionInterface */ | ||||
|  | ||||
|  | ||||
| /* ###########################  Core Function Access  ########################### */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface | ||||
|     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Enable IRQ Interrupts | ||||
|   \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| /* intrinsic void __enable_irq();     */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable IRQ Interrupts | ||||
|   \details Disables IRQ interrupts by setting special-purpose register PRIMASK. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| /* intrinsic void __disable_irq();    */ | ||||
|  | ||||
| /** | ||||
|   \brief   Get Control Register | ||||
|   \details 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 | ||||
|   \details 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; | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get IPSR Register | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 | ||||
|   \details 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 ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable FIQ | ||||
|   \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __enable_fault_irq                __enable_fiq | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable FIQ | ||||
|   \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __disable_fault_irq               __disable_fiq | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Base Priority | ||||
|   \details 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 | ||||
|   \details 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 & 0xFFU); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Base Priority with condition | ||||
|   \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, | ||||
|            or the new value increases the BASEPRI priority level. | ||||
|   \param [in]    basePri  Base Priority value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) | ||||
| { | ||||
|   register uint32_t __regBasePriMax      __ASM("basepri_max"); | ||||
|   __regBasePriMax = (basePri & 0xFFU); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Fault Mask | ||||
|   \details 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 | ||||
|   \details 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)1U); | ||||
| } | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get FPSCR | ||||
|   \details 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 ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     ) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   return(__regfpscr); | ||||
| #else | ||||
|    return(0U); | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set FPSCR | ||||
|   \details 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 ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     ) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   __regfpscr = (fpscr); | ||||
| #else | ||||
|   (void)fpscr; | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_RegAccFunctions */ | ||||
|  | ||||
|  | ||||
| /* ###################  Compiler specific Intrinsics  ########################### */ | ||||
| /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics | ||||
|   Access to dedicated SIMD instructions | ||||
|   @{ | ||||
| */ | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| #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) << 32U)     ) >> 32U)) | ||||
|  | ||||
| #define __SXTB16_RORn(ARG1, ARG2)        __SXTB16(__ROR(ARG1, ARG2)) | ||||
|  | ||||
| #define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
| /*@} end of group CMSIS_SIMD_intrinsics */ | ||||
|  | ||||
|  | ||||
| #endif /* __CMSIS_ARMCC_H */ | ||||
							
								
								
									
										1503
									
								
								Drivers/CMSIS/Include/cmsis_armclang.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1503
									
								
								Drivers/CMSIS/Include/cmsis_armclang.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1928
									
								
								Drivers/CMSIS/Include/cmsis_armclang_ltm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1928
									
								
								Drivers/CMSIS/Include/cmsis_armclang_ltm.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										283
									
								
								Drivers/CMSIS/Include/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								Drivers/CMSIS/Include/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,283 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_compiler.h | ||||
|  * @brief    CMSIS compiler generic header file | ||||
|  * @version  V5.1.0 | ||||
|  * @date     09. October 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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_COMPILER_H | ||||
| #define __CMSIS_COMPILER_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 4/5 | ||||
|  */ | ||||
| #if   defined ( __CC_ARM ) | ||||
|   #include "cmsis_armcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 6.6 LTM (armclang) | ||||
|  */ | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) | ||||
|   #include "cmsis_armclang_ltm.h" | ||||
|  | ||||
|   /* | ||||
|  * Arm Compiler above 6.10.1 (armclang) | ||||
|  */ | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) | ||||
|   #include "cmsis_armclang.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * GNU Compiler | ||||
|  */ | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #include "cmsis_gcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * IAR Compiler | ||||
|  */ | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #include <cmsis_iccarm.h> | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TI Arm Compiler | ||||
|  */ | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #include <cmsis_ccs.h> | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __attribute__((packed)) T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)                           __attribute__((aligned(x))) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #define __RESTRICT                             __restrict | ||||
|   #endif | ||||
|   #ifndef   __COMPILER_BARRIER | ||||
|     #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. | ||||
|     #define __COMPILER_BARRIER()                   (void)0 | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TASKING Compiler | ||||
|  */ | ||||
| #elif defined ( __TASKING__ ) | ||||
|   /* | ||||
|    * 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. | ||||
|    */ | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __packed__ | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __packed__ T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)              __align(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|   #ifndef   __COMPILER_BARRIER | ||||
|     #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. | ||||
|     #define __COMPILER_BARRIER()                   (void)0 | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * COSMIC Compiler | ||||
|  */ | ||||
| #elif defined ( __CSMC__ ) | ||||
|    #include <cmsis_csm.h> | ||||
|  | ||||
|  #ifndef   __ASM | ||||
|     #define __ASM                                  _asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     // NO RETURN is automatically detected hence no warning here | ||||
|     #define __NO_RETURN | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #warning No compiler specific solution for __USED. __USED is ignored. | ||||
|     #define __USED | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __weak | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               @packed | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        @packed struct | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         @packed union | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     @packed struct T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. | ||||
|     #define __ALIGNED(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|   #ifndef   __COMPILER_BARRIER | ||||
|     #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. | ||||
|     #define __COMPILER_BARRIER()                   (void)0 | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| #else | ||||
|   #error Unknown compiler. | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif /* __CMSIS_COMPILER_H */ | ||||
|  | ||||
							
								
								
									
										2211
									
								
								Drivers/CMSIS/Include/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2211
									
								
								Drivers/CMSIS/Include/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1002
									
								
								Drivers/CMSIS/Include/cmsis_iccarm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1002
									
								
								Drivers/CMSIS/Include/cmsis_iccarm.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										39
									
								
								Drivers/CMSIS/Include/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Drivers/CMSIS/Include/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_version.h | ||||
|  * @brief    CMSIS Core(M) Version definitions | ||||
|  * @version  V5.0.5 | ||||
|  * @date     02. February 2022 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2022 ARM Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CMSIS_VERSION_H | ||||
| #define __CMSIS_VERSION_H | ||||
|  | ||||
| /*  CMSIS Version definitions */ | ||||
| #define __CM_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS Core(M) main version */ | ||||
| #define __CM_CMSIS_VERSION_SUB   ( 6U)                                      /*!< [15:0]  CMSIS Core(M) sub version */ | ||||
| #define __CM_CMSIS_VERSION       ((__CM_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                    __CM_CMSIS_VERSION_SUB           )       /*!< CMSIS Core(M) version number */ | ||||
| #endif | ||||
							
								
								
									
										4228
									
								
								Drivers/CMSIS/Include/core_armv81mml.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4228
									
								
								Drivers/CMSIS/Include/core_armv81mml.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2222
									
								
								Drivers/CMSIS/Include/core_armv8mbl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2222
									
								
								Drivers/CMSIS/Include/core_armv8mbl.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3209
									
								
								Drivers/CMSIS/Include/core_armv8mml.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3209
									
								
								Drivers/CMSIS/Include/core_armv8mml.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										952
									
								
								Drivers/CMSIS/Include/core_cm0.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										952
									
								
								Drivers/CMSIS/Include/core_cm0.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,952 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     core_cm0.h | ||||
|  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File | ||||
|  * @version  V5.0.8 | ||||
|  * @date     21. August 2019 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2019 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CORE_CM0_H_GENERIC | ||||
| #define __CORE_CM0_H_GENERIC | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   \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 | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #include "cmsis_version.h" | ||||
|   | ||||
| /*  CMSIS CM0 definitions */ | ||||
| #define __CM0_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)              /*!< \deprecated [31:16] CMSIS HAL main version */ | ||||
| #define __CM0_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)               /*!< \deprecated [15:0]  CMSIS HAL sub version */ | ||||
| #define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                     __CM0_CMSIS_VERSION_SUB           )  /*!< \deprecated CMSIS HAL version number */ | ||||
|  | ||||
| #define __CORTEX_M                (0U)                                   /*!< Cortex-M Core */ | ||||
|  | ||||
| /** __FPU_USED indicates whether an FPU is used or not. | ||||
|     This core does not support an FPU at all | ||||
| */ | ||||
| #define __FPU_USED       0U | ||||
|  | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #if defined __ARM_FP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #if defined __TI_VFP_SUPPORT__ | ||||
|     #error "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 | ||||
|  | ||||
| #elif defined ( __CSMC__ ) | ||||
|   #if ( __CSMC__ & 0x400U) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include "cmsis_compiler.h"               /* CMSIS compiler specific defines */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM0_H_GENERIC */ | ||||
|  | ||||
| #ifndef __CMSIS_GENERIC | ||||
|  | ||||
| #ifndef __CORE_CM0_H_DEPENDANT | ||||
| #define __CORE_CM0_H_DEPENDANT | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM0_REV | ||||
|     #define __CM0_REV               0x0000U | ||||
|     #warning "__CM0_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2U | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0U | ||||
|     #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 */ | ||||
|  | ||||
| /* following defines should be used for structure members */ | ||||
| #define     __IM     volatile const      /*! Defines 'read only' structure member permissions */ | ||||
| #define     __OM     volatile            /*! Defines 'write only' structure member permissions */ | ||||
| #define     __IOM    volatile            /*! Defines 'read / write' structure member 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 | ||||
|   { | ||||
|     uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */ | ||||
|     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; | ||||
|  | ||||
| /* APSR Register Definitions */ | ||||
| #define APSR_N_Pos                         31U                                            /*!< APSR: N Position */ | ||||
| #define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */ | ||||
|  | ||||
| #define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */ | ||||
| #define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */ | ||||
|  | ||||
| #define APSR_C_Pos                         29U                                            /*!< APSR: C Position */ | ||||
| #define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */ | ||||
|  | ||||
| #define APSR_V_Pos                         28U                                            /*!< APSR: V Position */ | ||||
| #define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \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; | ||||
|  | ||||
| /* IPSR Register Definitions */ | ||||
| #define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */ | ||||
| #define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Special-Purpose Program Status Registers (xPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */ | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */ | ||||
|     uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */ | ||||
|     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; | ||||
|  | ||||
| /* xPSR Register Definitions */ | ||||
| #define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */ | ||||
| #define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */ | ||||
|  | ||||
| #define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */ | ||||
| #define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */ | ||||
|  | ||||
| #define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */ | ||||
| #define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */ | ||||
|  | ||||
| #define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */ | ||||
| #define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */ | ||||
|  | ||||
| #define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */ | ||||
| #define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */ | ||||
|  | ||||
| #define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */ | ||||
| #define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Control Registers (CONTROL). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:1;               /*!< bit:      0  Reserved */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */ | ||||
|     uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } CONTROL_Type; | ||||
|  | ||||
| /* CONTROL Register Definitions */ | ||||
| #define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */ | ||||
| #define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */ | ||||
|  | ||||
| /*@} 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 | ||||
| { | ||||
|   __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */ | ||||
|         uint32_t RESERVED0[31U]; | ||||
|   __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */ | ||||
|         uint32_t RESERVED1[31U]; | ||||
|   __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */ | ||||
|         uint32_t RESERVED2[31U]; | ||||
|   __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */ | ||||
|         uint32_t RESERVED3[31U]; | ||||
|         uint32_t RESERVED4[64U]; | ||||
|   __IOM uint32_t IP[8U];                 /*!< 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 | ||||
| { | ||||
|   __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */ | ||||
|   __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */ | ||||
|         uint32_t RESERVED0; | ||||
|   __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */ | ||||
|   __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */ | ||||
|   __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */ | ||||
|         uint32_t RESERVED1; | ||||
|   __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */ | ||||
|   __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */ | ||||
| } SCB_Type; | ||||
|  | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
|  | ||||
| #define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
|  | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
|  | ||||
| #define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
|  | ||||
| #define SCB_CPUID_REVISION_Pos              0U                                            /*!< 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            31U                                            /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< 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              16U                                            /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< 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               4U                                            /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< 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                9U                                            /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
|  | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< 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         15U                                            /*!< 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 | ||||
| { | ||||
|   __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */ | ||||
|   __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */ | ||||
|   __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */ | ||||
| } SysTick_Type; | ||||
|  | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< 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             0U                                            /*!< 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             0U                                            /*!< 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            31U                                            /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_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_bitfield     Core register bit field macros | ||||
|   \brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk). | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Mask and shift a bit field value for use in a register bit range. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted value. | ||||
| */ | ||||
| #define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk) | ||||
|  | ||||
| /** | ||||
|   \brief     Mask and shift a register value to extract a bit filed value. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of register. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted bit field value. | ||||
| */ | ||||
| #define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) | ||||
|  | ||||
| /*@} end of group CMSIS_core_bitfield */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_base     Core Definitions | ||||
|   \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /* Memory mapping of Core 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. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #ifdef CMSIS_NVIC_VIRTUAL | ||||
|   #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping | ||||
|   #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping | ||||
|   #define NVIC_EnableIRQ              __NVIC_EnableIRQ | ||||
|   #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ | ||||
|   #define NVIC_DisableIRQ             __NVIC_DisableIRQ | ||||
|   #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ | ||||
|   #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ | ||||
|   #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ | ||||
| /*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0 */ | ||||
|   #define NVIC_SetPriority            __NVIC_SetPriority | ||||
|   #define NVIC_GetPriority            __NVIC_GetPriority | ||||
|   #define NVIC_SystemReset            __NVIC_SystemReset | ||||
| #endif /* CMSIS_NVIC_VIRTUAL */ | ||||
|  | ||||
| #ifdef CMSIS_VECTAB_VIRTUAL | ||||
|   #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetVector              __NVIC_SetVector | ||||
|   #define NVIC_GetVector              __NVIC_GetVector | ||||
| #endif  /* (CMSIS_VECTAB_VIRTUAL) */ | ||||
|  | ||||
| #define NVIC_USER_IRQ_OFFSET          16 | ||||
|  | ||||
|  | ||||
| /* The following EXC_RETURN values are saved the LR on exception entry */ | ||||
| #define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */ | ||||
| #define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */ | ||||
| #define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */ | ||||
|  | ||||
|  | ||||
| /* Interrupt Priorities are WORD accessible only under Armv6-M                  */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL) | ||||
| #define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      ) | ||||
| #define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      ) | ||||
|  | ||||
| #define __NVIC_SetPriorityGrouping(X) (void)(X) | ||||
| #define __NVIC_GetPriorityGrouping()  (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable Interrupt | ||||
|   \details Enables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     __COMPILER_BARRIER(); | ||||
|     NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __COMPILER_BARRIER(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Enable status | ||||
|   \details Returns a device specific interrupt enable status from the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt is not enabled. | ||||
|   \return             1  Interrupt is enabled. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable Interrupt | ||||
|   \details Disables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Pending Interrupt | ||||
|   \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt status is not pending. | ||||
|   \return             1  Interrupt status is pending. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Pending Interrupt | ||||
|   \details Sets the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clear Pending Interrupt | ||||
|   \details Clears the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Priority | ||||
|   \details Sets the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]      IRQn  Interrupt number. | ||||
|   \param [in]  priority  Priority to set. | ||||
|   \note    The priority cannot be set for every processor exception. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Priority | ||||
|   \details Reads the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \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 ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Encode Priority | ||||
|   \details Encodes the priority for an interrupt with the given priority group, | ||||
|            preemptive priority value, and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [in]   PreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [in]       SubPriority  Subpriority value (starting from 0). | ||||
|   \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   return ( | ||||
|            ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | ||||
|            ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL))) | ||||
|          ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Decode Priority | ||||
|   \details Decodes an interrupt priority value with a given priority group to | ||||
|            preemptive priority value and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | ||||
|   \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [out] pPreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [out]     pSubPriority  Subpriority value (starting from 0). | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | ||||
|   *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Vector | ||||
|   \details Sets an interrupt vector in SRAM based interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|            Address 0 must be mapped to SRAM. | ||||
|   \param [in]   IRQn      Interrupt number | ||||
|   \param [in]   vector    Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2);      /* point to 1st user interrupt */ | ||||
|   *(vectors + (int32_t)IRQn) = vector;                              /* use pointer arithmetic to access vector */ | ||||
|   /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Vector | ||||
|   \details Reads an interrupt vector from interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn      Interrupt number. | ||||
|   \return                 Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2);      /* point to 1st user interrupt */ | ||||
|   return *(vectors + (int32_t)IRQn);                                /* use pointer arithmetic to access vector */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   System Reset | ||||
|   \details Initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                          /* Ensure all outstanding memory accesses included | ||||
|                                                                        buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                          /* Ensure completion of memory access */ | ||||
|  | ||||
|   for(;;)                                                           /* wait until reset */ | ||||
|   { | ||||
|     __NOP(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
|  | ||||
|  | ||||
| /* ##########################  FPU functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_FpuFunctions FPU Functions | ||||
|   \brief    Function that provides FPU type. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   get FPU type | ||||
|   \details returns the FPU type | ||||
|   \returns | ||||
|    - \b  0: No FPU | ||||
|    - \b  1: Single precision FPU | ||||
|    - \b  2: Double + Single precision FPU | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SCB_GetFPUType(void) | ||||
| { | ||||
|     return 0U;           /* No FPU */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_FpuFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|   \brief    Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) | ||||
|  | ||||
| /** | ||||
|   \brief   System Tick Configuration | ||||
|   \details 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 - 1UL) > SysTick_LOAD_RELOAD_Msk) | ||||
|   { | ||||
|     return (1UL);                                                   /* Reload value impossible */ | ||||
|   } | ||||
|  | ||||
|   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                     /* Function successful */ | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM0_H_DEPENDANT */ | ||||
|  | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
							
								
								
									
										1087
									
								
								Drivers/CMSIS/Include/core_cm0plus.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1087
									
								
								Drivers/CMSIS/Include/core_cm0plus.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										979
									
								
								Drivers/CMSIS/Include/core_cm1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										979
									
								
								Drivers/CMSIS/Include/core_cm1.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,979 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     core_cm1.h | ||||
|  * @brief    CMSIS Cortex-M1 Core Peripheral Access Layer Header File | ||||
|  * @version  V1.0.1 | ||||
|  * @date     12. November 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CORE_CM1_H_GENERIC | ||||
| #define __CORE_CM1_H_GENERIC | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   \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_M1 | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #include "cmsis_version.h" | ||||
|   | ||||
| /*  CMSIS CM1 definitions */ | ||||
| #define __CM1_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)              /*!< \deprecated [31:16] CMSIS HAL main version */ | ||||
| #define __CM1_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)               /*!< \deprecated [15:0]  CMSIS HAL sub version */ | ||||
| #define __CM1_CMSIS_VERSION       ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                     __CM1_CMSIS_VERSION_SUB           )  /*!< \deprecated CMSIS HAL version number */ | ||||
|  | ||||
| #define __CORTEX_M                (1U)                                   /*!< Cortex-M Core */ | ||||
|  | ||||
| /** __FPU_USED indicates whether an FPU is used or not. | ||||
|     This core does not support an FPU at all | ||||
| */ | ||||
| #define __FPU_USED       0U | ||||
|  | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #if defined __ARM_FP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #if defined __TI_VFP_SUPPORT__ | ||||
|     #error "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 | ||||
|  | ||||
| #elif defined ( __CSMC__ ) | ||||
|   #if ( __CSMC__ & 0x400U) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include "cmsis_compiler.h"               /* CMSIS compiler specific defines */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM1_H_GENERIC */ | ||||
|  | ||||
| #ifndef __CMSIS_GENERIC | ||||
|  | ||||
| #ifndef __CORE_CM1_H_DEPENDANT | ||||
| #define __CORE_CM1_H_DEPENDANT | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM1_REV | ||||
|     #define __CM1_REV               0x0100U | ||||
|     #warning "__CM1_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2U | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0U | ||||
|     #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 */ | ||||
|  | ||||
| /* following defines should be used for structure members */ | ||||
| #define     __IM     volatile const      /*! Defines 'read only' structure member permissions */ | ||||
| #define     __OM     volatile            /*! Defines 'write only' structure member permissions */ | ||||
| #define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */ | ||||
|  | ||||
| /*@} end of group Cortex_M1 */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                 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 | ||||
|   { | ||||
|     uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */ | ||||
|     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; | ||||
|  | ||||
| /* APSR Register Definitions */ | ||||
| #define APSR_N_Pos                         31U                                            /*!< APSR: N Position */ | ||||
| #define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */ | ||||
|  | ||||
| #define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */ | ||||
| #define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */ | ||||
|  | ||||
| #define APSR_C_Pos                         29U                                            /*!< APSR: C Position */ | ||||
| #define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */ | ||||
|  | ||||
| #define APSR_V_Pos                         28U                                            /*!< APSR: V Position */ | ||||
| #define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \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; | ||||
|  | ||||
| /* IPSR Register Definitions */ | ||||
| #define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */ | ||||
| #define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Special-Purpose Program Status Registers (xPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */ | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */ | ||||
|     uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */ | ||||
|     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; | ||||
|  | ||||
| /* xPSR Register Definitions */ | ||||
| #define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */ | ||||
| #define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */ | ||||
|  | ||||
| #define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */ | ||||
| #define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */ | ||||
|  | ||||
| #define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */ | ||||
| #define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */ | ||||
|  | ||||
| #define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */ | ||||
| #define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */ | ||||
|  | ||||
| #define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */ | ||||
| #define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */ | ||||
|  | ||||
| #define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */ | ||||
| #define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Control Registers (CONTROL). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:1;               /*!< bit:      0  Reserved */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */ | ||||
|     uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } CONTROL_Type; | ||||
|  | ||||
| /* CONTROL Register Definitions */ | ||||
| #define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */ | ||||
| #define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */ | ||||
|  | ||||
| /*@} 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 | ||||
| { | ||||
|   __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */ | ||||
|         uint32_t RESERVED0[31U]; | ||||
|   __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */ | ||||
|         uint32_t RSERVED1[31U]; | ||||
|   __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */ | ||||
|         uint32_t RESERVED2[31U]; | ||||
|   __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */ | ||||
|         uint32_t RESERVED3[31U]; | ||||
|         uint32_t RESERVED4[64U]; | ||||
|   __IOM uint32_t IP[8U];                 /*!< 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 | ||||
| { | ||||
|   __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */ | ||||
|   __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */ | ||||
|         uint32_t RESERVED0; | ||||
|   __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */ | ||||
|   __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */ | ||||
|   __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */ | ||||
|         uint32_t RESERVED1; | ||||
|   __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */ | ||||
|   __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */ | ||||
| } SCB_Type; | ||||
|  | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
|  | ||||
| #define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
|  | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
|  | ||||
| #define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
|  | ||||
| #define SCB_CPUID_REVISION_Pos              0U                                            /*!< 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            31U                                            /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< 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              16U                                            /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< 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               4U                                            /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< 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                9U                                            /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
|  | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< 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         15U                                            /*!< 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_SCnSCB System Controls not in SCB (SCnSCB) | ||||
|   \brief    Type definitions for the System Control and ID Register not in the SCB | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Control and ID Register not in the SCB. | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|         uint32_t RESERVED0[2U]; | ||||
|   __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */ | ||||
| } SCnSCB_Type; | ||||
|  | ||||
| /* Auxiliary Control Register Definitions */ | ||||
| #define SCnSCB_ACTLR_ITCMUAEN_Pos            4U                                        /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ | ||||
| #define SCnSCB_ACTLR_ITCMUAEN_Msk           (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos)         /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ | ||||
|  | ||||
| #define SCnSCB_ACTLR_ITCMLAEN_Pos            3U                                        /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ | ||||
| #define SCnSCB_ACTLR_ITCMLAEN_Msk           (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos)         /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SCnotSCB */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \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 | ||||
| { | ||||
|   __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */ | ||||
|   __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */ | ||||
|   __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */ | ||||
| } SysTick_Type; | ||||
|  | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< 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             0U                                            /*!< 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             0U                                            /*!< 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            31U                                            /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SysTick */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug) | ||||
|   \brief    Cortex-M1 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-M1 header file. | ||||
|   @{ | ||||
|  */ | ||||
| /*@} end of group CMSIS_CoreDebug */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_bitfield     Core register bit field macros | ||||
|   \brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk). | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Mask and shift a bit field value for use in a register bit range. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted value. | ||||
| */ | ||||
| #define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk) | ||||
|  | ||||
| /** | ||||
|   \brief     Mask and shift a register value to extract a bit filed value. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of register. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted bit field value. | ||||
| */ | ||||
| #define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) | ||||
|  | ||||
| /*@} end of group CMSIS_core_bitfield */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_base     Core Definitions | ||||
|   \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /* Memory mapping of Core 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 SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */ | ||||
| #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. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #ifdef CMSIS_NVIC_VIRTUAL | ||||
|   #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping | ||||
|   #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping | ||||
|   #define NVIC_EnableIRQ              __NVIC_EnableIRQ | ||||
|   #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ | ||||
|   #define NVIC_DisableIRQ             __NVIC_DisableIRQ | ||||
|   #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ | ||||
|   #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ | ||||
|   #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ | ||||
| /*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M1 */ | ||||
|   #define NVIC_SetPriority            __NVIC_SetPriority | ||||
|   #define NVIC_GetPriority            __NVIC_GetPriority | ||||
|   #define NVIC_SystemReset            __NVIC_SystemReset | ||||
| #endif /* CMSIS_NVIC_VIRTUAL */ | ||||
|  | ||||
| #ifdef CMSIS_VECTAB_VIRTUAL | ||||
|   #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetVector              __NVIC_SetVector | ||||
|   #define NVIC_GetVector              __NVIC_GetVector | ||||
| #endif  /* (CMSIS_VECTAB_VIRTUAL) */ | ||||
|  | ||||
| #define NVIC_USER_IRQ_OFFSET          16 | ||||
|  | ||||
|  | ||||
| /* The following EXC_RETURN values are saved the LR on exception entry */ | ||||
| #define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */ | ||||
| #define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */ | ||||
| #define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */ | ||||
|  | ||||
|  | ||||
| /* Interrupt Priorities are WORD accessible only under Armv6-M                  */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL) | ||||
| #define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      ) | ||||
| #define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      ) | ||||
|  | ||||
| #define __NVIC_SetPriorityGrouping(X) (void)(X) | ||||
| #define __NVIC_GetPriorityGrouping()  (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable Interrupt | ||||
|   \details Enables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     __COMPILER_BARRIER(); | ||||
|     NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __COMPILER_BARRIER(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Enable status | ||||
|   \details Returns a device specific interrupt enable status from the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt is not enabled. | ||||
|   \return             1  Interrupt is enabled. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable Interrupt | ||||
|   \details Disables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Pending Interrupt | ||||
|   \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt status is not pending. | ||||
|   \return             1  Interrupt status is pending. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Pending Interrupt | ||||
|   \details Sets the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clear Pending Interrupt | ||||
|   \details Clears the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Priority | ||||
|   \details Sets the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]      IRQn  Interrupt number. | ||||
|   \param [in]  priority  Priority to set. | ||||
|   \note    The priority cannot be set for every processor exception. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Priority | ||||
|   \details Reads the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \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 ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Encode Priority | ||||
|   \details Encodes the priority for an interrupt with the given priority group, | ||||
|            preemptive priority value, and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [in]   PreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [in]       SubPriority  Subpriority value (starting from 0). | ||||
|   \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   return ( | ||||
|            ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | ||||
|            ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL))) | ||||
|          ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Decode Priority | ||||
|   \details Decodes an interrupt priority value with a given priority group to | ||||
|            preemptive priority value and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | ||||
|   \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [out] pPreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [out]     pSubPriority  Subpriority value (starting from 0). | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | ||||
|   *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Vector | ||||
|   \details Sets an interrupt vector in SRAM based interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|            Address 0 must be mapped to SRAM. | ||||
|   \param [in]   IRQn      Interrupt number | ||||
|   \param [in]   vector    Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; | ||||
|   /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Vector | ||||
|   \details Reads an interrupt vector from interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn      Interrupt number. | ||||
|   \return                 Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   System Reset | ||||
|   \details Initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                          /* Ensure all outstanding memory accesses included | ||||
|                                                                        buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                          /* Ensure completion of memory access */ | ||||
|  | ||||
|   for(;;)                                                           /* wait until reset */ | ||||
|   { | ||||
|     __NOP(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
|  | ||||
|  | ||||
| /* ##########################  FPU functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_FpuFunctions FPU Functions | ||||
|   \brief    Function that provides FPU type. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   get FPU type | ||||
|   \details returns the FPU type | ||||
|   \returns | ||||
|    - \b  0: No FPU | ||||
|    - \b  1: Single precision FPU | ||||
|    - \b  2: Double + Single precision FPU | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SCB_GetFPUType(void) | ||||
| { | ||||
|     return 0U;           /* No FPU */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_FpuFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|   \brief    Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) | ||||
|  | ||||
| /** | ||||
|   \brief   System Tick Configuration | ||||
|   \details 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 - 1UL) > SysTick_LOAD_RELOAD_Msk) | ||||
|   { | ||||
|     return (1UL);                                                   /* Reload value impossible */ | ||||
|   } | ||||
|  | ||||
|   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                     /* Function successful */ | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM1_H_DEPENDANT */ | ||||
|  | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
							
								
								
									
										2297
									
								
								Drivers/CMSIS/Include/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2297
									
								
								Drivers/CMSIS/Include/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1943
									
								
								Drivers/CMSIS/Include/core_cm3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1943
									
								
								Drivers/CMSIS/Include/core_cm3.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3277
									
								
								Drivers/CMSIS/Include/core_cm33.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3277
									
								
								Drivers/CMSIS/Include/core_cm33.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3277
									
								
								Drivers/CMSIS/Include/core_cm35p.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3277
									
								
								Drivers/CMSIS/Include/core_cm35p.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2129
									
								
								Drivers/CMSIS/Include/core_cm4.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2129
									
								
								Drivers/CMSIS/Include/core_cm4.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4817
									
								
								Drivers/CMSIS/Include/core_cm55.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4817
									
								
								Drivers/CMSIS/Include/core_cm55.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2366
									
								
								Drivers/CMSIS/Include/core_cm7.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2366
									
								
								Drivers/CMSIS/Include/core_cm7.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4672
									
								
								Drivers/CMSIS/Include/core_cm85.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4672
									
								
								Drivers/CMSIS/Include/core_cm85.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1030
									
								
								Drivers/CMSIS/Include/core_sc000.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1030
									
								
								Drivers/CMSIS/Include/core_sc000.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1917
									
								
								Drivers/CMSIS/Include/core_sc300.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1917
									
								
								Drivers/CMSIS/Include/core_sc300.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3592
									
								
								Drivers/CMSIS/Include/core_starmc1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3592
									
								
								Drivers/CMSIS/Include/core_starmc1.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										275
									
								
								Drivers/CMSIS/Include/mpu_armv7.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								Drivers/CMSIS/Include/mpu_armv7.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,275 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     mpu_armv7.h | ||||
|  * @brief    CMSIS MPU API for Armv7-M MPU | ||||
|  * @version  V5.1.2 | ||||
|  * @date     25. May 2020 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2020 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|   | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|   | ||||
| #ifndef ARM_MPU_ARMV7_H | ||||
| #define ARM_MPU_ARMV7_H | ||||
|  | ||||
| #define ARM_MPU_REGION_SIZE_32B      ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_64B      ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_128B     ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_256B     ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_512B     ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_1KB      ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte | ||||
| #define ARM_MPU_REGION_SIZE_2KB      ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_4KB      ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_8KB      ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_16KB     ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_32KB     ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_64KB     ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_128KB    ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_256KB    ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_512KB    ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_1MB      ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte | ||||
| #define ARM_MPU_REGION_SIZE_2MB      ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_4MB      ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_8MB      ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_16MB     ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_32MB     ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_64MB     ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_128MB    ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_256MB    ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_512MB    ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_1GB      ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte | ||||
| #define ARM_MPU_REGION_SIZE_2GB      ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes | ||||
| #define ARM_MPU_REGION_SIZE_4GB      ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes | ||||
|  | ||||
| #define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access | ||||
| #define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only | ||||
| #define ARM_MPU_AP_URO  2U ///!< MPU Access Permission unprivileged access read-only | ||||
| #define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access | ||||
| #define ARM_MPU_AP_PRO  5U ///!< MPU Access Permission privileged access read-only | ||||
| #define ARM_MPU_AP_RO   6U ///!< MPU Access Permission read-only access | ||||
|  | ||||
| /** MPU Region Base Address Register Value | ||||
| * | ||||
| * \param Region The region to be configured, number 0 to 15. | ||||
| * \param BaseAddress The base address for the region. | ||||
| */ | ||||
| #define ARM_MPU_RBAR(Region, BaseAddress) \ | ||||
|   (((BaseAddress) & MPU_RBAR_ADDR_Msk) |  \ | ||||
|    ((Region) & MPU_RBAR_REGION_Msk)    |  \ | ||||
|    (MPU_RBAR_VALID_Msk)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attributes | ||||
| *  | ||||
| * \param TypeExtField      Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | ||||
| * \param IsShareable       Region is shareable between multiple bus masters. | ||||
| * \param IsCacheable       Region is cacheable, i.e. its value may be kept in cache. | ||||
| * \param IsBufferable      Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | ||||
| */   | ||||
| #define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable)   \ | ||||
|   ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk)                  | \ | ||||
|    (((IsShareable)  << MPU_RASR_S_Pos)   & MPU_RASR_S_Msk)                    | \ | ||||
|    (((IsCacheable)  << MPU_RASR_C_Pos)   & MPU_RASR_C_Msk)                    | \ | ||||
|    (((IsBufferable) << MPU_RASR_B_Pos)   & MPU_RASR_B_Msk)) | ||||
|  | ||||
| /** | ||||
| * MPU Region Attribute and Size Register Value | ||||
| *  | ||||
| * \param DisableExec       Instruction access disable bit, 1= disable instruction fetches. | ||||
| * \param AccessPermission  Data access permissions, allows you to configure read/write access for User and Privileged mode. | ||||
| * \param AccessAttributes  Memory access attribution, see \ref ARM_MPU_ACCESS_. | ||||
| * \param SubRegionDisable  Sub-region disable field. | ||||
| * \param Size              Region size of the region to be configured, for example 4K, 8K. | ||||
| */ | ||||
| #define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size)    \ | ||||
|   ((((DisableExec)      << MPU_RASR_XN_Pos)   & MPU_RASR_XN_Msk)                                  | \ | ||||
|    (((AccessPermission) << MPU_RASR_AP_Pos)   & MPU_RASR_AP_Msk)                                  | \ | ||||
|    (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ | ||||
|    (((SubRegionDisable) << MPU_RASR_SRD_Pos)  & MPU_RASR_SRD_Msk)                                 | \ | ||||
|    (((Size)             << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk)                                | \ | ||||
|    (((MPU_RASR_ENABLE_Msk)))) | ||||
|  | ||||
| /** | ||||
| * MPU Region Attribute and Size Register Value | ||||
| *  | ||||
| * \param DisableExec       Instruction access disable bit, 1= disable instruction fetches. | ||||
| * \param AccessPermission  Data access permissions, allows you to configure read/write access for User and Privileged mode. | ||||
| * \param TypeExtField      Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | ||||
| * \param IsShareable       Region is shareable between multiple bus masters. | ||||
| * \param IsCacheable       Region is cacheable, i.e. its value may be kept in cache. | ||||
| * \param IsBufferable      Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | ||||
| * \param SubRegionDisable  Sub-region disable field. | ||||
| * \param Size              Region size of the region to be configured, for example 4K, 8K. | ||||
| */                          | ||||
| #define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ | ||||
|   ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for strongly ordered memory. | ||||
| *  - TEX: 000b | ||||
| *  - Shareable | ||||
| *  - Non-cacheable | ||||
| *  - Non-bufferable | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for device memory. | ||||
| *  - TEX: 000b (if shareable) or 010b (if non-shareable) | ||||
| *  - Shareable or non-shareable | ||||
| *  - Non-cacheable | ||||
| *  - Bufferable (if shareable) or non-bufferable (if non-shareable) | ||||
| * | ||||
| * \param IsShareable Configures the device memory as shareable or non-shareable. | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for normal memory. | ||||
| *  - TEX: 1BBb (reflecting outer cacheability rules) | ||||
| *  - Shareable or non-shareable | ||||
| *  - Cacheable or non-cacheable (reflecting inner cacheability rules) | ||||
| *  - Bufferable or non-bufferable (reflecting inner cacheability rules) | ||||
| * | ||||
| * \param OuterCp Configures the outer cache policy. | ||||
| * \param InnerCp Configures the inner cache policy. | ||||
| * \param IsShareable Configures the memory as shareable or non-shareable. | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute non-cacheable policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_NOCACHE 0U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-back, write and read allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WB_WRA 1U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-through, no write allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WT_NWA 2U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-back, no write allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WB_NWA 3U | ||||
|  | ||||
|  | ||||
| /** | ||||
| * Struct for a single MPU Region | ||||
| */ | ||||
| typedef struct { | ||||
|   uint32_t RBAR; //!< The region base address register value (RBAR) | ||||
|   uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR | ||||
| } ARM_MPU_Region_t; | ||||
|      | ||||
| /** Enable the MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | ||||
| { | ||||
|   __DMB(); | ||||
|   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** Disable the MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable(void) | ||||
| { | ||||
|   __DMB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** Clear and disable the given MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | ||||
| { | ||||
|   MPU->RNR = rnr; | ||||
|   MPU->RASR = 0U; | ||||
| } | ||||
|  | ||||
| /** Configure an MPU region. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rasr Value for RASR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) | ||||
| { | ||||
|   MPU->RBAR = rbar; | ||||
|   MPU->RASR = rasr; | ||||
| } | ||||
|  | ||||
| /** Configure the given MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rasr Value for RASR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) | ||||
| { | ||||
|   MPU->RNR = rnr; | ||||
|   MPU->RBAR = rbar; | ||||
|   MPU->RASR = rasr; | ||||
| } | ||||
|  | ||||
| /** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_Load(). | ||||
| * \param dst Destination data is copied to. | ||||
| * \param src Source data is copied from. | ||||
| * \param len Amount of data words to be copied. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | ||||
| { | ||||
|   uint32_t i; | ||||
|   for (i = 0U; i < len; ++i)  | ||||
|   { | ||||
|     dst[i] = src[i]; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | ||||
|   while (cnt > MPU_TYPE_RALIASES) { | ||||
|     ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); | ||||
|     table += MPU_TYPE_RALIASES; | ||||
|     cnt -= MPU_TYPE_RALIASES; | ||||
|   } | ||||
|   ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										352
									
								
								Drivers/CMSIS/Include/mpu_armv8.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								Drivers/CMSIS/Include/mpu_armv8.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,352 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     mpu_armv8.h | ||||
|  * @brief    CMSIS MPU API for Armv8-M and Armv8.1-M MPU | ||||
|  * @version  V5.1.3 | ||||
|  * @date     03. February 2021 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2021 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef ARM_MPU_ARMV8_H | ||||
| #define ARM_MPU_ARMV8_H | ||||
|  | ||||
| /** \brief Attribute for device memory (outer only) */ | ||||
| #define ARM_MPU_ATTR_DEVICE                           ( 0U ) | ||||
|  | ||||
| /** \brief Attribute for non-cacheable, normal memory */ | ||||
| #define ARM_MPU_ATTR_NON_CACHEABLE                    ( 4U ) | ||||
|  | ||||
| /** \brief Attribute for normal memory (outer and inner) | ||||
| * \param NT Non-Transient: Set to 1 for non-transient data. | ||||
| * \param WB Write-Back: Set to 1 to use write-back update policy. | ||||
| * \param RA Read Allocation: Set to 1 to use cache allocation on read miss. | ||||
| * \param WA Write Allocation: Set to 1 to use cache allocation on write miss. | ||||
| */ | ||||
| #define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ | ||||
|   ((((NT) & 1U) << 3U) | (((WB) & 1U) << 2U) | (((RA) & 1U) << 1U) | ((WA) & 1U)) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGnRE  (1U) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGRE   (2U) | ||||
|  | ||||
| /** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_GRE    (3U) | ||||
|  | ||||
| /** \brief Memory Attribute | ||||
| * \param O Outer memory attributes | ||||
| * \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes | ||||
| */ | ||||
| #define ARM_MPU_ATTR(O, I) ((((O) & 0xFU) << 4U) | ((((O) & 0xFU) != 0U) ? ((I) & 0xFU) : (((I) & 0x3U) << 2U))) | ||||
|  | ||||
| /** \brief Normal memory non-shareable  */ | ||||
| #define ARM_MPU_SH_NON   (0U) | ||||
|  | ||||
| /** \brief Normal memory outer shareable  */ | ||||
| #define ARM_MPU_SH_OUTER (2U) | ||||
|  | ||||
| /** \brief Normal memory inner shareable  */ | ||||
| #define ARM_MPU_SH_INNER (3U) | ||||
|  | ||||
| /** \brief Memory access permissions | ||||
| * \param RO Read-Only: Set to 1 for read-only memory. | ||||
| * \param NP Non-Privileged: Set to 1 for non-privileged memory. | ||||
| */ | ||||
| #define ARM_MPU_AP_(RO, NP) ((((RO) & 1U) << 1U) | ((NP) & 1U)) | ||||
|  | ||||
| /** \brief Region Base Address Register value | ||||
| * \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. | ||||
| * \param SH Defines the Shareability domain for this memory region. | ||||
| * \param RO Read-Only: Set to 1 for a read-only memory region. | ||||
| * \param NP Non-Privileged: Set to 1 for a non-privileged memory region. | ||||
| * \oaram XN eXecute Never: Set to 1 for a non-executable memory region. | ||||
| */ | ||||
| #define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ | ||||
|   (((BASE) & MPU_RBAR_BASE_Msk) | \ | ||||
|   (((SH) << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ | ||||
|   ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ | ||||
|   (((XN) << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) | ||||
|  | ||||
| /** \brief Region Limit Address Register value | ||||
| * \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. | ||||
| * \param IDX The attribute index to be associated with this memory region. | ||||
| */ | ||||
| #define ARM_MPU_RLAR(LIMIT, IDX) \ | ||||
|   (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ | ||||
|   (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ | ||||
|   (MPU_RLAR_EN_Msk)) | ||||
|  | ||||
| #if defined(MPU_RLAR_PXN_Pos) | ||||
|    | ||||
| /** \brief Region Limit Address Register with PXN value | ||||
| * \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. | ||||
| * \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. | ||||
| * \param IDX The attribute index to be associated with this memory region. | ||||
| */ | ||||
| #define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ | ||||
|   (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ | ||||
|   (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ | ||||
|   (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ | ||||
|   (MPU_RLAR_EN_Msk)) | ||||
|    | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| * Struct for a single MPU Region | ||||
| */ | ||||
| typedef struct { | ||||
|   uint32_t RBAR;                   /*!< Region Base Address Register value */ | ||||
|   uint32_t RLAR;                   /*!< Region Limit Address Register value */ | ||||
| } ARM_MPU_Region_t; | ||||
|      | ||||
| /** Enable the MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | ||||
| { | ||||
|   __DMB(); | ||||
|   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** Disable the MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable(void) | ||||
| { | ||||
|   __DMB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Enable the Non-secure MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) | ||||
| { | ||||
|   __DMB(); | ||||
|   MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** Disable the Non-secure MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable_NS(void) | ||||
| { | ||||
|   __DMB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU_NS->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Set the memory attribute encoding to the given MPU. | ||||
| * \param mpu Pointer to the MPU to be configured. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   const uint8_t reg = idx / 4U; | ||||
|   const uint32_t pos = ((idx % 4U) * 8U); | ||||
|   const uint32_t mask = 0xFFU << pos; | ||||
|    | ||||
|   if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { | ||||
|     return; // invalid index | ||||
|   } | ||||
|    | ||||
|   mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); | ||||
| } | ||||
|  | ||||
| /** Set the memory attribute encoding. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   ARM_MPU_SetMemAttrEx(MPU, idx, attr); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Set the memory attribute encoding to the Non-secure MPU. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Clear and disable the given MPU region of the given MPU. | ||||
| * \param mpu Pointer to MPU to be used. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) | ||||
| { | ||||
|   mpu->RNR = rnr; | ||||
|   mpu->RLAR = 0U; | ||||
| } | ||||
|  | ||||
| /** Clear and disable the given MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | ||||
| { | ||||
|   ARM_MPU_ClrRegionEx(MPU, rnr); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Clear and disable the given Non-secure MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) | ||||
| {   | ||||
|   ARM_MPU_ClrRegionEx(MPU_NS, rnr); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Configure the given MPU region of the given MPU. | ||||
| * \param mpu Pointer to MPU to be used. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   mpu->RNR = rnr; | ||||
|   mpu->RBAR = rbar; | ||||
|   mpu->RLAR = rlar; | ||||
| } | ||||
|  | ||||
| /** Configure the given MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Configure the given Non-secure MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);   | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx() | ||||
| * \param dst Destination data is copied to. | ||||
| * \param src Source data is copied from. | ||||
| * \param len Amount of data words to be copied. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | ||||
| { | ||||
|   uint32_t i; | ||||
|   for (i = 0U; i < len; ++i)  | ||||
|   { | ||||
|     dst[i] = src[i]; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table to the given MPU. | ||||
| * \param mpu Pointer to the MPU registers to be used. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | ||||
|   if (cnt == 1U) { | ||||
|     mpu->RNR = rnr; | ||||
|     ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); | ||||
|   } else { | ||||
|     uint32_t rnrBase   = rnr & ~(MPU_TYPE_RALIASES-1U); | ||||
|     uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; | ||||
|      | ||||
|     mpu->RNR = rnrBase; | ||||
|     while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { | ||||
|       uint32_t c = MPU_TYPE_RALIASES - rnrOffset; | ||||
|       ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); | ||||
|       table += c; | ||||
|       cnt -= c; | ||||
|       rnrOffset = 0U; | ||||
|       rnrBase += MPU_TYPE_RALIASES; | ||||
|       mpu->RNR = rnrBase; | ||||
|     } | ||||
|      | ||||
|     ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   ARM_MPU_LoadEx(MPU, rnr, table, cnt); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Load the given number of MPU regions from a table to the Non-secure MPU. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										206
									
								
								Drivers/CMSIS/Include/pac_armv81.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								Drivers/CMSIS/Include/pac_armv81.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     pac_armv81.h | ||||
|  * @brief    CMSIS PAC key functions for Armv8.1-M PAC extension | ||||
|  * @version  V1.0.0 | ||||
|  * @date     23. March 2022 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2022 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef PAC_ARMV81_H | ||||
| #define PAC_ARMV81_H | ||||
|  | ||||
|  | ||||
| /* ###################  PAC Key functions  ########################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions | ||||
|   \brief    Functions that access the PAC keys. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) | ||||
|  | ||||
| /** | ||||
|   \brief   read the PAC key used for privileged mode | ||||
|   \details Reads the PAC key stored in the PAC_KEY_P registers. | ||||
|   \param [out]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "mrs   r1, pac_key_p_0\n" | ||||
|   "str   r1,[%0,#0]\n" | ||||
|   "mrs   r1, pac_key_p_1\n" | ||||
|   "str   r1,[%0,#4]\n" | ||||
|   "mrs   r1, pac_key_p_2\n" | ||||
|   "str   r1,[%0,#8]\n" | ||||
|   "mrs   r1, pac_key_p_3\n" | ||||
|   "str   r1,[%0,#12]\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   write the PAC key used for privileged mode | ||||
|   \details writes the given PAC key to the PAC_KEY_P registers. | ||||
|   \param [in]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "ldr   r1,[%0,#0]\n" | ||||
|   "msr   pac_key_p_0, r1\n" | ||||
|   "ldr   r1,[%0,#4]\n" | ||||
|   "msr   pac_key_p_1, r1\n" | ||||
|   "ldr   r1,[%0,#8]\n" | ||||
|   "msr   pac_key_p_2, r1\n" | ||||
|   "ldr   r1,[%0,#12]\n" | ||||
|   "msr   pac_key_p_3, r1\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   read the PAC key used for unprivileged mode | ||||
|   \details Reads the PAC key stored in the PAC_KEY_U registers. | ||||
|   \param [out]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "mrs   r1, pac_key_u_0\n" | ||||
|   "str   r1,[%0,#0]\n" | ||||
|   "mrs   r1, pac_key_u_1\n" | ||||
|   "str   r1,[%0,#4]\n" | ||||
|   "mrs   r1, pac_key_u_2\n" | ||||
|   "str   r1,[%0,#8]\n" | ||||
|   "mrs   r1, pac_key_u_3\n" | ||||
|   "str   r1,[%0,#12]\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   write the PAC key used for unprivileged mode | ||||
|   \details writes the given PAC key to the PAC_KEY_U registers. | ||||
|   \param [in]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "ldr   r1,[%0,#0]\n" | ||||
|   "msr   pac_key_u_0, r1\n" | ||||
|   "ldr   r1,[%0,#4]\n" | ||||
|   "msr   pac_key_u_1, r1\n" | ||||
|   "ldr   r1,[%0,#8]\n" | ||||
|   "msr   pac_key_u_2, r1\n" | ||||
|   "ldr   r1,[%0,#12]\n" | ||||
|   "msr   pac_key_u_3, r1\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) | ||||
|  | ||||
| /** | ||||
|   \brief   read the PAC key used for privileged mode (non-secure) | ||||
|   \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode. | ||||
|   \param [out]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "mrs   r1, pac_key_p_0_ns\n" | ||||
|   "str   r1,[%0,#0]\n" | ||||
|   "mrs   r1, pac_key_p_1_ns\n" | ||||
|   "str   r1,[%0,#4]\n" | ||||
|   "mrs   r1, pac_key_p_2_ns\n" | ||||
|   "str   r1,[%0,#8]\n" | ||||
|   "mrs   r1, pac_key_p_3_ns\n" | ||||
|   "str   r1,[%0,#12]\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   write the PAC key used for privileged mode (non-secure) | ||||
|   \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode. | ||||
|   \param [in]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "ldr   r1,[%0,#0]\n" | ||||
|   "msr   pac_key_p_0_ns, r1\n" | ||||
|   "ldr   r1,[%0,#4]\n" | ||||
|   "msr   pac_key_p_1_ns, r1\n" | ||||
|   "ldr   r1,[%0,#8]\n" | ||||
|   "msr   pac_key_p_2_ns, r1\n" | ||||
|   "ldr   r1,[%0,#12]\n" | ||||
|   "msr   pac_key_p_3_ns, r1\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   read the PAC key used for unprivileged mode (non-secure) | ||||
|   \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode. | ||||
|   \param [out]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "mrs   r1, pac_key_u_0_ns\n" | ||||
|   "str   r1,[%0,#0]\n" | ||||
|   "mrs   r1, pac_key_u_1_ns\n" | ||||
|   "str   r1,[%0,#4]\n" | ||||
|   "mrs   r1, pac_key_u_2_ns\n" | ||||
|   "str   r1,[%0,#8]\n" | ||||
|   "mrs   r1, pac_key_u_3_ns\n" | ||||
|   "str   r1,[%0,#12]\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   write the PAC key used for unprivileged mode (non-secure) | ||||
|   \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode. | ||||
|   \param [in]    pPacKey  128bit PAC key | ||||
|  */ | ||||
| __STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) { | ||||
|   __ASM volatile ( | ||||
|   "ldr   r1,[%0,#0]\n" | ||||
|   "msr   pac_key_u_0_ns, r1\n" | ||||
|   "ldr   r1,[%0,#4]\n" | ||||
|   "msr   pac_key_u_1_ns, r1\n" | ||||
|   "ldr   r1,[%0,#8]\n" | ||||
|   "msr   pac_key_u_2_ns, r1\n" | ||||
|   "ldr   r1,[%0,#12]\n" | ||||
|   "msr   pac_key_u_3_ns, r1\n" | ||||
|   : : "r" (pPacKey) : "memory", "r1" | ||||
|   ); | ||||
| } | ||||
|  | ||||
| #endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */ | ||||
|  | ||||
| #endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */ | ||||
|  | ||||
| /*@} end of CMSIS_Core_PacKeyFunctions */ | ||||
|  | ||||
|  | ||||
| #endif /* PAC_ARMV81_H */ | ||||
							
								
								
									
										337
									
								
								Drivers/CMSIS/Include/pmu_armv8.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										337
									
								
								Drivers/CMSIS/Include/pmu_armv8.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,337 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     pmu_armv8.h | ||||
|  * @brief    CMSIS PMU API for Armv8.1-M PMU | ||||
|  * @version  V1.0.1 | ||||
|  * @date     15. April 2020 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2020 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef ARM_PMU_ARMV8_H | ||||
| #define ARM_PMU_ARMV8_H | ||||
|  | ||||
| /** | ||||
|  * \brief PMU Events | ||||
|  * \note  See the Armv8.1-M Architecture Reference Manual for full details on these PMU events. | ||||
|  * */ | ||||
|  | ||||
| #define ARM_PMU_SW_INCR                              0x0000             /*!< Software update to the PMU_SWINC register, architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_L1I_CACHE_REFILL                     0x0001             /*!< L1 I-Cache refill */ | ||||
| #define ARM_PMU_L1D_CACHE_REFILL                     0x0003             /*!< L1 D-Cache refill */ | ||||
| #define ARM_PMU_L1D_CACHE                            0x0004             /*!< L1 D-Cache access */ | ||||
| #define ARM_PMU_LD_RETIRED                           0x0006             /*!< Memory-reading instruction architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_ST_RETIRED                           0x0007             /*!< Memory-writing instruction architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_INST_RETIRED                         0x0008             /*!< Instruction architecturally executed */ | ||||
| #define ARM_PMU_EXC_TAKEN                            0x0009             /*!< Exception entry */ | ||||
| #define ARM_PMU_EXC_RETURN                           0x000A             /*!< Exception return instruction architecturally executed and the condition code check pass */ | ||||
| #define ARM_PMU_PC_WRITE_RETIRED                     0x000C             /*!< Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_BR_IMMED_RETIRED                     0x000D             /*!< Immediate branch architecturally executed */ | ||||
| #define ARM_PMU_BR_RETURN_RETIRED                    0x000E             /*!< Function return instruction architecturally executed and the condition code check pass */ | ||||
| #define ARM_PMU_UNALIGNED_LDST_RETIRED               0x000F             /*!< Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_BR_MIS_PRED                          0x0010             /*!< Mispredicted or not predicted branch speculatively executed */ | ||||
| #define ARM_PMU_CPU_CYCLES                           0x0011             /*!< Cycle */ | ||||
| #define ARM_PMU_BR_PRED                              0x0012             /*!< Predictable branch speculatively executed */ | ||||
| #define ARM_PMU_MEM_ACCESS                           0x0013             /*!< Data memory access */ | ||||
| #define ARM_PMU_L1I_CACHE                            0x0014             /*!< Level 1 instruction cache access */ | ||||
| #define ARM_PMU_L1D_CACHE_WB                         0x0015             /*!< Level 1 data cache write-back */ | ||||
| #define ARM_PMU_L2D_CACHE                            0x0016             /*!< Level 2 data cache access */ | ||||
| #define ARM_PMU_L2D_CACHE_REFILL                     0x0017             /*!< Level 2 data cache refill */ | ||||
| #define ARM_PMU_L2D_CACHE_WB                         0x0018             /*!< Level 2 data cache write-back */ | ||||
| #define ARM_PMU_BUS_ACCESS                           0x0019             /*!< Bus access */ | ||||
| #define ARM_PMU_MEMORY_ERROR                         0x001A             /*!< Local memory error */ | ||||
| #define ARM_PMU_INST_SPEC                            0x001B             /*!< Instruction speculatively executed */ | ||||
| #define ARM_PMU_BUS_CYCLES                           0x001D             /*!< Bus cycles */ | ||||
| #define ARM_PMU_CHAIN                                0x001E             /*!< For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */ | ||||
| #define ARM_PMU_L1D_CACHE_ALLOCATE                   0x001F             /*!< Level 1 data cache allocation without refill */ | ||||
| #define ARM_PMU_L2D_CACHE_ALLOCATE                   0x0020             /*!< Level 2 data cache allocation without refill */ | ||||
| #define ARM_PMU_BR_RETIRED                           0x0021             /*!< Branch instruction architecturally executed */ | ||||
| #define ARM_PMU_BR_MIS_PRED_RETIRED                  0x0022             /*!< Mispredicted branch instruction architecturally executed */ | ||||
| #define ARM_PMU_STALL_FRONTEND                       0x0023             /*!< No operation issued because of the frontend */ | ||||
| #define ARM_PMU_STALL_BACKEND                        0x0024             /*!< No operation issued because of the backend */ | ||||
| #define ARM_PMU_L2I_CACHE                            0x0027             /*!< Level 2 instruction cache access */ | ||||
| #define ARM_PMU_L2I_CACHE_REFILL                     0x0028             /*!< Level 2 instruction cache refill */ | ||||
| #define ARM_PMU_L3D_CACHE_ALLOCATE                   0x0029             /*!< Level 3 data cache allocation without refill */ | ||||
| #define ARM_PMU_L3D_CACHE_REFILL                     0x002A             /*!< Level 3 data cache refill */ | ||||
| #define ARM_PMU_L3D_CACHE                            0x002B             /*!< Level 3 data cache access */ | ||||
| #define ARM_PMU_L3D_CACHE_WB                         0x002C             /*!< Level 3 data cache write-back */ | ||||
| #define ARM_PMU_LL_CACHE_RD                          0x0036             /*!< Last level data cache read */ | ||||
| #define ARM_PMU_LL_CACHE_MISS_RD                     0x0037             /*!< Last level data cache read miss */ | ||||
| #define ARM_PMU_L1D_CACHE_MISS_RD                    0x0039             /*!< Level 1 data cache read miss */ | ||||
| #define ARM_PMU_OP_COMPLETE                          0x003A             /*!< Operation retired */ | ||||
| #define ARM_PMU_OP_SPEC                              0x003B             /*!< Operation speculatively executed */ | ||||
| #define ARM_PMU_STALL                                0x003C             /*!< Stall cycle for instruction or operation not sent for execution */ | ||||
| #define ARM_PMU_STALL_OP_BACKEND                     0x003D             /*!< Stall cycle for instruction or operation not sent for execution due to pipeline backend */ | ||||
| #define ARM_PMU_STALL_OP_FRONTEND                    0x003E             /*!< Stall cycle for instruction or operation not sent for execution due to pipeline frontend */ | ||||
| #define ARM_PMU_STALL_OP                             0x003F             /*!< Instruction or operation slots not occupied each cycle */ | ||||
| #define ARM_PMU_L1D_CACHE_RD                         0x0040             /*!< Level 1 data cache read */ | ||||
| #define ARM_PMU_LE_RETIRED                           0x0100             /*!< Loop end instruction executed */ | ||||
| #define ARM_PMU_LE_SPEC                              0x0101             /*!< Loop end instruction speculatively executed */ | ||||
| #define ARM_PMU_BF_RETIRED                           0x0104             /*!< Branch future instruction architecturally executed and condition code check pass */ | ||||
| #define ARM_PMU_BF_SPEC                              0x0105             /*!< Branch future instruction speculatively executed and condition code check pass */ | ||||
| #define ARM_PMU_LE_CANCEL                            0x0108             /*!< Loop end instruction not taken */ | ||||
| #define ARM_PMU_BF_CANCEL                            0x0109             /*!< Branch future instruction not taken */ | ||||
| #define ARM_PMU_SE_CALL_S                            0x0114             /*!< Call to secure function, resulting in Security state change */ | ||||
| #define ARM_PMU_SE_CALL_NS                           0x0115             /*!< Call to non-secure function, resulting in Security state change */ | ||||
| #define ARM_PMU_DWT_CMPMATCH0                        0x0118             /*!< DWT comparator 0 match */ | ||||
| #define ARM_PMU_DWT_CMPMATCH1                        0x0119             /*!< DWT comparator 1 match */ | ||||
| #define ARM_PMU_DWT_CMPMATCH2                        0x011A             /*!< DWT comparator 2 match */ | ||||
| #define ARM_PMU_DWT_CMPMATCH3                        0x011B             /*!< DWT comparator 3 match */ | ||||
| #define ARM_PMU_MVE_INST_RETIRED                     0x0200             /*!< MVE instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_INST_SPEC                        0x0201             /*!< MVE instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_FP_RETIRED                       0x0204             /*!< MVE floating-point instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_FP_SPEC                          0x0205             /*!< MVE floating-point instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_FP_HP_RETIRED                    0x0208             /*!< MVE half-precision floating-point instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_FP_HP_SPEC                       0x0209             /*!< MVE half-precision floating-point instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_FP_SP_RETIRED                    0x020C             /*!< MVE single-precision floating-point instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_FP_SP_SPEC                       0x020D             /*!< MVE single-precision floating-point instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_FP_MAC_RETIRED                   0x0214             /*!< MVE floating-point multiply or multiply-accumulate instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_FP_MAC_SPEC                      0x0215             /*!< MVE floating-point multiply or multiply-accumulate instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_INT_RETIRED                      0x0224             /*!< MVE integer instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_INT_SPEC                         0x0225             /*!< MVE integer instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_INT_MAC_RETIRED                  0x0228             /*!< MVE multiply or multiply-accumulate instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_INT_MAC_SPEC                     0x0229             /*!< MVE multiply or multiply-accumulate instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_RETIRED                     0x0238             /*!< MVE load or store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_SPEC                        0x0239             /*!< MVE load or store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LD_RETIRED                       0x023C             /*!< MVE load instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LD_SPEC                          0x023D             /*!< MVE load instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_ST_RETIRED                       0x0240             /*!< MVE store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_ST_SPEC                          0x0241             /*!< MVE store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_CONTIG_RETIRED              0x0244             /*!< MVE contiguous load or store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_CONTIG_SPEC                 0x0245             /*!< MVE contiguous load or store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LD_CONTIG_RETIRED                0x0248             /*!< MVE contiguous load instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LD_CONTIG_SPEC                   0x0249             /*!< MVE contiguous load instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_ST_CONTIG_RETIRED                0x024C             /*!< MVE contiguous store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_ST_CONTIG_SPEC                   0x024D             /*!< MVE contiguous store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED           0x0250             /*!< MVE non-contiguous load or store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_NONCONTIG_SPEC              0x0251             /*!< MVE non-contiguous load or store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LD_NONCONTIG_RETIRED             0x0254             /*!< MVE non-contiguous load instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LD_NONCONTIG_SPEC                0x0255             /*!< MVE non-contiguous load instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_ST_NONCONTIG_RETIRED             0x0258             /*!< MVE non-contiguous store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_ST_NONCONTIG_SPEC                0x0259             /*!< MVE non-contiguous store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_MULTI_RETIRED               0x025C             /*!< MVE memory instruction targeting multiple registers architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_MULTI_SPEC                  0x025D             /*!< MVE memory instruction targeting multiple registers speculatively executed */ | ||||
| #define ARM_PMU_MVE_LD_MULTI_RETIRED                 0x0260             /*!< MVE memory load instruction targeting multiple registers architecturally executed */ | ||||
| #define ARM_PMU_MVE_LD_MULTI_SPEC                    0x0261             /*!< MVE memory load instruction targeting multiple registers speculatively executed */ | ||||
| #define ARM_PMU_MVE_ST_MULTI_RETIRED                 0x0261             /*!< MVE memory store instruction targeting multiple registers architecturally executed */ | ||||
| #define ARM_PMU_MVE_ST_MULTI_SPEC                    0x0265             /*!< MVE memory store instruction targeting multiple registers speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED           0x028C             /*!< MVE unaligned memory load or store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_UNALIGNED_SPEC              0x028D             /*!< MVE unaligned memory load or store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LD_UNALIGNED_RETIRED             0x0290             /*!< MVE unaligned load instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LD_UNALIGNED_SPEC                0x0291             /*!< MVE unaligned load instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_ST_UNALIGNED_RETIRED             0x0294             /*!< MVE unaligned store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_ST_UNALIGNED_SPEC                0x0295             /*!< MVE unaligned store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298             /*!< MVE unaligned noncontiguous load or store instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC    0x0299             /*!< MVE unaligned noncontiguous load or store instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_RETIRED                  0x02A0             /*!< MVE vector reduction instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_SPEC                     0x02A1             /*!< MVE vector reduction instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_FP_RETIRED               0x02A4             /*!< MVE floating-point vector reduction instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_FP_SPEC                  0x02A5             /*!< MVE floating-point vector reduction instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_INT_RETIRED              0x02A8             /*!< MVE integer vector reduction instruction architecturally executed */ | ||||
| #define ARM_PMU_MVE_VREDUCE_INT_SPEC                 0x02A9             /*!< MVE integer vector reduction instruction speculatively executed */ | ||||
| #define ARM_PMU_MVE_PRED                             0x02B8             /*!< Cycles where one or more predicated beats architecturally executed */ | ||||
| #define ARM_PMU_MVE_STALL                            0x02CC             /*!< Stall cycles caused by an MVE instruction */ | ||||
| #define ARM_PMU_MVE_STALL_RESOURCE                   0x02CD             /*!< Stall cycles caused by an MVE instruction because of resource conflicts */ | ||||
| #define ARM_PMU_MVE_STALL_RESOURCE_MEM               0x02CE             /*!< Stall cycles caused by an MVE instruction because of memory resource conflicts */ | ||||
| #define ARM_PMU_MVE_STALL_RESOURCE_FP                0x02CF             /*!< Stall cycles caused by an MVE instruction because of floating-point resource conflicts */ | ||||
| #define ARM_PMU_MVE_STALL_RESOURCE_INT               0x02D0             /*!< Stall cycles caused by an MVE instruction because of integer resource conflicts */ | ||||
| #define ARM_PMU_MVE_STALL_BREAK                      0x02D3             /*!< Stall cycles caused by an MVE chain break */ | ||||
| #define ARM_PMU_MVE_STALL_DEPENDENCY                 0x02D4             /*!< Stall cycles caused by MVE register dependency */ | ||||
| #define ARM_PMU_ITCM_ACCESS                          0x4007             /*!< Instruction TCM access */ | ||||
| #define ARM_PMU_DTCM_ACCESS                          0x4008             /*!< Data TCM access */ | ||||
| #define ARM_PMU_TRCEXTOUT0                           0x4010             /*!< ETM external output 0 */ | ||||
| #define ARM_PMU_TRCEXTOUT1                           0x4011             /*!< ETM external output 1 */ | ||||
| #define ARM_PMU_TRCEXTOUT2                           0x4012             /*!< ETM external output 2 */ | ||||
| #define ARM_PMU_TRCEXTOUT3                           0x4013             /*!< ETM external output 3 */ | ||||
| #define ARM_PMU_CTI_TRIGOUT4                         0x4018             /*!< Cross-trigger Interface output trigger 4 */ | ||||
| #define ARM_PMU_CTI_TRIGOUT5                         0x4019             /*!< Cross-trigger Interface output trigger 5 */ | ||||
| #define ARM_PMU_CTI_TRIGOUT6                         0x401A             /*!< Cross-trigger Interface output trigger 6 */ | ||||
| #define ARM_PMU_CTI_TRIGOUT7                         0x401B             /*!< Cross-trigger Interface output trigger 7 */ | ||||
|  | ||||
| /** \brief PMU Functions */ | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_Enable(void); | ||||
| __STATIC_INLINE void ARM_PMU_Disable(void); | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type); | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void); | ||||
| __STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void); | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask); | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask); | ||||
|  | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void); | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num); | ||||
|  | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void); | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask); | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask); | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask); | ||||
|  | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask); | ||||
|  | ||||
| /**  | ||||
|   \brief   Enable the PMU | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Enable(void)  | ||||
| { | ||||
|   PMU->CTRL |= PMU_CTRL_ENABLE_Msk; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Disable the PMU | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Disable(void)  | ||||
| { | ||||
|   PMU->CTRL &= ~PMU_CTRL_ENABLE_Msk; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Set event to count for PMU eventer counter | ||||
|   \param [in]    num     Event counter (0-30) to configure | ||||
|   \param [in]    type    Event to count | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type) | ||||
| { | ||||
|   PMU->EVTYPER[num] = type; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief  Reset cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void) | ||||
| { | ||||
|   PMU->CTRL |= PMU_CTRL_CYCCNT_RESET_Msk; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief  Reset all event counters | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void) | ||||
| { | ||||
|   PMU->CTRL |= PMU_CTRL_EVENTCNT_RESET_Msk; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief  Enable counters  | ||||
|   \param [in]     mask    Counters to enable | ||||
|   \note   Enables one or more of the following: | ||||
|           - event counters (0-30) | ||||
|           - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask) | ||||
| { | ||||
|   PMU->CNTENSET = mask; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief  Disable counters | ||||
|   \param [in]     mask    Counters to enable | ||||
|   \note   Disables one or more of the following: | ||||
|           - event counters (0-30) | ||||
|           - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask) | ||||
| { | ||||
|   PMU->CNTENCLR = mask; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief  Read cycle counter | ||||
|   \return                 Cycle count | ||||
| */ | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void) | ||||
| { | ||||
|   return PMU->CCNTR; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Read event counter | ||||
|   \param [in]     num     Event counter (0-30) to read | ||||
|   \return                 Event count | ||||
| */ | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num) | ||||
| { | ||||
|   return PMU_EVCNTR_CNT_Msk & PMU->EVCNTR[num]; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Read counter overflow status | ||||
|   \return  Counter overflow status bits for the following: | ||||
|           - event counters (0-30) | ||||
|           - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void) | ||||
| { | ||||
|   return PMU->OVSSET;	 | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Clear counter overflow status | ||||
|   \param [in]     mask    Counter overflow status bits to clear | ||||
|   \note    Clears overflow status bits for one or more of the following: | ||||
|            - event counters (0-30) | ||||
|            - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask) | ||||
| { | ||||
|   PMU->OVSCLR = mask; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Enable counter overflow interrupt request  | ||||
|   \param [in]     mask    Counter overflow interrupt request bits to set | ||||
|   \note    Sets overflow interrupt request bits for one or more of the following: | ||||
|            - event counters (0-30) | ||||
|            - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask) | ||||
| { | ||||
|   PMU->INTENSET = mask; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Disable counter overflow interrupt request  | ||||
|   \param [in]     mask    Counter overflow interrupt request bits to clear | ||||
|   \note    Clears overflow interrupt request bits for one or more of the following: | ||||
|            - event counters (0-30) | ||||
|            - cycle counter | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask) | ||||
| { | ||||
|   PMU->INTENCLR = mask; | ||||
| } | ||||
|  | ||||
| /**  | ||||
|   \brief   Software increment event counter  | ||||
|   \param [in]     mask    Counters to increment | ||||
|   \note    Software increment bits for one or more event counters (0-30) | ||||
| */ | ||||
| __STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask) | ||||
| { | ||||
|   PMU->SWINC = mask; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										70
									
								
								Drivers/CMSIS/Include/tz_context.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								Drivers/CMSIS/Include/tz_context.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     tz_context.h | ||||
|  * @brief    Context Management for Armv8-M TrustZone | ||||
|  * @version  V1.0.1 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef TZ_CONTEXT_H | ||||
| #define TZ_CONTEXT_H | ||||
|   | ||||
| #include <stdint.h> | ||||
|   | ||||
| #ifndef TZ_MODULEID_T | ||||
| #define TZ_MODULEID_T | ||||
| /// \details Data type that identifies secure software modules called by a process. | ||||
| typedef uint32_t TZ_ModuleId_t; | ||||
| #endif | ||||
|   | ||||
| /// \details TZ Memory ID identifies an allocated memory slot. | ||||
| typedef uint32_t TZ_MemoryId_t; | ||||
|    | ||||
| /// Initialize secure context memory system | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_InitContextSystem_S (void); | ||||
|   | ||||
| /// Allocate context memory for calling secure software modules in TrustZone | ||||
| /// \param[in]  module   identifies software modules called from non-secure mode | ||||
| /// \return value != 0 id TrustZone memory slot identifier | ||||
| /// \return value 0    no memory available or internal error | ||||
| TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); | ||||
|   | ||||
| /// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| /// Load secure context (called on RTOS thread context switch) | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| /// Store secure context (called on RTOS thread context switch) | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| #endif  // TZ_CONTEXT_H | ||||
		Reference in New Issue
	
	Block a user