STM32G474xx HAL用户手册
stm32g4xx_hal.c
跳转到此文件的文档。
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();