STM32G474xx HAL 用户手册
stm32g4xx_hal_sram.c
跳转到本文档的文件说明。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_sram.c
00004   * @author  MCD 应用团队
00005   * @brief   SRAM HAL 模块驱动程序。
00006   *          此文件提供了驱动用作外部设备的 SRAM 存储器的通用固件。
00007   *
00008   ******************************************************************************
00009   * @attention
00010   *
00011   * 版权所有 (c) 2019 STMicroelectronics。
00012   * 保留所有权利。
00013   *
00014   * 本软件根据可在本软件组件根目录的 LICENSE 文件中找到的条款进行许可。
00015   * 如果没有随附此软件的 LICENSE 文件,则按“原样”提供。
00016   *
00017   ******************************************************************************
00018   @verbatim
00019   ==============================================================================
00020                           ##### 如何使用此驱动程序 #####
00021   ==============================================================================
00022   [..]
00023     此驱动程序是一个通用的分层驱动程序,包含一组用于控制 SRAM 存储器的 API。
00024     它使用 FMC 层函数与 SRAM 设备进行接口。
00025     配置 FMC 以与 SRAM/PSRAM 存储器接口,应遵循以下顺序:
00026 
00027    (#) 声明一个 SRAM_HandleTypeDef 句柄结构,例如:
00028           SRAM_HandleTypeDef  hsram; 并且:
00029 
00030        (++) 使用结构成员允许的值填充 SRAM_HandleTypeDef 句柄的 "Init" 字段。
00031 
00032        (++) 使用 NOR 或 SRAM 设备的预定义基址寄存器实例填充 SRAM_HandleTypeDef 句柄的 "Instance" 字段。
00033 
00034        (++) 使用 NOR 或 SRAM 扩展模式的预定义基址寄存器实例填充 SRAM_HandleTypeDef 句柄的 "Extended" 字段。
00035 
00036    (#) 声明两个 FMC_NORSRAM_TimingTypeDef 结构,分别用于普通模式和扩展模式时序;例如:
00037           FMC_NORSRAM_TimingTypeDef  Timing 和 FMC_NORSRAM_TimingTypeDef  ExTiming;
00038       并使用结构成员允许的值填充其字段。
00039 
00040    (#) 通过调用函数 HAL_SRAM_Init() 初始化 SRAM 控制器。此函数
00041       执行以下顺序:
00042 
00043        (##) 使用函数 HAL_SRAM_MspInit() 进行 MSP 硬件层配置
00044        (##) 使用 FMC NORSRAM 接口函数 FMC_NORSRAM_Init() 进行控制寄存器配置
00045        (##) 使用 FMC NORSRAM 接口函数 FMC_NORSRAM_Timing_Init() 进行时序寄存器配置
00046        (##) 使用 FMC NORSRAM 接口函数 FMC_NORSRAM_Extended_Timing_Init() 进行扩展模式时序寄存器配置
00047        (##) 使用宏 __FMC_NORSRAM_ENABLE() 使能 SRAM 设备
00048 
00049    (#) 在此阶段,您可以对连接到 NOR/SRAM 存储体的存储器执行读/写访问。
00050       您可以使用以下 API 进行轮询或 DMA 传输:
00051        (++) HAL_SRAM_Read()/HAL_SRAM_Write() 用于轮询读/写访问
00052        (++) HAL_SRAM_Read_DMA()/HAL_SRAM_Write_DMA() 用于 DMA 读/写传输
00053 
00054    (#) 您还可以通过调用控制 API HAL_SRAM_WriteOperation_Enable()/
00055       HAL_SRAM_WriteOperation_Disable() 来控制 SRAM 设备,以分别使能/禁止 SRAM 写操作。
00056 
00557    (#) 您可以通过调用函数 HAL_SRAM_GetState() 持续监控 SRAM 设备的 HAL 状态。
00058 
00059        *** 回调注册 ***
00060     =============================================
00061     [..]
00062       编译定义 USE_HAL_SRAM_REGISTER_CALLBACKS 在设置为 1 时,允许用户动态配置驱动程序回调。
00063 
00064       使用函数 HAL_SRAM_RegisterCallback() 注册用户回调,
00065       它允许注册以下回调:
00066         (+) MspInitCallback    : SRAM MspInit。
00067         (+) MspDeInitCallback  : SRAM MspDeInit。
00068       此函数将 HAL 外设句柄、回调 ID 和指向用户回调函数的指针作为参数。
00069 
00070       使用函数 HAL_SRAM_UnRegisterCallback() 将回调重置为默认的弱(可重写)函数。
00071       它允许重置以下回调:
00072         (+) MspInitCallback    : SRAM MspInit。
00073         (+) MspDeInitCallback  : SRAM MspDeInit。
00074       此函数将 HAL 外设句柄和回调 ID 作为参数。
00075 
00076       默认情况下,在 HAL_SRAM_Init 之后,如果状态为 HAL_SRAM_STATE_RESET,
00077       所有回调都会重置为相应的传统弱(可重写)函数。
00078       但 MspInit 和 MspDeInit 回调例外,它们分别在 HAL_SRAM_Init
00079       和 HAL_SRAM_DeInit 中重置为传统的弱(可重写)函数,前提是这些回调为空(未预先注册)。
00080       如果不是,MspInit 或 MspDeInit 不为空,则 HAL_SRAM_Init 和 HAL_SRAM_DeInit
00081       将保留并使用用户预先注册的 MspInit/MspDeInit 回调。
00082 
00083       回调只能在 READY 状态下注册/注销。
00084       但 MspInit/MspDeInit 回调例外,它们可以在 READY 或 RESET 状态下注册/注销,
00085       因此已注册的(用户)MspInit/DeInit 回调可以在 Init/DeInit 期间使用。
00086       在这种情况下,在调用 HAL_SRAM_DeInit 或 HAL_SRAM_Init 函数之前,
00087       请先使用 HAL_SRAM_RegisterCallback 注册 MspInit/MspDeInit 用户回调。
00088 
00089       当编译定义 USE_HAL_SRAM_REGISTER_CALLBACKS 设置为 0 或未定义时,
00090       回调注册功能不可用,并使用弱(可重写)回调。
00091 
00092   @endverbatim
00093   ******************************************************************************
00094   */
00095 
00096 /* Includes ------------------------------------------------------------------*/
00097 #include "stm32g4xx_hal.h"
00098 
00099 #if defined(FMC_BANK1)
00100 
00101 /** @addtogroup STM32G4xx_HAL_Driver
00102   * @{
00103   */
00104 
00105 #ifdef HAL_SRAM_MODULE_ENABLED
00106 
00107 /** @defgroup SRAM SRAM
00108   * @brief SRAM 驱动程序模块
00109   * @{
00110   */
00111 
00112 /* Private typedef -----------------------------------------------------------*/
00113 /* Private define ------------------------------------------------------------*/
00114 /* Private macro -------------------------------------------------------------*/
00115 /* Private variables ---------------------------------------------------------*/
00116 /* Private function prototypes -----------------------------------------------*/
00117 /** @addtogroup SRAM_Private_Functions SRAM 私有函数
00118   * @{
00119   */
00120 static void SRAM_DMACplt(DMA_HandleTypeDef *hdma);
00121 static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma);
00122 static void SRAM_DMAError(DMA_HandleTypeDef *hdma);
00123 /**
00124   * @}
00125   */
00126 
00127 /* Exported functions --------------------------------------------------------*/
00128 
00129 /** @defgroup SRAM_Exported_Functions SRAM 导出函数
00130   * @{
00131   */
00132 
00133 /** @defgroup SRAM_Exported_Functions_Group1 初始化和反初始化函数
00134   * @brief    初始化和配置函数。
00135   *
00136   @verbatim
00137   ==============================================================================
00138            ##### SRAM 初始化和反初始化函数 #####
00139   ==============================================================================
00140     [..]  本节提供用于初始化/反初始化 SRAM 存储器的函数。
00141 
00142 @endverbatim
00143   * @{
00144   */
00145 
00146 /**
00147   * @brief  执行 SRAM 设备初始化序列
00148   * @param  hsram 指向包含 SRAM 模块配置信息的 SRAM_HandleTypeDef 结构的指针。
00149   * @param  Timing 指向 SRAM 控制时序结构的指针
00150   * @param  ExtTiming 指向 SRAM 扩展模式时序结构的指针
00151   * @retval HAL 状态
00152   */
00153 HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FMC_NORSRAM_TimingTypeDef *Timing,
00154                                 FMC_NORSRAM_TimingTypeDef *ExtTiming)
00155 {
00156   /* 检查 SRAM 句柄参数 */
00157   if (hsram == NULL)
00158   {
00159     return HAL_ERROR;
00160   }
00161 
00162   if (hsram->State == HAL_SRAM_STATE_RESET)
00163   {
00164     /* 分配锁资源并初始化 */
00165     hsram->Lock = HAL_UNLOCKED;
00166 
00167 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
00168     if (hsram->MspInitCallback == NULL)
00169     {
00170       hsram->MspInitCallback = HAL_SRAM_MspInit;
00171     }
00172     hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback;
00173     hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback;
00174 
00175     /* 初始化底层硬件 */
00176     hsram->MspInitCallback(hsram);
00177 #else
00178     /* 初始化底层硬件(MSP) */
00179     HAL_SRAM_MspInit(hsram);
00180 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
00181   }
00182 
00183   /* 初始化 SRAM 控制接口 */
00184   (void)FMC_NORSRAM_Init(hsram->Instance, &(hsram->Init));
00185 
00186   /* 初始化 SRAM 时序接口 */
00187   (void)FMC_NORSRAM_Timing_Init(hsram->Instance, Timing, hsram->Init.NSBank);
00188 
00189   /* 初始化 SRAM 扩展模式时序接口 */
00190   (void)FMC_NORSRAM_Extended_Timing_Init(hsram->Extended, ExtTiming, hsram->Init.NSBank,
00191                                          hsram->Init.ExtendedMode);
00192 
00193   /* 使能 NORSRAM 设备 */
00194   __FMC_NORSRAM_ENABLE(hsram->Instance, hsram->Init.NSBank);
00195 
00196   /* 初始化 SRAM 控制器状态 */
00197   hsram->State = HAL_SRAM_STATE_READY;
00198 
00199   return HAL_OK;
00200 }
00201 
00202 /**
00203   * @brief  执行 SRAM 设备反初始化序列。
00204   * @param  hsram 指向包含 SRAM 模块配置信息的 SRAM_HandleTypeDef 结构的指针。
00205   * @retval HAL 状态
00206   */
00207 HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram)
00208 {
00209 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
00210   if (hsram->MspDeInitCallback == NULL)
00211   {
00212     hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
00213   }
00214 
00215   /* 反初始化底层硬件 */
00216   hsram->MspDeInitCallback(hsram);
00217 #else