Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c (19261B)
1 /** 2 ****************************************************************************** 3 * @file stm32f1xx_hal_cortex.c 4 * @author MCD Application Team 5 * @brief CORTEX HAL module driver. 6 * This file provides firmware functions to manage the following 7 * functionalities of the CORTEX: 8 * + Initialization and de-initialization functions 9 * + Peripheral Control functions 10 * 11 @verbatim 12 ============================================================================== 13 ##### How to use this driver ##### 14 ============================================================================== 15 16 [..] 17 *** How to configure Interrupts using CORTEX HAL driver *** 18 =========================================================== 19 [..] 20 This section provides functions allowing to configure the NVIC interrupts (IRQ). 21 The Cortex-M3 exceptions are managed by CMSIS functions. 22 23 (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() 24 function according to the following table. 25 (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). 26 (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). 27 (#) please refer to programming manual for details in how to configure priority. 28 29 -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. 30 The pending IRQ priority will be managed only by the sub priority. 31 32 -@- IRQ priority order (sorted by highest to lowest priority): 33 (+@) Lowest preemption priority 34 (+@) Lowest sub priority 35 (+@) Lowest hardware priority (IRQ number) 36 37 [..] 38 *** How to configure Systick using CORTEX HAL driver *** 39 ======================================================== 40 [..] 41 Setup SysTick Timer for time base. 42 43 (+) The HAL_SYSTICK_Config()function calls the SysTick_Config() function which 44 is a CMSIS function that: 45 (++) Configures the SysTick Reload register with value passed as function parameter. 46 (++) Configures the SysTick IRQ priority to the lowest value 0x0F. 47 (++) Resets the SysTick Counter register. 48 (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). 49 (++) Enables the SysTick Interrupt. 50 (++) Starts the SysTick Counter. 51 52 (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro 53 __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the 54 HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined 55 inside the stm32f1xx_hal_cortex.h file. 56 57 (+) You can change the SysTick IRQ priority by calling the 58 HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function 59 call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. 60 61 (+) To adjust the SysTick time base, use the following formula: 62 63 Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) 64 (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function 65 (++) Reload Value should not exceed 0xFFFFFF 66 67 @endverbatim 68 ****************************************************************************** 69 * @attention 70 * 71 * Copyright (c) 2017 STMicroelectronics. 72 * All rights reserved. 73 * 74 * This software is licensed under terms that can be found in the LICENSE file in 75 * the root directory of this software component. 76 * If no LICENSE file comes with this software, it is provided AS-IS. 77 * 78 ****************************************************************************** 79 */ 80 81 /* Includes ------------------------------------------------------------------*/ 82 #include "stm32f1xx_hal.h" 83 84 /** @addtogroup STM32F1xx_HAL_Driver 85 * @{ 86 */ 87 88 /** @defgroup CORTEX CORTEX 89 * @brief CORTEX HAL module driver 90 * @{ 91 */ 92 93 #ifdef HAL_CORTEX_MODULE_ENABLED 94 95 /* Private types -------------------------------------------------------------*/ 96 /* Private variables ---------------------------------------------------------*/ 97 /* Private constants ---------------------------------------------------------*/ 98 /* Private macros ------------------------------------------------------------*/ 99 /* Private functions ---------------------------------------------------------*/ 100 /* Exported functions --------------------------------------------------------*/ 101 102 /** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions 103 * @{ 104 */ 105 106 107 /** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions 108 * @brief Initialization and Configuration functions 109 * 110 @verbatim 111 ============================================================================== 112 ##### Initialization and de-initialization functions ##### 113 ============================================================================== 114 [..] 115 This section provides the CORTEX HAL driver functions allowing to configure Interrupts 116 Systick functionalities 117 118 @endverbatim 119 * @{ 120 */ 121 122 123 /** 124 * @brief Sets the priority grouping field (preemption priority and subpriority) 125 * using the required unlock sequence. 126 * @param PriorityGroup: The priority grouping bits length. 127 * This parameter can be one of the following values: 128 * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority 129 * 4 bits for subpriority 130 * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority 131 * 3 bits for subpriority 132 * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority 133 * 2 bits for subpriority 134 * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority 135 * 1 bits for subpriority 136 * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority 137 * 0 bits for subpriority 138 * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. 139 * The pending IRQ priority will be managed only by the subpriority. 140 * @retval None 141 */ 142 void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) 143 { 144 /* Check the parameters */ 145 assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); 146 147 /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ 148 NVIC_SetPriorityGrouping(PriorityGroup); 149 } 150 151 /** 152 * @brief Sets the priority of an interrupt. 153 * @param IRQn: External interrupt number. 154 * This parameter can be an enumerator of IRQn_Type enumeration 155 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xx.h)) 156 * @param PreemptPriority: The preemption priority for the IRQn channel. 157 * This parameter can be a value between 0 and 15 158 * A lower priority value indicates a higher priority 159 * @param SubPriority: the subpriority level for the IRQ channel. 160 * This parameter can be a value between 0 and 15 161 * A lower priority value indicates a higher priority. 162 * @retval None 163 */ 164 void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) 165 { 166 uint32_t prioritygroup = 0x00U; 167 168 /* Check the parameters */ 169 assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); 170 assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); 171 172 prioritygroup = NVIC_GetPriorityGrouping(); 173 174 NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); 175 } 176 177 /** 178 * @brief Enables a device specific interrupt in the NVIC interrupt controller. 179 * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() 180 * function should be called before. 181 * @param IRQn External interrupt number. 182 * This parameter can be an enumerator of IRQn_Type enumeration 183 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 184 * @retval None 185 */ 186 void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) 187 { 188 /* Check the parameters */ 189 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 190 191 /* Enable interrupt */ 192 NVIC_EnableIRQ(IRQn); 193 } 194 195 /** 196 * @brief Disables a device specific interrupt in the NVIC interrupt controller. 197 * @param IRQn External interrupt number. 198 * This parameter can be an enumerator of IRQn_Type enumeration 199 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 200 * @retval None 201 */ 202 void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) 203 { 204 /* Check the parameters */ 205 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 206 207 /* Disable interrupt */ 208 NVIC_DisableIRQ(IRQn); 209 } 210 211 /** 212 * @brief Initiates a system reset request to reset the MCU. 213 * @retval None 214 */ 215 void HAL_NVIC_SystemReset(void) 216 { 217 /* System Reset */ 218 NVIC_SystemReset(); 219 } 220 221 /** 222 * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. 223 * Counter is in free running mode to generate periodic interrupts. 224 * @param TicksNumb: Specifies the ticks Number of ticks between two interrupts. 225 * @retval status: - 0 Function succeeded. 226 * - 1 Function failed. 227 */ 228 uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) 229 { 230 return SysTick_Config(TicksNumb); 231 } 232 /** 233 * @} 234 */ 235 236 /** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions 237 * @brief Cortex control functions 238 * 239 @verbatim 240 ============================================================================== 241 ##### Peripheral Control functions ##### 242 ============================================================================== 243 [..] 244 This subsection provides a set of functions allowing to control the CORTEX 245 (NVIC, SYSTICK, MPU) functionalities. 246 247 248 @endverbatim 249 * @{ 250 */ 251 252 #if (__MPU_PRESENT == 1U) 253 /** 254 * @brief Disables the MPU 255 * @retval None 256 */ 257 void HAL_MPU_Disable(void) 258 { 259 /* Make sure outstanding transfers are done */ 260 __DMB(); 261 262 /* Disable fault exceptions */ 263 SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; 264 265 /* Disable the MPU and clear the control register*/ 266 MPU->CTRL = 0U; 267 } 268 269 /** 270 * @brief Enable the MPU. 271 * @param MPU_Control: Specifies the control mode of the MPU during hard fault, 272 * NMI, FAULTMASK and privileged access to the default memory 273 * This parameter can be one of the following values: 274 * @arg MPU_HFNMI_PRIVDEF_NONE 275 * @arg MPU_HARDFAULT_NMI 276 * @arg MPU_PRIVILEGED_DEFAULT 277 * @arg MPU_HFNMI_PRIVDEF 278 * @retval None 279 */ 280 void HAL_MPU_Enable(uint32_t MPU_Control) 281 { 282 /* Enable the MPU */ 283 MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; 284 285 /* Enable fault exceptions */ 286 SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; 287 288 /* Ensure MPU setting take effects */ 289 __DSB(); 290 __ISB(); 291 } 292 293 /** 294 * @brief Enable the MPU Region. 295 * @retval None 296 */ 297 void HAL_MPU_EnableRegion(uint32_t RegionNumber) 298 { 299 /* Check the parameters */ 300 assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); 301 302 /* Set the Region number */ 303 MPU->RNR = RegionNumber; 304 305 /* Enable the Region */ 306 SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); 307 } 308 309 /** 310 * @brief Disable the MPU Region. 311 * @retval None 312 */ 313 void HAL_MPU_DisableRegion(uint32_t RegionNumber) 314 { 315 /* Check the parameters */ 316 assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); 317 318 /* Set the Region number */ 319 MPU->RNR = RegionNumber; 320 321 /* Disable the Region */ 322 CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); 323 } 324 325 /** 326 * @brief Initializes and configures the Region and the memory to be protected. 327 * @param MPU_Init: Pointer to a MPU_Region_InitTypeDef structure that contains 328 * the initialization and configuration information. 329 * @retval None 330 */ 331 void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) 332 { 333 /* Check the parameters */ 334 assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); 335 assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); 336 assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); 337 assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); 338 assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); 339 assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); 340 assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); 341 assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); 342 assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); 343 assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); 344 345 /* Set the Region number */ 346 MPU->RNR = MPU_Init->Number; 347 348 /* Disable the Region */ 349 CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); 350 351 /* Apply configuration */ 352 MPU->RBAR = MPU_Init->BaseAddress; 353 MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | 354 ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | 355 ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | 356 ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | 357 ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | 358 ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | 359 ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | 360 ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | 361 ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); 362 } 363 #endif /* __MPU_PRESENT */ 364 365 /** 366 * @brief Gets the priority grouping field from the NVIC Interrupt Controller. 367 * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) 368 */ 369 uint32_t HAL_NVIC_GetPriorityGrouping(void) 370 { 371 /* Get the PRIGROUP[10:8] field value */ 372 return NVIC_GetPriorityGrouping(); 373 } 374 375 /** 376 * @brief Gets the priority of an interrupt. 377 * @param IRQn: External interrupt number. 378 * This parameter can be an enumerator of IRQn_Type enumeration 379 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 380 * @param PriorityGroup: the priority grouping bits length. 381 * This parameter can be one of the following values: 382 * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority 383 * 4 bits for subpriority 384 * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority 385 * 3 bits for subpriority 386 * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority 387 * 2 bits for subpriority 388 * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority 389 * 1 bits for subpriority 390 * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority 391 * 0 bits for subpriority 392 * @param pPreemptPriority: Pointer on the Preemptive priority value (starting from 0). 393 * @param pSubPriority: Pointer on the Subpriority value (starting from 0). 394 * @retval None 395 */ 396 void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) 397 { 398 /* Check the parameters */ 399 assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); 400 /* Get priority for Cortex-M system or device specific interrupts */ 401 NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); 402 } 403 404 /** 405 * @brief Sets Pending bit of an external interrupt. 406 * @param IRQn External interrupt number 407 * This parameter can be an enumerator of IRQn_Type enumeration 408 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 409 * @retval None 410 */ 411 void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) 412 { 413 /* Check the parameters */ 414 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 415 416 /* Set interrupt pending */ 417 NVIC_SetPendingIRQ(IRQn); 418 } 419 420 /** 421 * @brief Gets Pending Interrupt (reads the pending register in the NVIC 422 * and returns the pending bit for the specified interrupt). 423 * @param IRQn External interrupt number. 424 * This parameter can be an enumerator of IRQn_Type enumeration 425 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 426 * @retval status: - 0 Interrupt status is not pending. 427 * - 1 Interrupt status is pending. 428 */ 429 uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) 430 { 431 /* Check the parameters */ 432 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 433 434 /* Return 1 if pending else 0 */ 435 return NVIC_GetPendingIRQ(IRQn); 436 } 437 438 /** 439 * @brief Clears the pending bit of an external interrupt. 440 * @param IRQn External interrupt number. 441 * This parameter can be an enumerator of IRQn_Type enumeration 442 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 443 * @retval None 444 */ 445 void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) 446 { 447 /* Check the parameters */ 448 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 449 450 /* Clear pending interrupt */ 451 NVIC_ClearPendingIRQ(IRQn); 452 } 453 454 /** 455 * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). 456 * @param IRQn External interrupt number 457 * This parameter can be an enumerator of IRQn_Type enumeration 458 * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h)) 459 * @retval status: - 0 Interrupt status is not pending. 460 * - 1 Interrupt status is pending. 461 */ 462 uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) 463 { 464 /* Check the parameters */ 465 assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); 466 467 /* Return 1 if active else 0 */ 468 return NVIC_GetActive(IRQn); 469 } 470 471 /** 472 * @brief Configures the SysTick clock source. 473 * @param CLKSource: specifies the SysTick clock source. 474 * This parameter can be one of the following values: 475 * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. 476 * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. 477 * @retval None 478 */ 479 void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) 480 { 481 /* Check the parameters */ 482 assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); 483 if (CLKSource == SYSTICK_CLKSOURCE_HCLK) 484 { 485 SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; 486 } 487 else 488 { 489 SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; 490 } 491 } 492 493 /** 494 * @brief This function handles SYSTICK interrupt request. 495 * @retval None 496 */ 497 void HAL_SYSTICK_IRQHandler(void) 498 { 499 HAL_SYSTICK_Callback(); 500 } 501 502 /** 503 * @brief SYSTICK callback. 504 * @retval None 505 */ 506 __weak void HAL_SYSTICK_Callback(void) 507 { 508 /* NOTE : This function Should not be modified, when the callback is needed, 509 the HAL_SYSTICK_Callback could be implemented in the user file 510 */ 511 } 512 513 /** 514 * @} 515 */ 516 517 /** 518 * @} 519 */ 520 521 #endif /* HAL_CORTEX_MODULE_ENABLED */ 522 /** 523 * @} 524 */ 525 526 /** 527 * @} 528 */ 529
