|
STM32G474xx HAL 用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal_flash.c 00004 * @author MCD Application Team 00005 * @brief FLASH HAL 模块驱动程序。 00006 * 此文件提供固件函数,用于管理内部 FLASH 存储器的以下功能: 00007 * + 编程操作函数 00008 * + 存储控制函数 00009 * + 外设错误函数 00010 * 00011 @verbatim 00012 ============================================================================== 00013 ##### FLASH 外设特性 ##### 00014 ============================================================================== 00015 00016 [..] Flash 存储器接口管理 CPU AHB I-Code 和 D-Code 对 Flash 存储器的访问。 00017 它实现了擦除和编程 Flash 存储器操作以及读写保护机制。 00018 00019 [..] Flash 存储器接口通过指令预取和缓存行系统加速代码执行。 00020 00021 [..] FLASH 主要特性: 00022 (+) Flash 存储器读操作 00023 (+) Flash 存储器编程/擦除操作 00024 (+) 读/写保护 00025 (+) 选项字节编程 00026 (+) I-Code 预取 00027 (+) I-Code 上的 32 个缓存行,每行 4*64 或 2*128 位 00028 (+) D-Code 上的 8 个缓存行,每行 4*64 或 2*128 位 00029 (+) 错误码纠正 (ECC):flash 中的数据为 72 位字 00030 (每个双字增加 8 位) 00031 00032 00033 ##### 如何使用此驱动程序 ##### 00034 ============================================================================== 00035 [..] 00036 此驱动程序提供函数和宏,用于配置和编程所有 STM32G4xx 器件的 FLASH 存储器。 00037 00038 (#) Flash 存储器 IO 编程函数: 00039 (++) 使用 HAL_FLASH_Unlock() 和 HAL_FLASH_Lock() 函数锁定和解锁 FLASH 接口 00040 (++) 编程函数:双字和快速编程(整行编程) 00041 (++) 有两种编程模式: 00042 (+++) 使用 HAL_FLASH_Program() 函数的轮询模式 00043 (+++) 使用 HAL_FLASH_Program_IT() 函数的中断模式 00044 00045 (#) 中断和标志管理函数: 00046 (++) 通过调用 HAL_FLASH_IRQHandler() 处理 FLASH 中断 00047 (++) 当 flash 操作完成时调用回调函数: 00048 一切正常时调用 HAL_FLASH_EndOfOperationCallback(),否则调用 00049 HAL_FLASH_OperationErrorCallback() 00050 (++) 通过调用 HAL_GetError() 获取错误标志状态 00051 00052 (#) 选项字节管理函数: 00053 (++) 使用 HAL_FLASH_OB_Unlock() 和 HAL_FLASH_OB_Lock() 函数锁定和解锁选项字节 00054 (++) 使用 HAL_FLASH_Launch() 函数启动选项字节的重新加载。 00055 在这种情况下,会生成复位 00056 00057 [..] 00058 除了这些函数之外,此驱动程序还包括一组宏,允许处理以下操作: 00059 (+) 设置延迟 00060 (+) 启用/禁用预取缓冲区 00061 (+) 启用/禁用指令缓存和数据缓存 00062 (+) 重置指令缓存和数据缓存 00063 (+) 在低功耗运行和睡眠模式下启用/禁用 Flash 掉电 00064 (+) 启用/禁用 Flash 中断 00065 (+) 监控 Flash 标志状态 00066 00067 @endverbatim 00068 ****************************************************************************** 00069 * @attention 00070 * 00071 * Copyright (c) 2019 STMicroelectronics. 00072 * 保留所有权利。 00073 * 00074 * 本软件根据可在本软件组件根目录中的 LICENSE 文件中找到的条款进行许可。 00075 * 如果此软件未附带 LICENSE 文件,则按原样提供。 00076 ****************************************************************************** 00077 */ 00078 00079 /* Includes ------------------------------------------------------------------*/ 00080 #include "stm32g4xx_hal.h" 00081 00082 /** @addtogroup STM32G4xx_HAL_Driver 00083 * @{ 00084 */ 00085 00086 /** @defgroup FLASH FLASH 00087 * @brief FLASH HAL 模块驱动程序 00088 * @{ 00089 */ 00090 00091 #ifdef HAL_FLASH_MODULE_ENABLED 00092 00093 /* Private typedef -----------------------------------------------------------*/ 00094 /* Private defines -----------------------------------------------------------*/ 00095 /** @defgroup FLASH_Private_Constants FLASH 私有常量 00096 * @{ 00097 */ 00098 #define FLASH_NB_DOUBLE_WORDS_IN_ROW 32 00099 /** 00100 * @} 00101 */ 00102 00103 /* Private macros ------------------------------------------------------------*/ 00104 /* Private variables ---------------------------------------------------------*/ 00105 /** @defgroup FLASH_Private_Variables FLASH 私有变量 00106 * @{ 00107 */ 00108 00109 /** 00110 * @brief 用于中断下编程/擦除扇区的变量 00111 */ 00112 FLASH_ProcessTypeDef pFlash = {.Lock = HAL_UNLOCKED, 00113 .ErrorCode = HAL_FLASH_ERROR_NONE, 00114 .ProcedureOnGoing = FLASH_PROC_NONE, 00115 .Address = 0U, 00116 .Bank = FLASH_BANK_1, 00117 .Page = 0U, 00118 .NbPagesToErase = 0U, 00119 .CacheToReactivate = FLASH_CACHE_DISABLED}; 00120 /** 00121 * @} 00122 */ 00123 00124 /* Private function prototypes -----------------------------------------------*/ 00125 /** @defgroup FLASH_Private_Functions FLASH 私有函数 00126 * @{ 00127 */ 00128 static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); 00129 static void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress); 00130 /** 00131 * @} 00132 */ 00133 00134 /* Exported functions --------------------------------------------------------*/ 00135 /** @defgroup FLASH_Exported_Functions FLASH 导出函数 00136 * @{ 00137 */ 00138 00139 /** @defgroup FLASH_Exported_Functions_Group1 编程操作函数 00140 * @brief 编程操作函数 00141 * 00142 @verbatim 00143 =============================================================================== 00144 ##### 编程操作函数 ##### 00145 =============================================================================== 00146 [..] 00147 此子部分提供一组函数,用于管理 FLASH 编程操作。 00148 00149 @endverbatim 00150 * @{ 00151 */ 00152 00153 /** 00154 * @brief 在指定地址编程双字或快速编程一行。 00155 * @param TypeProgram 指示在指定地址编程的方式。 00156 * 此参数可以是 @ref FLASH_Type_Program 的值。 00157 * @param Address 指定要编程的地址。 00158 * @param Data 指定要编程的数据。 00159 * 此参数是双字编程的数据,以及存储行快速编程数据的地址。 00160 * 00161 * @retval HAL_Status 00162 */ 00163 HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) 00164 { 00165 HAL_StatusTypeDef status; 00166 uint32_t prog_bit = 0; 00167 00168 /* 检查参数 */ 00169 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); 00170 00171 /* 进程已锁定 */ 00172 __HAL_LOCK(&pFlash); 00173 00174 /* 等待上一个操作完成 */ 00175 status =