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