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