1 /** 2 ****************************************************************************** 3 * @file stm32u5xx_hal_cortex.h 4 * @author MCD Application Team 5 * @brief Header file of CORTEX HAL module. 6 ****************************************************************************** 7 * @attention 8 * 9 * Copyright (c) 2021 STMicroelectronics. 10 * All rights reserved. 11 * 12 * This software component is licensed by ST under BSD 3-Clause license, 13 * the "License"; You may not use this file except in compliance with the 14 * License. You may obtain a copy of the License at: 15 * opensource.org/licenses/BSD-3-Clause 16 * 17 ****************************************************************************** 18 */ 19 20 /* Define to prevent recursive inclusion -------------------------------------*/ 21 #ifndef __STM32U5xx_HAL_CORTEX_H 22 #define __STM32U5xx_HAL_CORTEX_H 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 /* Includes ------------------------------------------------------------------*/ 29 #include "stm32u5xx_hal_def.h" 30 31 /** @addtogroup STM32U5xx_HAL_Driver 32 * @{ 33 */ 34 35 /** @defgroup CORTEX CORTEX 36 * @{ 37 */ 38 39 /* Exported types ------------------------------------------------------------*/ 40 /** @defgroup CORTEX_Exported_Types CORTEX Exported Types 41 * @{ 42 */ 43 44 /** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition 45 * @{ 46 */ 47 typedef struct 48 { 49 uint8_t Enable; /*!< Specifies the status of the region. 50 This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ 51 uint8_t Number; /*!< Specifies the index of the region to protect. 52 This parameter can be a value of @ref CORTEX_MPU_Region_Number */ 53 uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ 54 uint32_t LimitAddress; /*!< Specifies the limit address of the region to protect. */ 55 uint8_t AttributesIndex; /*!< Specifies the memory attributes index. 56 This parameter can be a value of @ref CORTEX_MPU_Attributes_Number */ 57 uint8_t AccessPermission; /*!< Specifies the region access permission type. This parameter 58 can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ 59 uint8_t DisableExec; /*!< Specifies the instruction access status. 60 This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ 61 uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. 62 This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ 63 } MPU_Region_InitTypeDef; 64 /** 65 * @} 66 */ 67 68 /** @defgroup CORTEX_MPU_Attributes_Initialization_Structure_definition MPU Attributes 69 * Initialization Structure Definition 70 * @{ 71 */ 72 typedef struct 73 { 74 uint8_t Number; /*!< Specifies the number of the memory attributes to configure. 75 This parameter can be a value of @ref CORTEX_MPU_Attributes_Number */ 76 77 uint8_t Attributes; /*!< Specifies the memory attributes value. Attributes This parameter 78 can be a combination of @ref CORTEX_MPU_Attributes */ 79 80 } MPU_Attributes_InitTypeDef; 81 /** 82 * @} 83 */ 84 85 86 /** 87 * @} 88 */ 89 90 /* Exported constants --------------------------------------------------------*/ 91 92 /** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants 93 * @{ 94 */ 95 96 /** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group 97 * @{ 98 */ 99 #define NVIC_PRIORITYGROUP_0 0x7U /*!< 0 bit for pre-emption priority, 100 4 bits for subpriority */ 101 #define NVIC_PRIORITYGROUP_1 0x6U /*!< 1 bit for pre-emption priority, 102 3 bits for subpriority */ 103 #define NVIC_PRIORITYGROUP_2 0x5U /*!< 2 bits for pre-emption priority, 104 2 bits for subpriority */ 105 #define NVIC_PRIORITYGROUP_3 0x4U /*!< 3 bits for pre-emption priority, 106 1 bit for subpriority */ 107 #define NVIC_PRIORITYGROUP_4 0x3U /*!< 4 bits for pre-emption priority, 108 0 bit for subpriority */ 109 /** 110 * @} 111 */ 112 113 /** @defgroup CORTEX_SysTick_clock_source CORTEX SysTick clock source 114 * @{ 115 */ 116 #define SYSTICK_CLKSOURCE_HCLK_DIV8 0x0U /*!< AHB clock divided by 8 selected as SysTick clock source */ 117 #define SYSTICK_CLKSOURCE_LSI 0x1U /*!< LSI clock selected as SysTick clock source */ 118 #define SYSTICK_CLKSOURCE_LSE 0x2U /*!< LSE clock selected as SysTick clock source */ 119 #define SYSTICK_CLKSOURCE_HCLK 0x4U /*!< AHB clock selected as SysTick clock source */ 120 /** 121 * @} 122 */ 123 124 /** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control CORTEX MPU HFNMI and PRIVILEGED Access control 125 * @{ 126 */ 127 #define MPU_HFNMI_PRIVDEF_NONE 0U 128 #define MPU_HARDFAULT_NMI 2U 129 #define MPU_PRIVILEGED_DEFAULT 4U 130 #define MPU_HFNMI_PRIVDEF 6U 131 /** 132 * @} 133 */ 134 135 /** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable 136 * @{ 137 */ 138 #define MPU_REGION_ENABLE 1U 139 #define MPU_REGION_DISABLE 0U 140 /** 141 * @} 142 */ 143 144 /** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access 145 * @{ 146 */ 147 #define MPU_INSTRUCTION_ACCESS_ENABLE 0U 148 #define MPU_INSTRUCTION_ACCESS_DISABLE 1U 149 /** 150 * @} 151 */ 152 153 /** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable 154 * @{ 155 */ 156 #define MPU_ACCESS_NOT_SHAREABLE 0U 157 #define MPU_ACCESS_OUTER_SHAREABLE 1U 158 #define MPU_ACCESS_INNER_SHAREABLE 3U 159 /** 160 * @} 161 */ 162 163 /** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes 164 * @{ 165 */ 166 #define MPU_REGION_PRIV_RW 0U 167 #define MPU_REGION_ALL_RW 1U 168 #define MPU_REGION_PRIV_RO 2U 169 #define MPU_REGION_ALL_RO 3U 170 /** 171 * @} 172 */ 173 174 /** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number 175 * @{ 176 */ 177 #define MPU_REGION_NUMBER0 0U 178 #define MPU_REGION_NUMBER1 1U 179 #define MPU_REGION_NUMBER2 2U 180 #define MPU_REGION_NUMBER3 3U 181 #define MPU_REGION_NUMBER4 4U 182 #define MPU_REGION_NUMBER5 5U 183 #define MPU_REGION_NUMBER6 6U 184 #define MPU_REGION_NUMBER7 7U 185 /** 186 * @} 187 */ 188 189 /** @defgroup CORTEX_MPU_Attributes_Number CORTEX MPU Memory Attributes Number 190 * @{ 191 */ 192 #define MPU_ATTRIBUTES_NUMBER0 0U 193 #define MPU_ATTRIBUTES_NUMBER1 1U 194 #define MPU_ATTRIBUTES_NUMBER2 2U 195 #define MPU_ATTRIBUTES_NUMBER3 3U 196 #define MPU_ATTRIBUTES_NUMBER4 4U 197 #define MPU_ATTRIBUTES_NUMBER5 5U 198 #define MPU_ATTRIBUTES_NUMBER6 6U 199 #define MPU_ATTRIBUTES_NUMBER7 7U 200 /** 201 * @} 202 */ 203 204 /** @defgroup CORTEX_MPU_Attributes CORTEX MPU Attributes 205 * @{ 206 */ 207 #define MPU_DEVICE_nGnRnE 0x0U /* Device, noGather, noReorder, noEarly acknowledge. */ 208 #define MPU_DEVICE_nGnRE 0x4U /* Device, noGather, noReorder, Early acknowledge. */ 209 #define MPU_DEVICE_nGRE 0x8U /* Device, noGather, Reorder, Early acknowledge. */ 210 #define MPU_DEVICE_GRE 0xCU /* Device, Gather, Reorder, Early acknowledge. */ 211 212 #define MPU_WRITE_THROUGH 0x0U /* Normal memory, write-through. */ 213 #define MPU_NOT_CACHEABLE 0x4U /* Normal memory, non-cacheable. */ 214 #define MPU_WRITE_BACK 0x4U /* Normal memory, write-back. */ 215 216 #define MPU_TRANSIENT 0x0U /* Normal memory, transient. */ 217 #define MPU_NON_TRANSIENT 0x8U /* Normal memory, non-transient. */ 218 219 #define MPU_NO_ALLOCATE 0x0U /* Normal memory, no allocate. */ 220 #define MPU_W_ALLOCATE 0x1U /* Normal memory, write allocate. */ 221 #define MPU_R_ALLOCATE 0x2U /* Normal memory, read allocate. */ 222 #define MPU_RW_ALLOCATE 0x3U /* Normal memory, read/write allocate. */ 223 224 /** 225 * @} 226 */ 227 228 /** 229 * @} 230 */ 231 232 /* Exported macros -----------------------------------------------------------*/ 233 /** @defgroup CORTEX_Exported_Macros CORTEX Exported Macros 234 * @{ 235 */ 236 #define OUTER(__ATTR__) ((__ATTR__) << 4U) 237 #define INNER_OUTER(__ATTR__) ((__ATTR__) | ((__ATTR__) << 4U)) 238 239 /** 240 * @} 241 */ 242 243 /* Exported functions --------------------------------------------------------*/ 244 /** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions 245 * @{ 246 */ 247 248 /** @defgroup CORTEX_Exported_Functions_Group1 Initialization and Configuration functions 249 * @brief Initialization and Configuration functions 250 * @{ 251 */ 252 /* Initialization and Configuration functions *****************************/ 253 void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); 254 void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); 255 void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); 256 void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); 257 void HAL_NVIC_SystemReset(void); 258 uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); 259 /** 260 * @} 261 */ 262 263 /** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions 264 * @brief Cortex control functions 265 * @{ 266 */ 267 /* Peripheral Control functions ***********************************************/ 268 uint32_t HAL_NVIC_GetPriorityGrouping(void); 269 void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *const pPreemptPriority, 270 uint32_t *const pSubPriority); 271 uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); 272 void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); 273 void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); 274 uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); 275 void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); 276 void HAL_SYSTICK_IRQHandler(void); 277 void HAL_SYSTICK_Callback(void); 278 279 void HAL_MPU_Enable(uint32_t MPU_Control); 280 void HAL_MPU_Disable(void); 281 void HAL_MPU_ConfigRegion(const MPU_Region_InitTypeDef *const pMPU_RegionInit); 282 void HAL_MPU_ConfigMemoryAttributes(const MPU_Attributes_InitTypeDef *const pMPU_AttributesInit); 283 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) 284 /* MPU_NS Control functions ***********************************************/ 285 void HAL_MPU_Enable_NS(uint32_t MPU_Control); 286 void HAL_MPU_Disable_NS(void); 287 void HAL_MPU_ConfigRegion_NS(const MPU_Region_InitTypeDef *const pMPU_RegionInit); 288 void HAL_MPU_ConfigMemoryAttributes_NS(const MPU_Attributes_InitTypeDef *const pMPU_AttributesInit); 289 #endif /* __ARM_FEATURE_CMSE */ 290 /** 291 * @} 292 */ 293 294 /** 295 * @} 296 */ 297 298 /* Private types -------------------------------------------------------------*/ 299 /* Private variables ---------------------------------------------------------*/ 300 /* Private constants ---------------------------------------------------------*/ 301 /* Private macros ------------------------------------------------------------*/ 302 /** @defgroup CORTEX_Private_Macros CORTEX Private Macros 303 * @{ 304 */ 305 #define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ 306 ((GROUP) == NVIC_PRIORITYGROUP_1) || \ 307 ((GROUP) == NVIC_PRIORITYGROUP_2) || \ 308 ((GROUP) == NVIC_PRIORITYGROUP_3) || \ 309 ((GROUP) == NVIC_PRIORITYGROUP_4)) 310 311 #define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < (1UL<<__NVIC_PRIO_BITS)) 312 313 #define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < (1UL<<__NVIC_PRIO_BITS)) 314 315 #define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) > SysTick_IRQn) 316 317 #define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_LSI) || \ 318 ((SOURCE) == SYSTICK_CLKSOURCE_LSE) || \ 319 ((SOURCE) == SYSTICK_CLKSOURCE_HCLK)|| \ 320 ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) 321 322 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) 323 #define IS_MPU_INSTANCE(INSTANCE) (((INSTANCE) == MPU) || ((INSTANCE) == MPU_NS)) 324 #endif /* __ARM_FEATURE_CMSE */ 325 326 #define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ 327 ((STATE) == MPU_REGION_DISABLE)) 328 329 #define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ 330 ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) 331 332 #define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_OUTER_SHAREABLE) || \ 333 ((STATE) == MPU_ACCESS_INNER_SHAREABLE) || \ 334 ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) 335 336 #define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_PRIV_RW) || \ 337 ((TYPE) == MPU_REGION_ALL_RW) || \ 338 ((TYPE) == MPU_REGION_PRIV_RO) || \ 339 ((TYPE) == MPU_REGION_ALL_RO)) 340 341 #define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ 342 ((NUMBER) == MPU_REGION_NUMBER1) || \ 343 ((NUMBER) == MPU_REGION_NUMBER2) || \ 344 ((NUMBER) == MPU_REGION_NUMBER3) || \ 345 ((NUMBER) == MPU_REGION_NUMBER4) || \ 346 ((NUMBER) == MPU_REGION_NUMBER5) || \ 347 ((NUMBER) == MPU_REGION_NUMBER6) || \ 348 ((NUMBER) == MPU_REGION_NUMBER7)) 349 350 #define IS_MPU_ATTRIBUTES_NUMBER(NUMBER) (((NUMBER) == MPU_ATTRIBUTES_NUMBER0) || \ 351 ((NUMBER) == MPU_ATTRIBUTES_NUMBER1) || \ 352 ((NUMBER) == MPU_ATTRIBUTES_NUMBER2) || \ 353 ((NUMBER) == MPU_ATTRIBUTES_NUMBER3) || \ 354 ((NUMBER) == MPU_ATTRIBUTES_NUMBER4) || \ 355 ((NUMBER) == MPU_ATTRIBUTES_NUMBER5) || \ 356 ((NUMBER) == MPU_ATTRIBUTES_NUMBER6) || \ 357 ((NUMBER) == MPU_ATTRIBUTES_NUMBER7)) 358 359 /** 360 * @} 361 */ 362 363 /* Private functions ---------------------------------------------------------*/ 364 365 /** 366 * @} 367 */ 368 369 /** 370 * @} 371 */ 372 373 #ifdef __cplusplus 374 } 375 #endif 376 377 #endif /* __STM32U5xx_HAL_CORTEX_H */ 378 379 380