STM32G474xx HAL 用户手册
stm32g4xx_hal_flash_ramfunc.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_flash_ramfunc.c
00004   * @author  MCD Application Team
00005   * @brief   FLASH RAMFUNC 驱动程序。
00006   *          此文件提供应从内部 SRAM 执行的 Flash 固件函数
00007   *            + 运行模式下的 FLASH 掉电功能
00008   *            + FLASH DBANK 用户选项字节
00009   *
00010   *
00011   @verbatim
00012   ==============================================================================
00013                    ##### Flash RAM 函数 #####
00014   ==============================================================================
00015 
00016     *** ARM 编译器 ***
00017     --------------------
00018     [..] RAM 函数使用工具链选项定义。
00019          在 RAM 中执行的函数应位于单独的源模块中。使用 'Options for File' 对话框,您可以简单地将模块的 'Code / Const' 区域更改为物理 RAM 中的内存空间。
00020          可用的内存区域在 'Options for Target' 对话框的 'Target' 选项卡中声明。
00021 
00022     *** ICCARM 编译器 ***
00023     -----------------------
00024     [..] RAM 函数使用特定的工具链关键字 "__ramfunc" 定义。
00025 
00026     *** GNU 编译器 ***
00027     --------------------
00028     [..] RAM 函数使用特定的工具链属性 "__attribute__((section(".RamFunc")))" 定义。
00029 
00030   @endverbatim
00031   ******************************************************************************
00032   * @attention
00033   *
00034   * 版权所有 (c) 2019 意法半导体。
00035   * 保留所有权利。
00036   *
00037   * 本软件的许可条款可在本软件组件根目录的 LICENSE 文件中找到。
00038   * 如果本软件不附带 LICENSE 文件,则按原样提供。
00039   ******************************************************************************
00040   */
00041 
00042 /* 包含 ------------------------------------------------------------------*/
00043 #include "stm32g4xx_hal.h"
00044 
00045 /** @addtogroup STM32G4xx_HAL_Driver
00046   * @{
00047   */
00048 
00049 /** @defgroup FLASH_RAMFUNC FLASH_RAMFUNC
00050   * @brief 从 RAM 执行的 FLASH 函数
00051   * @{
00052   */
00053 
00054 #ifdef HAL_FLASH_MODULE_ENABLED
00055 
00056 /* 私有类型定义 -----------------------------------------------------------*/
00057 /* 私有定义 ------------------------------------------------------------*/
00058 /* 私有宏 -------------------------------------------------------------*/
00059 /* 私有变量 ---------------------------------------------------------*/
00060 /* 私有函数原型 -----------------------------------------------*/
00061 /* 导出函数 -------------------------------------------------------*/
00062 
00063 /** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH_RAMFUNC 导出函数
00064   * @{
00065   */
00066 
00067 /** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 外设特性函数
00068  *  @brief   数据传输函数
00069  *
00070 @verbatim
00071  ===============================================================================
00072                       ##### ramfunc 函数 #####
00073  ===============================================================================
00074     [..]
00075     本小节提供一组应从 RAM 执行的函数。
00076 
00077 @endverbatim
00078   * @{
00079   */
00080 
00081 /**
00082   * @brief  启用运行模式下的掉电功能
00083   * @note   此函数应从 SRAM 内存中调用和执行。
00084   * @retval None
00085   */
00086 __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableRunPowerDown(void)
00087 {
00088   /* 启用运行模式下的掉电功能*/
00089   __HAL_FLASH_POWER_DOWN_ENABLE();
00090 
00091   return HAL_OK;
00092 
00093 }
00094 
00095 /**
00096   * @brief  禁用运行模式下的掉电功能
00097   * @note   此函数应从 SRAM 内存中调用和执行。
00098   * @retval None
00099   */
00100 __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableRunPowerDown(void)
00101 {
00102   /* 禁用运行模式下的掉电功能*/
00103   __HAL_FLASH_POWER_DOWN_DISABLE();
00104 
00105   return HAL_OK;
00106 }
00107 
00108 #if defined (FLASH_OPTR_DBANK)
00109 /**
00110   * @brief  编程 FLASH DBANK 用户选项字节。
00111   *
00112   * @note   要配置用户选项字节,必须通过调用 HAL_FLASH_OB_Unlock() 函数清除选项锁定位 OPTLOCK。
00113   * @note   要修改 DBANK 选项字节,不应定义 PCROP 区域。
00114   *         要停用 PCROP,用户应执行 RDP 更改。
00115   *
00116   * @param  DBankConfig FLASH DBANK 用户选项字节值。
00117   *         此参数可以是以下值之一:
00118   *            @arg OB_DBANK_128_BITS: 具有 128 位数据的单库
00119   *            @arg OB_DBANK_64_BITS: 具有 64 位数据的双库
00120   *
00121   * @retval HAL_Status
00122   */
00123 __RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_OB_DBankConfig(uint32_t DBankConfig)
00124 {
00125   uint32_t count, reg;
00126   HAL_StatusTypeDef status = HAL_ERROR;
00127 
00128   /* 进程锁定 */
00129   __HAL_LOCK(&pFlash);
00130 
00131   /* 检查 PCROP 是否已禁用 */
00132   reg = FLASH->PCROP1SR;
00133   if (reg > FLASH->PCROP1ER)
00134   {
00135     reg = FLASH->PCROP2SR;
00136     if (reg > FLASH->PCROP2ER)
00137     {
00138       /* 禁用 Flash 预取 */
00139       __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
00140 
00141       if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != 0U)
00142       {
00143         /* 禁用 Flash 指令缓存 */
00144         __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
00145 
00146         /* 刷新 Flash 指令缓存 */
00147         __HAL_FLASH_INSTRUCTION_CACHE_RESET();
00148       }
00149 
00150       if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)
00151       {
00152         /* 禁用 Flash 数据缓存 */
00153         __HAL_FLASH_DATA_CACHE_DISABLE();
00154 
00155         /* 刷新 Flash 数据缓存 */
00156         __HAL_FLASH_DATA_CACHE_RESET();
00157       }
00158 
00159       /* 如有必要,禁用第一个库的 WRP 区域 A */
00160       reg = FLASH->WRP1AR;
00161       if (((reg & FLASH_WRP1AR_WRP1A_STRT) >> FLASH_WRP1AR_WRP1A_STRT_Pos) <=
00162           ((reg & FLASH_WRP1AR_WRP1A_END) >> FLASH_WRP1AR_WRP1A_END_Pos))
00163       {
00164         MODIFY_REG(FLASH->WRP1AR, (FLASH_WRP1AR_WRP1A_STRT | FLASH_WRP1AR_WRP1A_END), FLASH_WRP1AR_WRP1A_STRT);
00165       }
00166 
00167       /* 如有必要,禁用第一个库的 WRP 区域 B */
00168       reg = FLASH->WRP1BR;
00169       if (((reg & FLASH_WRP1BR_WRP1B_STRT) >> FLASH_WRP1BR_WRP1B_STRT_Pos) <=
00170           ((reg & FLASH_WRP1BR_WRP1B_END) >> FLASH_WRP1BR_WRP1B_END_Pos))
00171       {
00172         MODIFY_REG(FLASH->WRP1BR, (FLASH_WRP1BR_WRP1B_STRT | FLASH_WRP1BR_WRP1B_END), FLASH_WRP1BR_WRP1B_STRT);
00173       }
00174 
00175       /* 如有必要,禁用第二个库的 WRP 区域 A */
00176       reg = FLASH->WRP2AR;
00177       if (((reg & FLASH_WRP2AR_WRP2A_STRT) >> FLASH_WRP2AR_WRP2A_STRT_Pos) <=
00178           ((reg & FLASH_WRP2AR_WRP2A_END) >> FLASH_WRP2AR_WRP2A_END_Pos))
00179       {
00180         MODIFY_REG(FLASH->WRP2AR, (FLASH_WRP2AR_WRP2A_STRT | FLASH_WRP2AR_WRP2A_END), FLASH_WRP2AR_WRP2A_STRT);
00181       }
00182 
00183       /*