@@ -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 */ | |||||
@@ -0,0 +1,39 @@ | |||||
/**************************************************************************//** | |||||
* @file cmsis_version.h | |||||
* @brief CMSIS Core(M) Version definitions | |||||
* @version V5.0.3 | |||||
* @date 24. June 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 __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 ( 3U) /*!< [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 |
@@ -0,0 +1,272 @@ | |||||
/****************************************************************************** | |||||
* @file mpu_armv7.h | |||||
* @brief CMSIS MPU API for Armv7-M MPU | |||||
* @version V5.1.0 | |||||
* @date 08. March 2019 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2017-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 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) & 2U), ((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) | |||||
{ | |||||
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; | |||||
} | |||||
/** 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 rsar Value for RSAR 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 rsar Value for RSAR 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; | |||||
} | |||||
/** Memcopy with strictly ordered memory access, e.g. for register targets. | |||||
* \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 |
@@ -0,0 +1,446 @@ | |||||
/** | |||||
****************************************************************************** | |||||
* @file startup_stm32wb55xx_cm4.s | |||||
* @author MCD Application Team | |||||
* @brief STM32WB55xx devices vector table GCC toolchain. | |||||
* This module performs: | |||||
* - Set the initial SP | |||||
* - Set the initial PC == Reset_Handler, | |||||
* - Set the vector table entries with the exceptions ISR address | |||||
* - Branches to main in the C library (which eventually | |||||
* calls main()). | |||||
* After Reset the Cortex-M4 processor is in Thread mode, | |||||
* priority is Privileged, and the Stack is set to Main. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* Copyright (c) 2019-2022 STMicroelectronics. | |||||
* All rights reserved. | |||||
* | |||||
* This software is licensed under terms that can be found in the LICENSE file | |||||
* in the root directory of this software component. | |||||
* If no LICENSE file comes with this software, it is provided AS-IS. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
.syntax unified | |||||
.cpu cortex-m4 | |||||
.fpu softvfp | |||||
.thumb | |||||
.global g_pfnVectors | |||||
.global Default_Handler | |||||
/* start address for the initialization values of the .data section. | |||||
defined in linker script */ | |||||
.word _sidata | |||||
/* start address for the .data section. defined in linker script */ | |||||
.word _sdata | |||||
/* end address for the .data section. defined in linker script */ | |||||
.word _edata | |||||
/* start address for the .bss section. defined in linker script */ | |||||
.word _sbss | |||||
/* end address for the .bss section. defined in linker script */ | |||||
.word _ebss | |||||
/* start address for the initialization values of the .MB_MEM2 section. | |||||
defined in linker script */ | |||||
.word _siMB_MEM2 | |||||
/* start address for the .MB_MEM2 section. defined in linker script */ | |||||
.word _sMB_MEM2 | |||||
/* end address for the .MB_MEM2 section. defined in linker script */ | |||||
.word _eMB_MEM2 | |||||
/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */ | |||||
.macro INIT_BSS start, end | |||||
ldr r0, =\start | |||||
ldr r1, =\end | |||||
movs r3, #0 | |||||
bl LoopFillZerobss | |||||
.endm | |||||
/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */ | |||||
.macro INIT_DATA start, end, src | |||||
ldr r0, =\start | |||||
ldr r1, =\end | |||||
ldr r2, =\src | |||||
movs r3, #0 | |||||
bl LoopCopyDataInit | |||||
.endm | |||||
.section .text.data_initializers | |||||
CopyDataInit: | |||||
ldr r4, [r2, r3] | |||||
str r4, [r0, r3] | |||||
adds r3, r3, #4 | |||||
LoopCopyDataInit: | |||||
adds r4, r0, r3 | |||||
cmp r4, r1 | |||||
bcc CopyDataInit | |||||
bx lr | |||||
FillZerobss: | |||||
str r3, [r0] | |||||
adds r0, r0, #4 | |||||
LoopFillZerobss: | |||||
cmp r0, r1 | |||||
bcc FillZerobss | |||||
bx lr | |||||
.section .text.Reset_Handler | |||||
.weak Reset_Handler | |||||
.type Reset_Handler, %function | |||||
Reset_Handler: | |||||
ldr r0, =_estack | |||||
mov sp, r0 /* set stack pointer */ | |||||
/* Call the clock system initialization function.*/ | |||||
bl SystemInit | |||||
/* Copy the data segment initializers from flash to SRAM */ | |||||
INIT_DATA _sdata, _edata, _sidata | |||||
INIT_DATA _sMB_MEM2, _eMB_MEM2, _siMB_MEM2 | |||||
/* Zero fill the bss segments. */ | |||||
INIT_BSS _sbss, _ebss | |||||
/* Call static constructors */ | |||||
bl __libc_init_array | |||||
/* Call the application s entry point.*/ | |||||
bl main | |||||
LoopForever: | |||||
b LoopForever | |||||
.size Reset_Handler, .-Reset_Handler | |||||
/** | |||||
* @brief This is the code that gets called when the processor receives an | |||||
* unexpected interrupt. This simply enters an infinite loop, preserving | |||||
* the system state for examination by a debugger. | |||||
* | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
.section .text.Default_Handler,"ax",%progbits | |||||
Default_Handler: | |||||
Infinite_Loop: | |||||
b Infinite_Loop | |||||
.size Default_Handler, .-Default_Handler | |||||
/****************************************************************************** | |||||
* | |||||
* The minimal vector table for a Cortex-M4. Note that the proper constructs | |||||
* must be placed on this to ensure that it ends up at physical address | |||||
* 0x0000.0000. | |||||
* | |||||
******************************************************************************/ | |||||
.section .isr_vector,"a",%progbits | |||||
.type g_pfnVectors, %object | |||||
.size g_pfnVectors, .-g_pfnVectors | |||||
g_pfnVectors: | |||||
.word _estack | |||||
.word Reset_Handler | |||||
.word NMI_Handler | |||||
.word HardFault_Handler | |||||
.word MemManage_Handler | |||||
.word BusFault_Handler | |||||
.word UsageFault_Handler | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word SVC_Handler | |||||
.word DebugMon_Handler | |||||
.word 0 | |||||
.word PendSV_Handler | |||||
.word SysTick_Handler | |||||
.word WWDG_IRQHandler | |||||
.word PVD_PVM_IRQHandler | |||||
.word TAMP_STAMP_LSECSS_IRQHandler | |||||
.word RTC_WKUP_IRQHandler | |||||
.word FLASH_IRQHandler | |||||
.word RCC_IRQHandler | |||||
.word EXTI0_IRQHandler | |||||
.word EXTI1_IRQHandler | |||||
.word EXTI2_IRQHandler | |||||
.word EXTI3_IRQHandler | |||||
.word EXTI4_IRQHandler | |||||
.word DMA1_Channel1_IRQHandler | |||||
.word DMA1_Channel2_IRQHandler | |||||
.word DMA1_Channel3_IRQHandler | |||||
.word DMA1_Channel4_IRQHandler | |||||
.word DMA1_Channel5_IRQHandler | |||||
.word DMA1_Channel6_IRQHandler | |||||
.word DMA1_Channel7_IRQHandler | |||||
.word ADC1_IRQHandler | |||||
.word USB_HP_IRQHandler | |||||
.word USB_LP_IRQHandler | |||||
.word C2SEV_PWR_C2H_IRQHandler | |||||
.word COMP_IRQHandler | |||||
.word EXTI9_5_IRQHandler | |||||
.word TIM1_BRK_IRQHandler | |||||
.word TIM1_UP_TIM16_IRQHandler | |||||
.word TIM1_TRG_COM_TIM17_IRQHandler | |||||
.word TIM1_CC_IRQHandler | |||||
.word TIM2_IRQHandler | |||||
.word PKA_IRQHandler | |||||
.word I2C1_EV_IRQHandler | |||||
.word I2C1_ER_IRQHandler | |||||
.word I2C3_EV_IRQHandler | |||||
.word I2C3_ER_IRQHandler | |||||
.word SPI1_IRQHandler | |||||
.word SPI2_IRQHandler | |||||
.word USART1_IRQHandler | |||||
.word LPUART1_IRQHandler | |||||
.word SAI1_IRQHandler | |||||
.word TSC_IRQHandler | |||||
.word EXTI15_10_IRQHandler | |||||
.word RTC_Alarm_IRQHandler | |||||
.word CRS_IRQHandler | |||||
.word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler | |||||
.word IPCC_C1_RX_IRQHandler | |||||
.word IPCC_C1_TX_IRQHandler | |||||
.word HSEM_IRQHandler | |||||
.word LPTIM1_IRQHandler | |||||
.word LPTIM2_IRQHandler | |||||
.word LCD_IRQHandler | |||||
.word QUADSPI_IRQHandler | |||||
.word AES1_IRQHandler | |||||
.word AES2_IRQHandler | |||||
.word RNG_IRQHandler | |||||
.word FPU_IRQHandler | |||||
.word DMA2_Channel1_IRQHandler | |||||
.word DMA2_Channel2_IRQHandler | |||||
.word DMA2_Channel3_IRQHandler | |||||
.word DMA2_Channel4_IRQHandler | |||||
.word DMA2_Channel5_IRQHandler | |||||
.word DMA2_Channel6_IRQHandler | |||||
.word DMA2_Channel7_IRQHandler | |||||
.word DMAMUX1_OVR_IRQHandler | |||||
/******************************************************************************* | |||||
* | |||||
* Provide weak aliases for each Exception handler to the Default_Handler. | |||||
* As they are weak aliases, any function with the same name will override | |||||
* this definition. | |||||
* | |||||
*******************************************************************************/ | |||||
.weak NMI_Handler | |||||
.thumb_set NMI_Handler,Default_Handler | |||||
.weak HardFault_Handler | |||||
.thumb_set HardFault_Handler,Default_Handler | |||||
.weak MemManage_Handler | |||||
.thumb_set MemManage_Handler,Default_Handler | |||||
.weak BusFault_Handler | |||||
.thumb_set BusFault_Handler,Default_Handler | |||||
.weak UsageFault_Handler | |||||
.thumb_set UsageFault_Handler,Default_Handler | |||||
.weak SVC_Handler | |||||
.thumb_set SVC_Handler,Default_Handler | |||||
.weak DebugMon_Handler | |||||
.thumb_set DebugMon_Handler,Default_Handler | |||||
.weak PendSV_Handler | |||||
.thumb_set PendSV_Handler,Default_Handler | |||||
.weak SysTick_Handler | |||||
.thumb_set SysTick_Handler,Default_Handler | |||||
.weak WWDG_IRQHandler | |||||
.thumb_set WWDG_IRQHandler,Default_Handler | |||||
.weak PVD_PVM_IRQHandler | |||||
.thumb_set PVD_PVM_IRQHandler,Default_Handler | |||||
.weak TAMP_STAMP_LSECSS_IRQHandler | |||||
.thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler | |||||
.weak RTC_WKUP_IRQHandler | |||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler | |||||
.weak FLASH_IRQHandler | |||||
.thumb_set FLASH_IRQHandler,Default_Handler | |||||
.weak RCC_IRQHandler | |||||
.thumb_set RCC_IRQHandler,Default_Handler | |||||
.weak EXTI0_IRQHandler | |||||
.thumb_set EXTI0_IRQHandler,Default_Handler | |||||
.weak EXTI1_IRQHandler | |||||
.thumb_set EXTI1_IRQHandler,Default_Handler | |||||
.weak EXTI2_IRQHandler | |||||
.thumb_set EXTI2_IRQHandler,Default_Handler | |||||
.weak EXTI3_IRQHandler | |||||
.thumb_set EXTI3_IRQHandler,Default_Handler | |||||
.weak EXTI4_IRQHandler | |||||
.thumb_set EXTI4_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel1_IRQHandler | |||||
.thumb_set DMA1_Channel1_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel2_IRQHandler | |||||
.thumb_set DMA1_Channel2_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel3_IRQHandler | |||||
.thumb_set DMA1_Channel3_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel4_IRQHandler | |||||
.thumb_set DMA1_Channel4_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel5_IRQHandler | |||||
.thumb_set DMA1_Channel5_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel6_IRQHandler | |||||
.thumb_set DMA1_Channel6_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel7_IRQHandler | |||||
.thumb_set DMA1_Channel7_IRQHandler,Default_Handler | |||||
.weak ADC1_IRQHandler | |||||
.thumb_set ADC1_IRQHandler,Default_Handler | |||||
.weak USB_HP_IRQHandler | |||||
.thumb_set USB_HP_IRQHandler,Default_Handler | |||||
.weak USB_LP_IRQHandler | |||||
.thumb_set USB_LP_IRQHandler,Default_Handler | |||||
.weak C2SEV_PWR_C2H_IRQHandler | |||||
.thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler | |||||
.weak COMP_IRQHandler | |||||
.thumb_set COMP_IRQHandler,Default_Handler | |||||
.weak EXTI9_5_IRQHandler | |||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler | |||||
.weak TIM1_BRK_IRQHandler | |||||
.thumb_set TIM1_BRK_IRQHandler,Default_Handler | |||||
.weak TIM1_UP_TIM16_IRQHandler | |||||
.thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler | |||||
.weak TIM1_TRG_COM_TIM17_IRQHandler | |||||
.thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler | |||||
.weak TIM1_CC_IRQHandler | |||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler | |||||
.weak TIM2_IRQHandler | |||||
.thumb_set TIM2_IRQHandler,Default_Handler | |||||
.weak PKA_IRQHandler | |||||
.thumb_set PKA_IRQHandler,Default_Handler | |||||
.weak I2C1_EV_IRQHandler | |||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler | |||||
.weak I2C1_ER_IRQHandler | |||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler | |||||
.weak I2C3_EV_IRQHandler | |||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler | |||||
.weak I2C3_ER_IRQHandler | |||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler | |||||
.weak SPI1_IRQHandler | |||||
.thumb_set SPI1_IRQHandler,Default_Handler | |||||
.weak SPI2_IRQHandler | |||||
.thumb_set SPI2_IRQHandler,Default_Handler | |||||
.weak USART1_IRQHandler | |||||
.thumb_set USART1_IRQHandler,Default_Handler | |||||
.weak LPUART1_IRQHandler | |||||
.thumb_set LPUART1_IRQHandler,Default_Handler | |||||
.weak SAI1_IRQHandler | |||||
.thumb_set SAI1_IRQHandler,Default_Handler | |||||
.weak TSC_IRQHandler | |||||
.thumb_set TSC_IRQHandler,Default_Handler | |||||
.weak EXTI15_10_IRQHandler | |||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler | |||||
.weak RTC_Alarm_IRQHandler | |||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler | |||||
.weak CRS_IRQHandler | |||||
.thumb_set CRS_IRQHandler,Default_Handler | |||||
.weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler | |||||
.thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler | |||||
.weak IPCC_C1_RX_IRQHandler | |||||
.thumb_set IPCC_C1_RX_IRQHandler,Default_Handler | |||||
.weak IPCC_C1_TX_IRQHandler | |||||
.thumb_set IPCC_C1_TX_IRQHandler,Default_Handler | |||||
.weak HSEM_IRQHandler | |||||
.thumb_set HSEM_IRQHandler,Default_Handler | |||||
.weak LPTIM1_IRQHandler | |||||
.thumb_set LPTIM1_IRQHandler,Default_Handler | |||||
.weak LPTIM2_IRQHandler | |||||
.thumb_set LPTIM2_IRQHandler,Default_Handler | |||||
.weak LCD_IRQHandler | |||||
.thumb_set LCD_IRQHandler,Default_Handler | |||||
.weak QUADSPI_IRQHandler | |||||
.thumb_set QUADSPI_IRQHandler,Default_Handler | |||||
.weak AES1_IRQHandler | |||||
.thumb_set AES1_IRQHandler,Default_Handler | |||||
.weak AES2_IRQHandler | |||||
.thumb_set AES2_IRQHandler,Default_Handler | |||||
.weak RNG_IRQHandler | |||||
.thumb_set RNG_IRQHandler,Default_Handler | |||||
.weak FPU_IRQHandler | |||||
.thumb_set FPU_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel1_IRQHandler | |||||
.thumb_set DMA2_Channel1_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel2_IRQHandler | |||||
.thumb_set DMA2_Channel2_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel3_IRQHandler | |||||
.thumb_set DMA2_Channel3_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel4_IRQHandler | |||||
.thumb_set DMA2_Channel4_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel5_IRQHandler | |||||
.thumb_set DMA2_Channel5_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel6_IRQHandler | |||||
.thumb_set DMA2_Channel6_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel7_IRQHandler | |||||
.thumb_set DMA2_Channel7_IRQHandler,Default_Handler | |||||
.weak DMAMUX1_OVR_IRQHandler | |||||
.thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler | |||||
@@ -0,0 +1,181 @@ | |||||
/** | |||||
***************************************************************************** | |||||
** | |||||
** File : stm32wb55xx_flash_cm4.ld | |||||
** | |||||
** Author : STM32CubeIDE | |||||
** | |||||
** Abstract : Linker script for STM32WB55xx Device | |||||
** 1024Kbytes FLASH | |||||
** 128Kbytes RAM | |||||
** | |||||
** Set heap size, stack size and stack location according | |||||
** to application requirements. | |||||
** | |||||
** Set memory bank area and size if external memory is used. | |||||
** | |||||
** Target : STMicroelectronics STM32 | |||||
** | |||||
** Distribution: The file is distributed as is without any warranty | |||||
** of any kind. | |||||
** | |||||
***************************************************************************** | |||||
** @attention | |||||
** | |||||
** Copyright (c) 2019-2022 STMicroelectronics. | |||||
** All rights reserved. | |||||
** | |||||
** This software is licensed under terms that can be found in the LICENSE file | |||||
** in the root directory of this software component. | |||||
** If no LICENSE file comes with this software, it is provided AS-IS. | |||||
** | |||||
***************************************************************************** | |||||
*/ | |||||
/* Entry Point */ | |||||
ENTRY(Reset_Handler) | |||||
/* Highest address of the user mode stack */ | |||||
_estack = 0x20030000; /* end of RAM */ | |||||
/* Generate a link error if heap and stack don't fit into RAM */ | |||||
_Min_Heap_Size = 0x400; /* required amount of heap */ | |||||
_Min_Stack_Size = 0x1000; /* required amount of stack */ | |||||
/* Specify the memory areas */ | |||||
MEMORY | |||||
{ | |||||
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K | |||||
RAM1 (xrw) : ORIGIN = 0x20000008, LENGTH = 0x2FFF8 | |||||
RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K | |||||
} | |||||
/* Define output sections */ | |||||
SECTIONS | |||||
{ | |||||
/* The startup code goes first into FLASH */ | |||||
.isr_vector : | |||||
{ | |||||
. = ALIGN(4); | |||||
KEEP(*(.isr_vector)) /* Startup code */ | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
/* The program code and other data goes into FLASH */ | |||||
.text : | |||||
{ | |||||
. = ALIGN(4); | |||||
*(.text) /* .text sections (code) */ | |||||
*(.text*) /* .text* sections (code) */ | |||||
*(.glue_7) /* glue arm to thumb code */ | |||||
*(.glue_7t) /* glue thumb to arm code */ | |||||
*(.eh_frame) | |||||
KEEP (*(.init)) | |||||
KEEP (*(.fini)) | |||||
. = ALIGN(4); | |||||
_etext = .; /* define a global symbols at end of code */ | |||||
} >FLASH | |||||
/* Constant data goes into FLASH */ | |||||
.rodata : | |||||
{ | |||||
. = ALIGN(4); | |||||
*(.rodata) /* .rodata sections (constants, strings, etc.) */ | |||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */ | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH | |||||
.ARM : { | |||||
__exidx_start = .; | |||||
*(.ARM.exidx*) | |||||
__exidx_end = .; | |||||
} >FLASH | |||||
.preinit_array : | |||||
{ | |||||
PROVIDE_HIDDEN (__preinit_array_start = .); | |||||
KEEP (*(.preinit_array*)) | |||||
PROVIDE_HIDDEN (__preinit_array_end = .); | |||||
} >FLASH | |||||
.init_array : | |||||
{ | |||||
PROVIDE_HIDDEN (__init_array_start = .); | |||||
KEEP (*(SORT(.init_array.*))) | |||||
KEEP (*(.init_array*)) | |||||
PROVIDE_HIDDEN (__init_array_end = .); | |||||
} >FLASH | |||||
.fini_array : | |||||
{ | |||||
PROVIDE_HIDDEN (__fini_array_start = .); | |||||
KEEP (*(SORT(.fini_array.*))) | |||||
KEEP (*(.fini_array*)) | |||||
PROVIDE_HIDDEN (__fini_array_end = .); | |||||
} >FLASH | |||||
/* used by the startup to initialize data */ | |||||
_sidata = LOADADDR(.data); | |||||
/* Initialized data sections goes into RAM, load LMA copy after code */ | |||||
.data : | |||||
{ | |||||
. = ALIGN(4); | |||||
_sdata = .; /* create a global symbol at data start */ | |||||
*(.data) /* .data sections */ | |||||
*(.data*) /* .data* sections */ | |||||
. = ALIGN(4); | |||||
_edata = .; /* define a global symbol at data end */ | |||||
} >RAM1 AT> FLASH | |||||
/* Uninitialized data section */ | |||||
. = ALIGN(4); | |||||
.bss : | |||||
{ | |||||
/* This is used by the startup in order to initialize the .bss section */ | |||||
_sbss = .; /* define a global symbol at bss start */ | |||||
__bss_start__ = _sbss; | |||||
*(.bss) | |||||
*(.bss*) | |||||
*(COMMON) | |||||
. = ALIGN(4); | |||||
_ebss = .; /* define a global symbol at bss end */ | |||||
__bss_end__ = _ebss; | |||||
} >RAM1 | |||||
/* User_heap_stack section, used to check that there is enough RAM left */ | |||||
._user_heap_stack : | |||||
{ | |||||
. = ALIGN(8); | |||||
PROVIDE ( end = . ); | |||||
PROVIDE ( _end = . ); | |||||
. = . + _Min_Heap_Size; | |||||
. = . + _Min_Stack_Size; | |||||
. = ALIGN(8); | |||||
} >RAM1 | |||||
/* Remove information from the standard libraries */ | |||||
/DISCARD/ : | |||||
{ | |||||
libc.a ( * ) | |||||
libm.a ( * ) | |||||
libgcc.a ( * ) | |||||
} | |||||
.ARM.attributes 0 : { *(.ARM.attributes) } | |||||
MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED | |||||
MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED | |||||
/* used by the startup to initialize .MB_MEM2 data */ | |||||
_siMB_MEM2 = LOADADDR(.MB_MEM2); | |||||
.MB_MEM2 : | |||||
{ | |||||
_sMB_MEM2 = . ; | |||||
*(MB_MEM2) ; | |||||
_eMB_MEM2 = . ; | |||||
} >RAM_SHARED AT> FLASH | |||||
} | |||||
@@ -0,0 +1,230 @@ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32wbxx.h | |||||
* @author MCD Application Team | |||||
* @brief CMSIS STM32WBxx Device Peripheral Access Layer Header File. | |||||
* | |||||
* The file is the unique include file that the application programmer | |||||
* is using in the C source code, usually in main.c. This file contains: | |||||
* - Configuration section that allows to select: | |||||
* - The STM32WBxx device used in the target application | |||||
* - To use or not the peripheral's drivers in application code(i.e. | |||||
* code will be based on direct access to peripheral's registers | |||||
* rather than drivers API), this option is controlled by | |||||
* "#define USE_HAL_DRIVER" | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* Copyright (c) 2019-2021 STMicroelectronics. | |||||
* All rights reserved. | |||||
* | |||||
* This software is licensed under terms that can be found in the LICENSE file | |||||
* in the root directory of this software component. | |||||
* If no LICENSE file comes with this software, it is provided AS-IS. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32wbxx | |||||
* @{ | |||||
*/ | |||||
#ifndef __STM32WBxx_H | |||||
#define __STM32WBxx_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif /* __cplusplus */ | |||||
/** @addtogroup Library_configuration_section | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief STM32 Family | |||||
*/ | |||||
#if !defined (STM32WB) | |||||
#define STM32WB | |||||
#endif /* STM32WB */ | |||||
/* Tip: To avoid modifying this file each time you need to switch between these | |||||
devices, you can define the device in your toolchain compiler preprocessor. | |||||
*/ | |||||
#if !defined (USE_HAL_DRIVER) | |||||
/** | |||||
* @brief Comment the line below if you will not use the peripherals drivers. | |||||
In this case, these drivers will not be included and the application code will | |||||
be based on direct access to peripherals registers | |||||
*/ | |||||
/*#define USE_HAL_DRIVER */ | |||||
#endif /* USE_HAL_DRIVER */ | |||||
/** | |||||
* @brief CMSIS Device version number | |||||
*/ | |||||
#define __STM32WBxx_CMSIS_VERSION_MAIN (0x01U) /*!< [31:24] main version */ | |||||
#define __STM32WBxx_CMSIS_VERSION_SUB1 (0x0CU) /*!< [23:16] sub1 version */ | |||||
#define __STM32WBxx_CMSIS_VERSION_SUB2 (0x00U) /*!< [15:8] sub2 version */ | |||||
#define __STM32WBxx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ | |||||
#define __STM32WBxx_CMSIS_DEVICE_VERSION ((__STM32WBxx_CMSIS_VERSION_MAIN << 24)\ | |||||
|(__STM32WBxx_CMSIS_VERSION_SUB1 << 16)\ | |||||
|(__STM32WBxx_CMSIS_VERSION_SUB2 << 8 )\ | |||||
|(__STM32WBxx_CMSIS_VERSION_RC)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Device_Included | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32WB55xx) | |||||
#include "stm32wb55xx.h" | |||||
#elif defined(STM32WB5Mxx) | |||||
#include "stm32wb5mxx.h" | |||||
#elif defined(STM32WB50xx) | |||||
#include "stm32wb50xx.h" | |||||
#elif defined(STM32WB35xx) | |||||
#include "stm32wb35xx.h" | |||||
#elif defined(STM32WB30xx) | |||||
#include "stm32wb30xx.h" | |||||
#elif defined(STM32WB15xx) | |||||
#include "stm32wb15xx.h" | |||||
#elif defined(STM32WB10xx) | |||||
#include "stm32wb10xx.h" | |||||
#elif defined(STM32WB1Mxx) | |||||
#include "stm32wb1mxx.h" | |||||
#else | |||||
#error "Please select first the target STM32WBxx device used in your application, for instance xxx (in stm32wbxx.h file)" | |||||
#endif | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Exported_types | |||||
* @{ | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
RESET = 0, | |||||
SET = !RESET | |||||
} FlagStatus, ITStatus; | |||||
typedef enum | |||||
{ | |||||
DISABLE = 0, | |||||
ENABLE = !DISABLE | |||||
} FunctionalState; | |||||
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) | |||||
typedef enum | |||||
{ | |||||
SUCCESS = 0, | |||||
ERROR = !SUCCESS | |||||
} ErrorStatus; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Exported_macros | |||||
* @{ | |||||
*/ | |||||
#define SET_BIT(REG, BIT) ((REG) |= (BIT)) | |||||
#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) | |||||
#define READ_BIT(REG, BIT) ((REG) & (BIT)) | |||||
#define CLEAR_REG(REG) ((REG) = (0x0)) | |||||
#define WRITE_REG(REG, VAL) ((REG) = (VAL)) | |||||
#define READ_REG(REG) ((REG)) | |||||
#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) | |||||
/* Use of CMSIS compiler intrinsics for register exclusive access */ | |||||
/* Atomic 32-bit register access macro to set one or several bits */ | |||||
#define ATOMIC_SET_BIT(REG, BIT) \ | |||||
do { \ | |||||
uint32_t val; \ | |||||
do { \ | |||||
val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT); \ | |||||
} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
/* Atomic 32-bit register access macro to clear one or several bits */ | |||||
#define ATOMIC_CLEAR_BIT(REG, BIT) \ | |||||
do { \ | |||||
uint32_t val; \ | |||||
do { \ | |||||
val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT); \ | |||||
} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
/* Atomic 32-bit register access macro to clear and set one or several bits */ | |||||
#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \ | |||||
do { \ | |||||
uint32_t val; \ | |||||
do { \ | |||||
val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ | |||||
} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
/* Atomic 16-bit register access macro to set one or several bits */ | |||||
#define ATOMIC_SETH_BIT(REG, BIT) \ | |||||
do { \ | |||||
uint16_t val; \ | |||||
do { \ | |||||
val = __LDREXH((__IO uint16_t *)&(REG)) | (BIT); \ | |||||
} while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
/* Atomic 16-bit register access macro to clear one or several bits */ | |||||
#define ATOMIC_CLEARH_BIT(REG, BIT) \ | |||||
do { \ | |||||
uint16_t val; \ | |||||
do { \ | |||||
val = __LDREXH((__IO uint16_t *)&(REG)) & ~(BIT); \ | |||||
} while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
/* Atomic 16-bit register access macro to clear and set one or several bits */ | |||||
#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \ | |||||
do { \ | |||||
uint16_t val; \ | |||||
do { \ | |||||
val = (__LDREXH((__IO uint16_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ | |||||
} while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ | |||||
} while(0) | |||||
#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) | |||||
/** | |||||
* @} | |||||
*/ | |||||
#if defined (USE_HAL_DRIVER) | |||||
#include "stm32wbxx_hal.h" | |||||
#endif /* USE_HAL_DRIVER */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif /* __cplusplus */ | |||||
#endif /* __STM32WBxx_H */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ |
@@ -0,0 +1,372 @@ | |||||
/** | |||||
****************************************************************************** | |||||
* @file system_stm32wbxx.c | |||||
* @author MCD Application Team | |||||
* @brief CMSIS Cortex Device Peripheral Access Layer System Source File | |||||
* | |||||
* This file provides two functions and one global variable to be called from | |||||
* user application: | |||||
* - SystemInit(): This function is called at startup just after reset and | |||||
* before branch to main program. This call is made inside | |||||
* the "startup_stm32wbxx.s" file. | |||||
* | |||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used | |||||
* by the user application to setup the SysTick | |||||
* timer or configure other parameters. | |||||
* | |||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must | |||||
* be called whenever the core clock is changed | |||||
* during program execution. | |||||
* | |||||
* After each device reset the MSI (4 MHz) is used as system clock source. | |||||
* Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to | |||||
* configure the system clock before to branch to main program. | |||||
* | |||||
* This file configures the system clock as follows: | |||||
*============================================================================= | |||||
*----------------------------------------------------------------------------- | |||||
* System Clock source | MSI | |||||
*----------------------------------------------------------------------------- | |||||
* SYSCLK(Hz) | 4000000 | |||||
*----------------------------------------------------------------------------- | |||||
* HCLK(Hz) | 4000000 | |||||
*----------------------------------------------------------------------------- | |||||
* AHB Prescaler | 1 | |||||
*----------------------------------------------------------------------------- | |||||
* APB1 Prescaler | 1 | |||||
*----------------------------------------------------------------------------- | |||||
* APB2 Prescaler | 1 | |||||
*----------------------------------------------------------------------------- | |||||
* PLL_M | 1 | |||||
*----------------------------------------------------------------------------- | |||||
* PLL_N | 8 | |||||
*----------------------------------------------------------------------------- | |||||
* PLL_P | 7 | |||||
*----------------------------------------------------------------------------- | |||||
* PLL_Q | 2 | |||||
*----------------------------------------------------------------------------- | |||||
* PLL_R | 2 | |||||
*----------------------------------------------------------------------------- | |||||
* PLLSAI1_P | NA | |||||
*----------------------------------------------------------------------------- | |||||
* PLLSAI1_Q | NA | |||||
*----------------------------------------------------------------------------- | |||||
* PLLSAI1_R | NA | |||||
*----------------------------------------------------------------------------- | |||||
* Require 48MHz for USB OTG FS, | Disabled | |||||
* SDIO and RNG clock | | |||||
*----------------------------------------------------------------------------- | |||||
*============================================================================= | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* Copyright (c) 2019-2021 STMicroelectronics. | |||||
* All rights reserved. | |||||
* | |||||
* This software is licensed under terms that can be found in the LICENSE file | |||||
* in the root directory of this software component. | |||||
* If no LICENSE file comes with this software, it is provided AS-IS. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32WBxx_system | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32WBxx_System_Private_Includes | |||||
* @{ | |||||
*/ | |||||
#include "stm32wbxx.h" | |||||
#if !defined (HSE_VALUE) | |||||
#define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */ | |||||
#endif /* HSE_VALUE */ | |||||
#if !defined (MSI_VALUE) | |||||
#define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* MSI_VALUE */ | |||||
#if !defined (HSI_VALUE) | |||||
#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* HSI_VALUE */ | |||||
#if !defined (LSI_VALUE) | |||||
#define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/ | |||||
#endif /* LSI_VALUE */ | |||||
#if !defined (LSE_VALUE) | |||||
#if defined(STM32WB5Mxx) | |||||
#define LSE_VALUE 32774U /*!< Value of the LSE oscillator in Hz */ | |||||
#else | |||||
#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ | |||||
#endif /* STM32WB5Mxx */ | |||||
#endif /* LSE_VALUE */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_TypesDefinitions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_Defines | |||||
* @{ | |||||
*/ | |||||
/* Note: Following vector table addresses must be defined in line with linker | |||||
configuration. */ | |||||
/*!< Uncomment the following line if you need to relocate CPU1 CM4 and/or CPU2 | |||||
CM0+ vector table anywhere in Sram or Flash. Else vector table will be kept | |||||
at address 0x00 which correspond to automatic remap of boot address selected */ | |||||
/* #define USER_VECT_TAB_ADDRESS */ | |||||
#if defined(USER_VECT_TAB_ADDRESS) | |||||
/*!< Uncomment this line for user vector table remap in Sram else user remap | |||||
will be done in Flash. */ | |||||
/* #define VECT_TAB_SRAM */ | |||||
#if defined(VECT_TAB_SRAM) | |||||
#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base address field. | |||||
This value must be a multiple of 0x200. */ | |||||
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. | |||||
This value must be a multiple of 0x200. */ | |||||
#else | |||||
#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. | |||||
This value must be a multiple of 0x200. */ | |||||
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. | |||||
This value must be a multiple of 0x200. */ | |||||
#endif /* VECT_TAB_SRAM */ | |||||
#endif /* USER_VECT_TAB_ADDRESS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_Variables | |||||
* @{ | |||||
*/ | |||||
/* The SystemCoreClock variable is updated in three ways: | |||||
1) by calling CMSIS function SystemCoreClockUpdate() | |||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq() | |||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | |||||
Note: If you use this function to configure the system clock; then there | |||||
is no need to call the 2 first functions listed above, since SystemCoreClock | |||||
variable is updated automatically. | |||||
*/ | |||||
uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/ | |||||
const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL}; | |||||
const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL}; | |||||
const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \ | |||||
4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL | |||||
}; /* 0UL values are incorrect cases */ | |||||
#if defined(STM32WB55xx) || defined(STM32WB5Mxx) || defined(STM32WB35xx) || defined (STM32WB15xx) || defined (STM32WB1Mxx) | |||||
const uint32_t SmpsPrescalerTable[4UL][6UL] = {{1UL, 3UL, 2UL, 2UL, 1UL, 2UL}, \ | |||||
{2UL, 6UL, 4UL, 3UL, 2UL, 4UL}, \ | |||||
{4UL, 12UL, 8UL, 6UL, 4UL, 8UL}, \ | |||||
{4UL, 12UL, 8UL, 6UL, 4UL, 8UL} | |||||
}; | |||||
#endif /* STM32WB55xx || STM32WB5Mxx || STM32WB35xx || STM32WB15xx || STM32WB1Mxx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Private_Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Setup the microcontroller system. | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit(void) | |||||
{ | |||||
#if defined(USER_VECT_TAB_ADDRESS) | |||||
/* Configure the Vector Table location add offset address ------------------*/ | |||||
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; | |||||
#endif /* USER_VECT_TAB_ADDRESS */ | |||||
/* FPU settings ------------------------------------------------------------*/ | |||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | |||||
SCB->CPACR |= ((3UL << (10UL * 2UL)) | (3UL << (11UL * 2UL))); /* set CP10 and CP11 Full Access */ | |||||
#endif /* FPU */ | |||||
/* Reset the RCC clock configuration to the default reset state ------------*/ | |||||
/* Set MSION bit */ | |||||
RCC->CR |= RCC_CR_MSION; | |||||
/* Reset CFGR register */ | |||||
RCC->CFGR = 0x00070000U; | |||||
/* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */ | |||||
RCC->CR &= (uint32_t)0xFAF6FEFBU; | |||||
/*!< Reset LSI1 and LSI2 bits */ | |||||
RCC->CSR &= (uint32_t)0xFFFFFFFAU; | |||||
/*!< Reset HSI48ON bit */ | |||||
RCC->CRRCR &= (uint32_t)0xFFFFFFFEU; | |||||
/* Reset PLLCFGR register */ | |||||
RCC->PLLCFGR = 0x22041000U; | |||||
#if defined(STM32WB55xx) || defined(STM32WB5Mxx) | |||||
/* Reset PLLSAI1CFGR register */ | |||||
RCC->PLLSAI1CFGR = 0x22041000U; | |||||
#endif /* STM32WB55xx || STM32WB5Mxx */ | |||||
/* Reset HSEBYP bit */ | |||||
RCC->CR &= 0xFFFBFFFFU; | |||||
/* Disable all interrupts */ | |||||
RCC->CIER = 0x00000000; | |||||
} | |||||
/** | |||||
* @brief Update SystemCoreClock variable according to Clock Register Values. | |||||
* The SystemCoreClock variable contains the core clock (HCLK), it can | |||||
* be used by the user application to setup the SysTick timer or configure | |||||
* other parameters. | |||||
* | |||||
* @note Each time the core clock (HCLK) changes, this function must be called | |||||
* to update SystemCoreClock variable value. Otherwise, any configuration | |||||
* based on this variable will be incorrect. | |||||
* | |||||
* @note - The system frequency computed by this function is not the real | |||||
* frequency in the chip. It is calculated based on the predefined | |||||
* constant and the selected clock source: | |||||
* | |||||
* - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) | |||||
* | |||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) | |||||
* | |||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) | |||||
* | |||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) | |||||
* or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. | |||||
* | |||||
* (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value | |||||
* 4 MHz) but the real value may vary depending on the variations | |||||
* in voltage and temperature. | |||||
* | |||||
* (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | |||||
* 16 MHz) but the real value may vary depending on the variations | |||||
* in voltage and temperature. | |||||
* | |||||
* (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | |||||
* 32 MHz), user has to ensure that HSE_VALUE is same as the real | |||||
* frequency of the crystal used. Otherwise, this function may | |||||
* have wrong result. | |||||
* | |||||
* - The result of this function could be not correct when using fractional | |||||
* value for HSE crystal. | |||||
* | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemCoreClockUpdate(void) | |||||
{ | |||||
uint32_t tmp, msirange, pllvco, pllr, pllsource, pllm; | |||||
/* Get MSI Range frequency--------------------------------------------------*/ | |||||
/*MSI frequency range in Hz*/ | |||||
msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos]; | |||||
/* Get SYSCLK source -------------------------------------------------------*/ | |||||
switch (RCC->CFGR & RCC_CFGR_SWS) | |||||
{ | |||||
case 0x00: /* MSI used as system clock source */ | |||||
SystemCoreClock = msirange; | |||||
break; | |||||
case 0x04: /* HSI used as system clock source */ | |||||
/* HSI used as system clock source */ | |||||
SystemCoreClock = HSI_VALUE; | |||||
break; | |||||
case 0x08: /* HSE used as system clock source */ | |||||
SystemCoreClock = HSE_VALUE; | |||||
break; | |||||
case 0x0C: /* PLL used as system clock source */ | |||||
/* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN | |||||
SYSCLK = PLL_VCO / PLLR | |||||
*/ | |||||
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); | |||||
pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ; | |||||
if (pllsource == 0x02UL) /* HSI used as PLL clock source */ | |||||
{ | |||||
pllvco = (HSI_VALUE / pllm); | |||||
} | |||||
else if (pllsource == 0x03UL) /* HSE used as PLL clock source */ | |||||
{ | |||||
pllvco = (HSE_VALUE / pllm); | |||||
} | |||||
else /* MSI used as PLL clock source */ | |||||
{ | |||||
pllvco = (msirange / pllm); | |||||
} | |||||
pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); | |||||
pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL); | |||||
SystemCoreClock = pllvco / pllr; | |||||
break; | |||||
default: | |||||
SystemCoreClock = msirange; | |||||
break; | |||||
} | |||||
/* Compute HCLK clock frequency --------------------------------------------*/ | |||||
/* Get HCLK1 prescaler */ | |||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; | |||||
/* HCLK clock frequency */ | |||||
SystemCoreClock = SystemCoreClock / tmp; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ |
@@ -0,0 +1,111 @@ | |||||
/** | |||||
****************************************************************************** | |||||
* @file system_stm32wbxx.h | |||||
* @author MCD Application Team | |||||
* @brief CMSIS Cortex Device System Source File for STM32WBxx devices. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* Copyright (c) 2019-2021 STMicroelectronics. | |||||
* All rights reserved. | |||||
* | |||||
* This software is licensed under terms that can be found in the LICENSE file | |||||
* in the root directory of this software component. | |||||
* If no LICENSE file comes with this software, it is provided AS-IS. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32wbxx_system | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Define to prevent recursive inclusion | |||||
*/ | |||||
#ifndef __SYSTEM_STM32WBXX_H | |||||
#define __SYSTEM_STM32WBXX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
#include <stdint.h> | |||||
/** @addtogroup STM32WBxx_System_Includes | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Exported_types | |||||
* @{ | |||||
*/ | |||||
/* The SystemCoreClock variable is updated in three ways: | |||||
1) by calling CMSIS function SystemCoreClockUpdate() | |||||
2) by calling HAL API function HAL_RCC_GetSysClockFreq() | |||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | |||||
Note: If you use this function to configure the system clock; then there | |||||
is no need to call the 2 first functions listed above, since SystemCoreClock | |||||
variable is updated automatically. | |||||
*/ | |||||
extern uint32_t SystemCoreClock; /*!< System Clock Frequency */ | |||||
extern const uint32_t AHBPrescTable[16]; /*!< AHB prescalers table values */ | |||||
extern const uint32_t APBPrescTable[8]; /*!< APB prescalers table values */ | |||||
extern const uint32_t MSIRangeTable[16]; /*!< MSI ranges table values */ | |||||
#if defined(STM32WB55xx) || defined(STM32WB5Mxx) || defined(STM32WB35xx) || defined (STM32WB15xx) || defined (STM32WB1Mxx) | |||||
extern const uint32_t SmpsPrescalerTable[4][6]; /*!< SMPS factor ranges table values */ | |||||
#endif | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Exported_Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Exported_Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32WBxx_System_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
extern void SystemInit(void); | |||||
extern void SystemCoreClockUpdate(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /*__SYSTEM_STM32WBXX_H */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ |
@@ -13,12 +13,13 @@ string(APPEND CMAKE_C_FLAGS "-Os ") | |||||
string(APPEND CMAKE_C_FLAGS "-Wno-ignored-qualifiers ") | string(APPEND CMAKE_C_FLAGS "-Wno-ignored-qualifiers ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wall ") | string(APPEND CMAKE_C_FLAGS "-Wall ") | ||||
string(APPEND CMAKE_C_FLAGS "-Werror ") | string(APPEND CMAKE_C_FLAGS "-Werror ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wextra ") | |||||
string(APPEND CMAKE_C_FLAGS "-Wpedantic ") | |||||
#string(APPEND CMAKE_C_FLAGS "-Wextra ") | |||||
#string(APPEND CMAKE_C_FLAGS "-Wpedantic ") | |||||
string(APPEND CMAKE_C_FLAGS "-Wshadow ") | string(APPEND CMAKE_C_FLAGS "-Wshadow ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wno-variadic-macros ") | string(APPEND CMAKE_C_FLAGS "-Wno-variadic-macros ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wno-undef ") | string(APPEND CMAKE_C_FLAGS "-Wno-undef ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wunused-result ") | |||||
string(APPEND CMAKE_C_FLAGS "-Wno-unused ") | |||||
#string(APPEND CMAKE_C_FLAGS "-Wunused-result ") | |||||
string(APPEND CMAKE_C_FLAGS "-Wmissing-prototypes ") | string(APPEND CMAKE_C_FLAGS "-Wmissing-prototypes ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wvla ") | string(APPEND CMAKE_C_FLAGS "-Wvla ") | ||||
string(APPEND CMAKE_C_FLAGS "-Wredundant-decls ") | string(APPEND CMAKE_C_FLAGS "-Wredundant-decls ") | ||||
@@ -31,7 +32,7 @@ set(uEXAMPLE_SRC | |||||
${PROJECT_SOURCE_DIR}/src/common/crypto_hashblocks_sha512_inner32.s | ${PROJECT_SOURCE_DIR}/src/common/crypto_hashblocks_sha512_inner32.s | ||||
${PROJECT_SOURCE_DIR}/src/common/crypto_hashblocks_sha512.c | ${PROJECT_SOURCE_DIR}/src/common/crypto_hashblocks_sha512.c | ||||
${PROJECT_SOURCE_DIR}/src/common/randombytes.c | ${PROJECT_SOURCE_DIR}/src/common/randombytes.c | ||||
${PROJECT_SOURCE_DIR}/src/common/hal-stm32f4.c | |||||
#${PROJECT_SOURCE_DIR}/src/common/hal-stm32f4.c | |||||
${PROJECT_SOURCE_DIR}/src/saber/cbd.c | ${PROJECT_SOURCE_DIR}/src/saber/cbd.c | ||||
${PROJECT_SOURCE_DIR}/src/saber/kem.c | ${PROJECT_SOURCE_DIR}/src/saber/kem.c | ||||
${PROJECT_SOURCE_DIR}/src/saber/mul.S | ${PROJECT_SOURCE_DIR}/src/saber/mul.S | ||||
@@ -47,9 +48,10 @@ set(uEXAMPLE_SRC | |||||
add_library( | add_library( | ||||
uexample_obj OBJECT | uexample_obj OBJECT | ||||
${uEXAMPLE_SRC}) | ${uEXAMPLE_SRC}) | ||||
target_include_directories( | target_include_directories( | ||||
uexample_obj PRIVATE | uexample_obj PRIVATE | ||||
${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||||
#${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||||
${PROJECT_SOURCE_DIR}/src/common | ${PROJECT_SOURCE_DIR}/src/common | ||||
${PROJECT_SOURCE_DIR}/src/sabre) | ${PROJECT_SOURCE_DIR}/src/sabre) | ||||
@@ -61,17 +63,28 @@ add_executable( | |||||
target_include_directories( | target_include_directories( | ||||
uexample_test PRIVATE | uexample_test PRIVATE | ||||
${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||||
#${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||||
${PROJECT_SOURCE_DIR}/src/common | ${PROJECT_SOURCE_DIR}/src/common | ||||
${PROJECT_SOURCE_DIR}/src/saber) | ${PROJECT_SOURCE_DIR}/src/saber) | ||||
add_library( | |||||
cmsis STATIC | |||||
${PROJECT_SOURCE_DIR}/3rd/cmsis/startup_stm32wb55xx_cm4.s | |||||
${PROJECT_SOURCE_DIR}/3rd/cmsis/system_stm32wbxx.c) | |||||
target_compile_definitions( | |||||
cmsis PRIVATE STM32WB55xx) | |||||
target_include_directories( | |||||
cmsis PRIVATE | |||||
${PROJECT_SOURCE_DIR}/3rd/cmsis) | |||||
target_link_libraries( | target_link_libraries( | ||||
uexample_test PRIVATE | uexample_test PRIVATE | ||||
--static -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group | --static -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group | ||||
-T${PROJECT_SOURCE_DIR}/src/stm32f405x6.ld | |||||
-T${PROJECT_SOURCE_DIR}/3rd/cmsis/stm32wb55xx_flash_cm4.ld | |||||
-nostartfiles -Wl,--gc-sections | -nostartfiles -Wl,--gc-sections | ||||
-L${PROJECT_SOURCE_DIR}/3rd/libopencm3/lib -lm -lopencm3_stm32f4 | |||||
) | |||||
cmsis) | |||||
add_custom_command( | add_custom_command( | ||||
TARGET uexample_test POST_BUILD | TARGET uexample_test POST_BUILD | ||||
@@ -1,4 +1,5 @@ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#define UNUSED(x) (void)(x) | |||||
#ifndef HAL_H | #ifndef HAL_H | ||||
#define HAL_H | #define HAL_H | ||||
@@ -8,7 +9,11 @@ enum clock_mode { | |||||
CLOCK_BENCHMARK | CLOCK_BENCHMARK | ||||
}; | }; | ||||
void hal_setup(const enum clock_mode clock); | |||||
void hal_send_str(const char* in); | |||||
static void hal_setup(const enum clock_mode clock) { | |||||
UNUSED(clock); | |||||
} | |||||
static void hal_send_str(const char* in) { | |||||
UNUSED(in); | |||||
} | |||||
#endif | #endif |
@@ -1,5 +1,5 @@ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <libopencm3/stm32/rng.h> | |||||
//#include <libopencm3/stm32/rng.h> | |||||
#include "randombytes.h" | #include "randombytes.h" | ||||
//TODO Maybe we do not want to use the hardware RNG for all randomness, but instead only read a seed and then expand that using fips202. | //TODO Maybe we do not want to use the hardware RNG for all randomness, but instead only read a seed and then expand that using fips202. | ||||
@@ -14,19 +14,23 @@ int randombytes(uint8_t *obuf, size_t len) | |||||
while (len > 4) | while (len > 4) | ||||
{ | { | ||||
/* | |||||
random.asint = rng_get_random_blocking(); | random.asint = rng_get_random_blocking(); | ||||
*obuf++ = random.aschar[0]; | *obuf++ = random.aschar[0]; | ||||
*obuf++ = random.aschar[1]; | *obuf++ = random.aschar[1]; | ||||
*obuf++ = random.aschar[2]; | *obuf++ = random.aschar[2]; | ||||
*obuf++ = random.aschar[3]; | *obuf++ = random.aschar[3]; | ||||
len -= 4; | len -= 4; | ||||
*/ | |||||
} | } | ||||
if (len > 0) | if (len > 0) | ||||
{ | { | ||||
/* | |||||
for (random.asint = rng_get_random_blocking(); len > 0; --len) | for (random.asint = rng_get_random_blocking(); len > 0; --len) | ||||
{ | { | ||||
*obuf++ = random.aschar[len - 1]; | *obuf++ = random.aschar[len - 1]; | ||||
} | } | ||||
*/ | |||||
} | } | ||||
return 0; | return 0; | ||||