|
106 | 106 | #endif /* USE_HAL_DRIVER */ |
107 | 107 |
|
108 | 108 | /** |
109 | | - * @brief CMSIS version number V2.6.6 |
| 109 | + * @brief CMSIS version number V2.6.7 |
110 | 110 | */ |
111 | 111 | #define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ |
112 | 112 | #define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ |
113 | | -#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x06U) /*!< [15:8] sub2 version */ |
| 113 | +#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x07U) /*!< [15:8] sub2 version */ |
114 | 114 | #define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ |
115 | 115 | #define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ |
116 | 116 | |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ |
117 | 117 | |(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ |
118 | | - |(__STM32F4xx_CMSIS_VERSION)) |
| 118 | + |(__STM32F4xx_CMSIS_VERSION_RC)) |
119 | 119 |
|
120 | 120 | /** |
121 | 121 | * @} |
@@ -225,6 +225,60 @@ typedef enum |
225 | 225 |
|
226 | 226 | #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) |
227 | 227 |
|
| 228 | +/* Use of CMSIS compiler intrinsics for register exclusive access */ |
| 229 | +/* Atomic 32-bit register access macro to set one or several bits */ |
| 230 | +#define ATOMIC_SET_BIT(REG, BIT) \ |
| 231 | + do { \ |
| 232 | + uint32_t val; \ |
| 233 | + do { \ |
| 234 | + val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT); \ |
| 235 | + } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ |
| 236 | + } while(0) |
| 237 | + |
| 238 | +/* Atomic 32-bit register access macro to clear one or several bits */ |
| 239 | +#define ATOMIC_CLEAR_BIT(REG, BIT) \ |
| 240 | + do { \ |
| 241 | + uint32_t val; \ |
| 242 | + do { \ |
| 243 | + val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT); \ |
| 244 | + } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ |
| 245 | + } while(0) |
| 246 | + |
| 247 | +/* Atomic 32-bit register access macro to clear and set one or several bits */ |
| 248 | +#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \ |
| 249 | + do { \ |
| 250 | + uint32_t val; \ |
| 251 | + do { \ |
| 252 | + val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ |
| 253 | + } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \ |
| 254 | + } while(0) |
| 255 | + |
| 256 | +/* Atomic 16-bit register access macro to set one or several bits */ |
| 257 | +#define ATOMIC_SETH_BIT(REG, BIT) \ |
| 258 | + do { \ |
| 259 | + uint16_t val; \ |
| 260 | + do { \ |
| 261 | + val = __LDREXH((__IO uint16_t *)&(REG)) | (BIT); \ |
| 262 | + } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ |
| 263 | + } while(0) |
| 264 | + |
| 265 | +/* Atomic 16-bit register access macro to clear one or several bits */ |
| 266 | +#define ATOMIC_CLEARH_BIT(REG, BIT) \ |
| 267 | + do { \ |
| 268 | + uint16_t val; \ |
| 269 | + do { \ |
| 270 | + val = __LDREXH((__IO uint16_t *)&(REG)) & ~(BIT); \ |
| 271 | + } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ |
| 272 | + } while(0) |
| 273 | + |
| 274 | +/* Atomic 16-bit register access macro to clear and set one or several bits */ |
| 275 | +#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \ |
| 276 | + do { \ |
| 277 | + uint16_t val; \ |
| 278 | + do { \ |
| 279 | + val = (__LDREXH((__IO uint16_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \ |
| 280 | + } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \ |
| 281 | + } while(0) |
228 | 282 |
|
229 | 283 | /** |
230 | 284 | * @} |
|
0 commit comments