STM32G474xx HAL用户手册
stm32g4xx_ hal_flash_ex.c
转到此文件的文档。
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->