|
STM32G474xx HAL用户手册
|
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);