diff --git a/bsp/stm32f407ze/MDK-ARM/Pika_F407.uvprojx b/bsp/stm32f407ze/MDK-ARM/Pika_F407.uvprojx
index 187661ffb..a88f2d64e 100644
--- a/bsp/stm32f407ze/MDK-ARM/Pika_F407.uvprojx
+++ b/bsp/stm32f407ze/MDK-ARM/Pika_F407.uvprojx
@@ -10,7 +10,7 @@
Pika_F407
0x4
ARM-ADS
- 5060960::V5.06 update 7 (build 960)::.\ARMCC
+ 5060960::V5.06 update 7 (build 960)::.\AC5
0
diff --git a/bsp/stm32f407ze/PikaScript/requestment.txt b/bsp/stm32f407ze/PikaScript/requestment.txt
index f7301addb..5aad27417 100644
--- a/bsp/stm32f407ze/PikaScript/requestment.txt
+++ b/bsp/stm32f407ze/PikaScript/requestment.txt
@@ -1,2 +1,2 @@
pikascript-core==v1.11.7
-PikaStdLib==v1.11.7
+PikaStdLib==v1.11.7
\ No newline at end of file
diff --git a/bsp/stm32f407zg/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h b/bsp/stm32f407zg/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
index d3beea922..35ec65a6d 100644
--- a/bsp/stm32f407zg/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
+++ b/bsp/stm32f407zg/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
@@ -106,16 +106,16 @@
#endif /* USE_HAL_DRIVER */
/**
- * @brief CMSIS version number V2.6.6
+ * @brief CMSIS version number V2.6.7
*/
#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */
#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */
-#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x06U) /*!< [15:8] sub2 version */
+#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x07U) /*!< [15:8] sub2 version */
#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */
#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\
|(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\
|(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\
- |(__STM32F4xx_CMSIS_VERSION))
+ |(__STM32F4xx_CMSIS_VERSION_RC))
/**
* @}
@@ -225,6 +225,60 @@ typedef enum
#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL)))
+/* 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)
/**
* @}