@@ -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 "-Wall ") | |||
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 "-Wno-variadic-macros ") | |||
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 "-Wvla ") | |||
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.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/kem.c | |||
${PROJECT_SOURCE_DIR}/src/saber/mul.S | |||
@@ -47,9 +48,10 @@ set(uEXAMPLE_SRC | |||
add_library( | |||
uexample_obj OBJECT | |||
${uEXAMPLE_SRC}) | |||
target_include_directories( | |||
uexample_obj PRIVATE | |||
${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||
#${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||
${PROJECT_SOURCE_DIR}/src/common | |||
${PROJECT_SOURCE_DIR}/src/sabre) | |||
@@ -61,17 +63,28 @@ add_executable( | |||
target_include_directories( | |||
uexample_test PRIVATE | |||
${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||
#${PROJECT_SOURCE_DIR}/3rd/libopencm3/include | |||
${PROJECT_SOURCE_DIR}/src/common | |||
${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( | |||
uexample_test PRIVATE | |||
--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 | |||
-L${PROJECT_SOURCE_DIR}/3rd/libopencm3/lib -lm -lopencm3_stm32f4 | |||
) | |||
cmsis) | |||
add_custom_command( | |||
TARGET uexample_test POST_BUILD | |||
@@ -1,4 +1,5 @@ | |||
#include <stdint.h> | |||
#define UNUSED(x) (void)(x) | |||
#ifndef HAL_H | |||
#define HAL_H | |||
@@ -8,7 +9,11 @@ enum clock_mode { | |||
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 |
@@ -1,5 +1,5 @@ | |||
#include <stdint.h> | |||
#include <libopencm3/stm32/rng.h> | |||
//#include <libopencm3/stm32/rng.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. | |||
@@ -14,19 +14,23 @@ int randombytes(uint8_t *obuf, size_t len) | |||
while (len > 4) | |||
{ | |||
/* | |||
random.asint = rng_get_random_blocking(); | |||
*obuf++ = random.aschar[0]; | |||
*obuf++ = random.aschar[1]; | |||
*obuf++ = random.aschar[2]; | |||
*obuf++ = random.aschar[3]; | |||
len -= 4; | |||
*/ | |||
} | |||
if (len > 0) | |||
{ | |||
/* | |||
for (random.asint = rng_get_random_blocking(); len > 0; --len) | |||
{ | |||
*obuf++ = random.aschar[len - 1]; | |||
} | |||
*/ | |||
} | |||
return 0; | |||