|
STM32G474xx HAL用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_ hal_flash_ex.c 00004 * @author MCD应用团队 00005 * @brief 扩展FLASH HAL模块驱动。 00006 * 本文件提供固件函数,用于管理FLASH扩展外设的以下功能: 00007 * + 扩展编程操作函数 00008 * 00009 @endverbatim 00010 ============================================================================== 00011 ##### Flash扩展功能 ##### 00012 ============================================================================== 00013 00014 [..] 与其他旧设备相比,STM32G4xx设备的FLASH接口包含以下附加功能 00015 00016 (+) 容量高达512 Kbytes,采用双bank架构,支持读-while-写 00017 能力(RWW) 00018 (+) 双bank 64位存储器组织,可配置为单bank 128位 00019 (+) 保护区包括WRP、PCROP和安全存储器 00020 00021 ##### 如何使用此驱动 ##### 00022 ============================================================================== 00023 [..] 本驱动提供函数用于配置和编程所有STM32G4xx设备的FLASH存储器。包含以下功能: 00024 (#) Flash存储器擦除函数: 00025 (++) 使用HAL_ FLASH_ Unlock()和 00026 HAL_ FLASH_ Lock()函数锁定和解锁FLASH接口 00027 (++) 擦除函数:擦除页面或整片擦除bank 00028 (++) 有两种擦除模式: 00029 (+++) 轮询模式使用HAL_ FLASHEx_ Erase() 00030 (+++) 中断模式使用HAL_ FLASHEx_ Erase_ IT() 00031 00032 (#) 选项字节编程函数:使用HAL_ FLASHEx_ OBProgram()来: 00033 (++) 配置写保护区(WRP) 00034 (++) 设置读保护级别(RDP) 00035 (++) 编程用户选项字节 00036 (++) 配置专有代码读出保护区(PCROP) 00037 (++) 配置安全存储器区 00038 (++) 配置启动锁 00039 00040 (#) 获取选项字节配置函数:使用HAL_ FLASHEx_ OBGetConfig()来: 00041 (++) 获取写保护区(WRP)的配置 00042 (++) 获取读保护级别(RDP) 00043 (++) 获取用户选项字节的值 00044 (++) 获取专有代码读出保护区(PCROP)的配置 00045 (++) 获取安全存储器区的配置 00046 (++) 获取启动锁的状态 00047 00048 (#) 安全存储器区激活:使用HAL_ FLASHEx_ EnableSecMemProtection() 00049 (++) 拒绝访问安全存储器区 00050 00051 (#) 启用或禁用调试器:使用HAL_ FLASHEx_ EnableDebugger()或 00052 HAL_ FLASHEx_ DisableDebugger() 00053 00054 @endverbatim 00055 ****************************************************************************** 00056 * @attention 00057 * 00058 * 版权所有(c) 2019 STMicroelectronics. 00059 * 保留所有权利。 00060 * 00061 * 本软件按照可在LICENSE文件中找到的条款授权,您可以在我 00062 * 的软件组件的根目录中找到该文件。 00063 * 如果本软件未附带LICENSE文件,则按原样提供。 00064 ****************************************************************************** 00065 */ 00066 00067 /* 头文件包含 ------------------------------------------------------------------*/ 00068 #include "stm32g4xx_hal.h" 00069 00070 /** @addtogroup STM32G4xx_ HAL_驱动 00071 * @{ 00072 */ 00073 00074 /** @defgroup FLASHEx FLASHEx 00075 * @brief FLASH扩展HAL模块驱动 00076 * @{ 00077 */ 00078 00079 #ifdef HAL_ FLASH_ MODULE_ ENABLED 00080 00081 /* 私有类型定义 -----------------------------------------------------------*/ 00082 /* 私有常量定义 ------------------------------------------------------------*/ 00083 /* 私有宏定义 -------------------------------------------------------------*/ 00084 /* 私有变量定义 ---------------------------------------------------------*/ 00085 /* 私有函数原型 -----------------------------------------------*/ 00086 /** @defgroup FLASHEx_私有函数 FLASHEx私有函数 00087 * @{ 00088 */ 00089 static void FLASH_ MassErase(uint32_t Banks); 00090 static HAL_StatusTypeDef FLASH_ OB_ WRPConfig(uint32_t WRPArea, uint32_t WRPStartOffset, uint32_t WRDPEndOffset); 00091 static HAL_StatusTypeDef FLASH_ OB_ RDPConfig(uint32_t RDPLevel); 00092 static HAL_StatusTypeDef FLASH_ OB_ UserConfig(uint32_t UserType, uint32_t UserConfig); 00093 static HAL_StatusTypeDef FLASH_ OB_ PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr); 00094 static void FLASH_ OB_ GetWRP(uint32_t WRPArea, uint32_t *WRPStartOffset, uint32_t *WRDPEndOffset); 00095 static uint32_t FLASH_ OB_ GetRDP(void); 00096 static uint32_t FLASH_ OB_ GetUser(void); 00097 static void FLASH_ OB_ GetPCROP(uint32_t *PCROPConfig, uint32_t *PCROPStartAddr, uint32_t *PCROPEndAddr); 00098 static HAL_StatusTypeDef FLASH_ OB_ SecMemConfig(uint32_t SecMemBank, uint32_t SecMemSize); 00099 static void FLASH_ OB_ GetSecMem(uint32_t SecMemBank, uint32_t *SecMemSize); 00100 static HAL_StatusTypeDef FLASH_ OB_ BootLockConfig(uint32_t BootLockConfig); 00101 static uint32_t FLASH_ OB_ GetBootLock(void); 00102 00103 /** 00104 * @} 00105 */ 00106 00107 /* 导出的函数 -------------------------------------------------------*/ 00108 /** @defgroup FLASHEx_导出的函数 FLASHEx导出的函数 00109 * @{ 00110 */ 00111 00112 /** @defgroup FLASHEx_导出的函数_组1 扩展IO操作函数 00113 * @brief 扩展IO操作函数 00114 * 00115 @verbatim 00116 =============================================================================== 00117 ##### 扩展编程操作函数 ##### 00118 =============================================================================== 00119 [..] 00120 本节提供一组函数用于管理扩展FLASH编程操作。 00121 00122 @endverbatim 00123 * @{ 00124 */ 00125 /** 00126 * @brief 执行整片擦除或擦除指定的FLASH存储器页面。 00127 * @param[in] pEraseInit 指向FLASH_ EraseInitTypeDef结构的指针,包含 00128 * 用于擦除的配置信息。 00129 * @param[out] PageError 指向变量的指针,在发生错误时包含 00130 * 错误页面的配置信息(0xFFFFFFFF表示所有 00131 * 页面都已正确擦除)。 00132 * @retval HAL_状态 00133 */ 00134 HAL_StatusTypeDef HAL_ FLASHEx_ Erase(FLASH_ EraseInitTypeDef *pEraseInit, uint32_t *PageError) 00135 { 00136 HAL_StatusTypeDef status; 00137 uint32_t page_ index; 00138 00139 /* 检查参数 */ 00140 assert_ param(IS_ FLASH_ TYPEERASE(pEraseInit->TypeErase)); 00141 00142 /* 处理锁定 */ 00143 __HAL_ LOCK(&pFlash); 00144 00145 /* 等待上一个操作完成 */ 00146 status = FLASH_ WaitForLastOperation((uint32_t)FLASH_ TIMEOUT_ VALUE); 00147 00148 if (status == HAL_ OK) 00149 { 00150 pFlash.ErrorCode = HAL_ FLASH_ ERROR_ NONE; 00151 00152 /* 如果缓存已激活则停用它以避免数据行为异常 */ 00153 if (READ_ BIT(FLASH->ACR, FLASH_ ACR_ ICEN) != 0U) 00154 { 00155 if (READ_ BIT(FLASH->ACR, FLASH_ ACR_ DCEN) != 0U) 00156 { 00157 /* 禁用数据缓存 */ 00158 __HAL_ FLASH_ DATA_ CACHE_ DISABLE(); 00159 pFlash.CacheToReactivate = FLASH_ CACHE_ ICACHE_ DCACHE_ ENABLED; 00160 } 00161 else 00162 { 00163 pFlash.CacheToReactivate = FLASH_ CACHE_ ICACHE_ ENABLED; 00164 } 00165 } 00166 else if (READ_ BIT(FLASH->ACR, FLASH_ ACR_ DCEN) != 0U) 00167 { 00168 /* 禁用数据缓存 */ 00169 __HAL_ FLASH_ DATA_ CACHE_ DISABLE(); 00170 pFlash.CacheToReactivate = FLASH_ CACHE_ DCACHE_ ENABLED; 00171 } 00172 else 00173 { 00174 pFlash.CacheToReactivate = FLASH_ CACHE_ DISABLED; 00175 } 00176 00177 if (pEraseInit->TypeErase == FLASH_ TYPEERASE_ MASSERASE) 00178 { 00179 /* 执行整片擦除 */ 00180 FLASH_ MassErase(pEraseInit->