|
STM32G474xx HAL用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal.c 00004 * @author MCD Application Team 00005 * @brief HAL模块驱动程序。 00006 * 这是HAL初始化的公共部分 00007 ****************************************************************************** 00008 * @attention 00009 * 00010 * Copyright (c) 2019 STMicroelectronics. 00011 * All rights reserved. 00012 * 00013 * This software is licensed under terms that can be found in the LICENSE file 00014 * in the root directory of this software component. 00015 * If no LICENSE file comes with this software, it is provided AS-IS. 00016 * 00017 ****************************************************************************** 00018 @verbatim 00019 ============================================================================== 00020 ##### 如何使用此驱动程序 ##### 00021 ============================================================================== 00022 [..] 00023 通用HAL驱动程序包含一组通用API,可供PPP外设驱动程序和用户使用以开始使用HAL。 00024 [..] 00025 HAL包含两类API: 00026 (+) 通用HAL API 00027 (+) 服务HAL API 00028 00029 @endverbatim 00031 ****************************************************************************** 00032 */ 00033 00034 /* Includes ------------------------------------------------------------------*/ 00035 #include "stm32g4xx_hal.h" 00036 00037 /** @addtogroup STM32G4xx_HAL_Driver 00038 * @{ 00039 */ 00040 00041 /** @defgroup HAL HAL 00042 * @brief HAL模块驱动程序 00043 * @{ 00044 */ 00045 00046 #ifdef HAL_MODULE_ENABLED 00047 00048 /* Private typedef -----------------------------------------------------------*/ 00049 /* Private define ------------------------------------------------------------*/ 00050 /** 00051 * @brief STM32G4xx HAL驱动程序版本号V1.2.6 00052 */ 00053 #define __STM32G4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] 主版本 */ 00054 #define __STM32G4xx_HAL_VERSION_SUB1 (0x02U) /*!< [23:16] 子版本1 */ 00055 #define __STM32G4xx_HAL_VERSION_SUB2 (0x06U) /*!< [15:8] 子版本2 */ 00056 #define __STM32G4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] 候选发布版本 */ 00057 #define __STM32G4xx_HAL_VERSION ((__STM32G4xx_HAL_VERSION_MAIN << 24U)\ 00058 |(__STM32G4xx_HAL_VERSION_SUB1 << 16U)\ 00059 |(__STM32G4xx_HAL_VERSION_SUB2 << 8U )\ 00060 |(__STM32G4xx_HAL_VERSION_RC)) 00061 00062 #if defined(VREFBUF) 00063 #define VREFBUF_TIMEOUT_VALUE 10U /* 10毫秒 */ 00064 #endif /* VREFBUF */ 00065 00066 /* ------------ SYSCFG寄存器位地址在别名区域 ------------ */ 00067 #define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) 00068 /* --- MEMRMP寄存器 ---*/ 00069 /* FB_MODE位的别名字地址 */ 00070 #define MEMRMP_OFFSET SYSCFG_OFFSET 00071 #define FB_MODE_BitNumber ((uint8_t)0x8) 00072 #define FB_MODE_BB (PERIPH_BB_BASE + (MEMRMP_OFFSET * 32) + (FB_MODE_BitNumber * 4)) 00073 00074 /* --- GPC寄存器 ---*/ 00075 /* CCMER位的别名字地址 */ 00076 #define SCSR_OFFSET (SYSCFG_OFFSET + 0x18) 00077 #define CCMER_BitNumber ((uint8_t)0x0) 00078 #define SCSR_CCMER_BB (PERIPH_BB_BASE + (SCSR_OFFSET * 32) + (CCMER_BitNumber * 4)) 00079 00080 /* Private macro -------------------------------------------------------------*/ 00081 /* Exported variables ---------------------------------------------------------*/ 00082 /** @defgroup HAL_Exported_Variables HAL导出的变量 00083 * @{ 00084 */ 00085 __IO uint32_t uwTick; 00086 uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* 无效的优先级 */ 00087 uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ 00088 /** 00089 * @} 00090 */ 00091 00092 /* Private function prototypes -----------------------------------------------*/ 00093 /* Exported functions --------------------------------------------------------*/ 00094 00095 /** @defgroup HAL_Exported_Functions HAL导出的函数 00096 * @{ 00097 */ 00098 00099 /** @defgroup HAL_Exported_Functions_Group1 初始化和反初始化函数 00100 * @brief HAL初始化和反初始化函数 00101 * 00102 @verbatim 00103 =============================================================================== 00104 ##### 初始化和配置函数 ##### 00105 =============================================================================== 00106 [..] 本节提供以下函数: 00107 (+) 初始化Flash接口、NVIC分配和初始时基时钟配置。 00108 时钟配置。 00109 (+) 反初始化HAL的公共部分。 00110 (+) 配置时基源以获得1ms时基,并具有专用的 00111 Tick中断优先级。 00112 (++) 默认情况下,SysTick定时器用作时基源,但用户 00113 最终可以实现自己的时基源(例如通用定时器 00114 或其他时间源),但须注意时基 00115 持续时间应保持为1ms,因为PPP_TIMEOUT_VALUE 00116 以毫秒为基础定义和处理。 00117 (++) 时基配置函数(HAL_InitTick())在程序开始时自动调用 00118 在HAL_Init()之后重置,或在任何时候 00119 当HAL_RCC_ClockConfig()配置时钟时调用。 00120 (++) 时基源配置为定期 生成中断。如果从 00122 外设ISR过程调用HAL_Delay(),则Tick中断线必须具有较高的优先级 00123 (数值上较低)比外设中断高。否则调用者 00124 ISR过程将被阻塞。 00125 (++) 影响时基配置的函数声明为__weak 00126 以便在用户文件中的其他实现中可以进行覆盖。 00127 @endverbatim 00128 * @{ 00129 */ 00130 00131 /** 00132 * @brief 此函数用于配置Flash预取、指令缓存和数据缓存, 00133 * 时基源、NVIC以及任何所需的全域低层硬件 00134 * 通过调用用户文件中可选定义的HAL_MspInit()回调函数 00135 * stm32g4xx_hal_msp.c。 00137 * 00137 * @note HAL_Init()函数在程序开始时调用,在重置之后、时钟配置之前。 00138 * 时钟配置之前调用。 00139 * 00140 * @note 在默认实现中,系统定时器(Systick)用作时基源。 00141 * Systick配置基于HSI时钟,因为HSI是时钟 00142 * 系统复位后使用的时钟,NVIC配置设置为优先级组4。 00143 * 完成后,时基滴答开始递增:在SysTick_Handler()中断处理程序中 00144 * 每1ms递增一次滴答变量计数器。 00145 * 00146 * @retval HAL状态 00147 */ 00148 HAL_StatusTypeDef HAL_Init(void) 00149 { 00150 HAL_StatusTypeDef status = HAL_OK; 00151 /* 配置Flash预取、指令缓存、数据缓存 */ 00152 /* 重置时的默认配置: */ 00153 /* - 预取禁用 */ 00154 /* - 指令缓存启用 */ 00155 /* - 数据缓存启用 */ 00156 #if (INSTRUCTION_CACHE_ENABLE == 0U) 00157 __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); 00158 #endif /* INSTRUCTION_CACHE_ENABLE */ 00159 00160 #if (DATA_CACHE_ENABLE == 0U) 00161 __HAL_FLASH_DATA_CACHE_DISABLE(); 00162 #endif /* DATA_CACHE_ENABLE */ 00163 00164 #if (PREFETCH_ENABLE != 0U) 00165 __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); 00166 #endif /* PREFETCH_ENABLE */ 00167 00168 /* 设置中断组优先级 */ 00169 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); 00170 00171 /* 使用SysTick作为时基源并配置1ms滴答(复位后的默认时钟为HSI) */ 00172 if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) 00173 { 00174 status = HAL_ERROR; 00175 } 00176 else 00177 { 00178 /* 初始化低层硬件 */ 00179 HAL_MspInit(); 00180 } 00181 00182 /* 返回函数状态 */ 00183 return status; 00185 00185 } 00186 00187 /** 00188 * @brief 此函数反初始化HAL的公共部分并停止时基源。 00189 * @note 此函数是可选的。 00190 * @retval HAL状态 00192 */ 00192 HAL_StatusTypeDef HAL_DeInit(void) 00193 { 00194 /* 重置所有外设 */ 00195 __HAL_RCC_APB1_FORCE_RESET();