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