STM32G474xx HAL用户手册
stm32g4xx_hal_cortex.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_cortex.c
00004   * @author  MCD Application Team
00005   * @brief   CORTEX HAL模块驱动程序。
00006   *          本文件提供了固件功能来管理CORTEX的以下功能:
00007   *           + 初始化和配置功能
00008   *           + 外设控制功能
00009   *
00010   ******************************************************************************
00011   * @attention
00012   *
00013   * Copyright (c) 2019 STMicroelectronics.
00014   * All rights reserved.
00015   *
00016   * This software is licensed under terms that can be found in the LICENSE file
00017   * in the root directory of this software component.
00018   * If no LICENSE file comes with this software, it is provided AS-IS.
00019   *
00020   ******************************************************************************
00021   @verbatim
00022   ==============================================================================
00023                         ##### 如何使用此驱动程序 #####
00024   ==============================================================================
00026 
00027     [..]
00028     *** 如何使用CORTEX HAL驱动程序配置中断 ***
00029     ===========================================================
00030     [..]
00031     本节提供允许配置NVIC中断(IRQ)的功能。
00032     Cortex-M4异常由CMSIS函数管理。
00033 
00034     (#) 使用HAL_NVIC_SetPriorityGrouping()函数配置NVIC优先级分组。
00035     (#) 使用HAL_NVIC_SetPriority()配置所选IRQ通道的优先级。
00036     (#) 使用HAL_NVIC_EnableIRQ()使能所选IRQ通道。
00037 
00038      -@- 当选择NVIC_PRIORITYGROUP_0时,IRQ抢占不再可能。

00040          待处理IRQ优先级将仅由子优先级管理。
00041 
00042      -@- IRQ优先级顺序(从最高优先级到最低优先级排序):
00043         (+@) 最低抢占优先级
00044         (+@) 最低子优先级
00045         (+@) 最低硬件优先级(IRQ编号)
00046 
00047     [..]
00048     *** 如何使用CORTEX HAL驱动程序配置SysTick ***
00049     ========================================================
00050     [..]
00051     设置SysTick定时器作为时基。
00053 
00054    (+) HAL_SYSTICK_Config()函数调用SysTick_Config()函数,这是一个CMSIS函数:
00055         (++) 使用作为函数参数传递的值配置SysTick重装载寄存器。
00055         (++) 配置SysTick IRQ优先级为最低值(0x0F)。
00056         (++) 重置SysTick计数器寄存器。
00057         (++) 配置SysTick计数器时钟源为Core Clock Source(HCLK)。
00058         (++) 使能SysTick中断。
00059         (++) 启动SysTick计数器。
00060 
00061    (+) 您可以通过在HAL_SYSTICK_Config()函数调用后调用宏
00062        __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8)将SysTick时钟源更改为HCLK_Div8。
00063        __HAL_CORTEX_SYSTICKCLK_CONFIG()宏在stm32g4xx_hal_cortex.h文件中定义。
00064 
00065    (+) 您可以通过在HAL_SYSTICK_Config()函数调用后调用
00066        HAL_NVIC_SetPriority(SysTick_IRQn,...)函数来更改SysTick IRQ优先级。
00067        HAL_NVIC_SetPriority()调用NVIC_SetPriority()函数,这是一个CMSIS函数。
00068 
00069    (+) 要调整SysTick时基,使用以下公式:
00070 
00071        重装载值 = SysTick计数器时钟(Hz)x 期望时基(s)
00072        (++) 重装载值是HAL_SYSTICK_Config()函数的参数
00073        (++) 重装载值不应超过0xFFFFFF
00074 
00075   @endverbatim
00076   ******************************************************************************
00077 
00079   下表给出了根据HAL_NVIC_SetPriorityGrouping()函数执行的优先级分组配置,
00080   抢占优先级和子优先级的允许值。

00082     ==========================================================================================================================
00083       NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  |       描述
00084     ==========================================================================================================================
00085      NVIC_PRIORITYGROUP_0  |                0                  |            0-15             | 抢占优先级0位
00086                            |                                   |                             | 子优先级4位
00087     --------------------------------------------------------------------------------------------------------------------------
00088      NVIC_PRIORITYGROUP_1  |                0-1                |            0-7              | 抢占优先级1位
00089                            |                                   |                             | 子优先级3位
00090     --------------------------------------------------------------------------------------------------------------------------    
00091      NVIC_PRIORITYGROUP_2  |                0-3                |            0-3              | 抢占优先级2位
00092                            |                                   |                             | 子优先级2位
00093     --------------------------------------------------------------------------------------------------------------------------    
00094      NVIC_PRIORITYGROUP_3  |                0-7                |            0-1              | 抢占优先级3位
00095                            |                                   |                             | 子优先级1位
00096     --------------------------------------------------------------------------------------------------------------------------    
00097      NVIC_PRIORITYGROUP_4  |                0-15               |            0                | 抢占优先级4位
00098                            |                                   |                             | 子优先级0位                       
00099     ==========================================================================================================================
00100 
00101   */
 
00103 /* Includes ------------------------------------------------------------------*/
00104 #include "stm32g4xx_hal.h"
00105 
00106 /** @addtogroup STM32G4xx_HAL_Driver
00107   * @{
00108   */
00109 
00110 /** @addtogroup CORTEX
00111   * @{
00112   */
 
00114 #ifdef HAL_CORTEX_MODULE_ENABLED
00115 
00116 /* Private types -------------------------------------------------------------*/
00117 /* Private variables ---------------------------------------------------------*/
00118 /* Private constants ---------------------------------------------------------*/
00119 /* Private macros ------------------------------------------------------------*/
00120 /* Private functions ---------------------------------------------------------*/
00121 /* Exported functions --------------------------------------------------------*/
00122 
00123 /** @addtogroup CORTEX_Exported_Functions
00124   * @{
00125   */
 
00127 
00128 /** @addtogroup CORTEX_Exported_Functions_Group1
00129  *  @brief    初始化和配置功能
00130  *
00131 @verbatim
00132   ==============================================================================
00133               ##### 初始化和配置功能 #####
00134   ==============================================================================
00135     [..]
00136       本节提供CORTEX HAL驱动程序功能,允许配置中断
00137       SysTick功能
00138 
00139 @endverbatim
00140   * @{
00141   */
 
00143 
00144 /**
00145   * @brief  使用所需的解锁序列设置优先级分组字段(抢占优先级和子优先级)。
00147   * @param  PriorityGroup: 优先级分组位的位长度。
00148   *         此参数可以是以下值之一:
00149   *         @arg NVIC_PRIORITYGROUP_0: 抢占优先级0位,
00150   *                                    子优先级4位
00151   *         @arg NVIC_PRIORITYGROUP_1: 抢占优先级1位,
00152   *                                    子优先级3位
00153   *         @arg NVIC_PRIORITYGROUP_2: 抢占优先级2位,
00154   *                                    子优先级2位
00155   *         @arg NVIC_PRIORITYGROUP_3: 抢占优先级3位,
00156   *                                    子优先级1位
00157   *         @arg NVIC_PRIORITYGROUP_4: 抢占优先级4位,
00158   *                                    子优先级0位
00159   * @note   当选择NVIC_PriorityGroup_0时,IRQ抢占不再可能。
00160   *         待处理IRQ优先级将仅由子优先级管理。
00161   * @retval None
00162   */
00163 void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
00164 {
00165   /* Check the parameters */
00166   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
 
00168   /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
00169   NVIC_SetPriorityGrouping(PriorityGroup);
00170 }
00171 
00172 /**
00173   * @brief  设置中断的优先级。
00174   * @param  IRQn: 外部中断号。
00175   *         此参数可以是IRQn_Type枚举类型的枚举数
00176   *         (有关完整的STM32设备IRQ通道列表,请参阅相应的CMSIS设备文件(stm32g4xxxx.h))
00177   * @param  PreemptPriority: IRQn通道的抢占优先级。
00178   *         此参数可以是0到15之间的值
00179   *         较低的优先级值表示较高的优先级
00180   * @param  SubPriority: IRQ通道的子优先级级别。
00181   *         此参数可以是0到15之间的值
00182   *         较低的优先级值表示较高的优先级。
00183   * @retval None
00184   */
00185 void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
00186 {
00187   uint32_t prioritygroup;
 
00189   /* Check the parameters */
00190   assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
00191   assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
 
00193   prioritygroup = NVIC_GetPriorityGrouping();
 
00195   NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
00196 }
00197 
00198 /**
00199   * @brief  在NVIC中断控制器中使能设备特定的中断。
00200   * @note   要正确配置中断优先级,应先调用NVIC_PriorityGroupConfig()函数。
00201   * @param  IRQn 外部中断号。
00203   *         此参数可以是IRQn_Type枚举类型的枚举数
00204   *         (有关完整的STM32设备IRQ通道列表,请参阅相应的CMSIS设备文件(stm32g4xxxx.h))
00205   * @retval None
00206   */
00207 void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
00208 {
00209   /* Check the parameters */
00210   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
   
00212   /* Enable interrupt */
00213   NVIC_EnableIRQ(IRQn);
00214 }
00215 
00216 /**
00217   * @brief  在NVIC中断控制器中禁用设备特定的中断。
00218   * @param  IRQn 外部中断号。
00219   *         此参数可以是IRQn_Type枚举类型的枚举数
00220   *         (有关完整的STM32设备IRQ通道列表,请参阅相应的CMSIS设备文件(stm32g4xxxx.h))
00221   * @retval None
00223   */
00224 void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
00226 {
00227   /* Check the parameters */
00228   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
   
00230   /* Disable interrupt */
00231   NVIC_DisableIRQ(IRQn);