stm32h7xx_hal_flash_ex.h 32.7 KB
Newer Older
whj123999's avatar
whj123999 已提交
1 2 3 4 5 6 7 8
/**
  ******************************************************************************
  * @file    stm32H7xx_hal_flash_ex.h
  * @author  MCD Application Team
  * @brief   Header file of FLASH HAL module.
  ******************************************************************************
  * @attention
  *
9 10
  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics.
  * All rights reserved.</center></h2>
whj123999's avatar
whj123999 已提交
11
  *
12 13 14 15
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                       opensource.org/licenses/BSD-3-Clause
whj123999's avatar
whj123999 已提交
16 17 18 19 20
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
21 22
#ifndef STM32H7xx_HAL_FLASH_EX_H
#define STM32H7xx_HAL_FLASH_EX_H
whj123999's avatar
whj123999 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32h7xx_hal_def.h"

/** @addtogroup STM32H7xx_HAL_Driver
  * @{
  */

/** @addtogroup FLASHEx
  * @{
  */

39
/* Exported types ------------------------------------------------------------*/
whj123999's avatar
whj123999 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53
/** @defgroup FLASHEx_Exported_Types FLASH Exported Types
  * @{
  */

/**
  * @brief  FLASH Erase structure definition
  */
typedef struct
{
  uint32_t TypeErase;   /*!< Mass erase or sector Erase.
                             This parameter can be a value of @ref FLASHEx_Type_Erase */

  uint32_t Banks;       /*!< Select banks to erase when Mass erase is enabled.
                             This parameter must be a value of @ref FLASHEx_Banks */
54

whj123999's avatar
whj123999 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  uint32_t Sector;      /*!< Initial FLASH sector to erase when Mass erase is disabled
                             This parameter must be a value of @ref FLASH_Sectors */

  uint32_t NbSectors;   /*!< Number of sectors to be erased.
                             This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/

  uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism
                             This parameter must be a value of @ref FLASHEx_Voltage_Range */

} FLASH_EraseInitTypeDef;


/**
  * @brief  FLASH Option Bytes Program structure definition
  */
typedef struct
{
  uint32_t OptionType;   /*!< Option byte to be configured.
                              This parameter can be a value of @ref FLASHEx_Option_Type */

  uint32_t WRPState;     /*!< Write protection activation or deactivation.
                              This parameter can be a value of @ref FLASHEx_WRP_State */

  uint32_t WRPSector;    /*!< Specifies the sector(s) to be write protected.
                              The value of this parameter depend on device used within the same series */

  uint32_t RDPLevel;     /*!< Set the read protection level.
                              This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */

  uint32_t BORLevel;     /*!< Set the BOR Level.
                              This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */

  uint32_t USERType;       /*!< User option byte(s) to be configured (used for OPTIONBYTE_USER).
                                This parameter can be a combination of @ref FLASHEx_OB_USER_Type */

90 91 92
  uint32_t USERConfig;   /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY /
                              IWDG_FREEZE_STOP / IWDG_FREEZE_SANDBY / IO_HSLV / SWAP_BANK_OPT */

whj123999's avatar
whj123999 已提交
93
  uint32_t Banks;          /*!< Select banks for WRP , PCROP and secure area config .
94 95 96
                                This parameter must be a value of @ref FLASHEx_Banks */

  uint32_t PCROPConfig;    /*!< specifies if the PCROP area shall be erased or not
whj123999's avatar
whj123999 已提交
97 98 99 100 101
                                when RDP level decreased from Level 1 to Level 0 or during a mass erase.
                                This parameter must be a value of @ref FLASHEx_OB_PCROP_RDP enumeration */

  uint32_t PCROPStartAddr; /*!< PCROP Start address (used for OPTIONBYTE_PCROP).
                                This parameter must be a value between begin and end of a bank */
102

whj123999's avatar
whj123999 已提交
103 104 105
  uint32_t PCROPEndAddr;   /*!< PCROP End address (used for OPTIONBYTE_PCROP).
                                This parameter must be a value between PCROP Start address and end of a bank */

106
  uint32_t BootConfig;  /*!< Specifies if the Boot Address to be configured BOOT_ADD0, BOOT_ADD1
whj123999's avatar
whj123999 已提交
107 108 109 110 111 112 113
                                or both. This parameter must be a value of @ref FLASHEx_OB_BOOT_OPTION enumeration */

  uint32_t BootAddr0;   /*!< Boot Address 0.
                                This parameter must be a value between begin and end of a bank */

  uint32_t BootAddr1;   /*!< Boot Address 1.
                                This parameter must be a value between begin and end of a bank */
114 115 116 117 118 119 120 121 122 123 124 125 126
#if defined(DUAL_CORE)
  uint32_t CM4BootConfig;  /*!< specifies if the CM4 boot Address to be configured BOOT_ADD0, BOOT_ADD1
                                or both.
                                This parameter must be a value of @ref FLASHEx_OB_BOOT_OPTION enumeration */

  uint32_t CM4BootAddr0;   /*!< CM4 Boot Address 0.
                                This parameter must be a value between begin and end of a bank */

  uint32_t CM4BootAddr1;   /*!< CM4 Boot Address 1.
                                This parameter must be a value between begin and end of a bank */
#endif /*DUAL_CORE*/

  uint32_t SecureAreaConfig;  /*!< specifies if the bank secured area shall be erased or not
whj123999's avatar
whj123999 已提交
127 128 129 130
                                   when RDP level decreased from Level 1 to Level 0 or during a mass erase.
                                   This parameter must be a value of @ref FLASHEx_OB_SECURE_RDP enumeration */

  uint32_t SecureAreaStartAddr; /*!< Bank Secure area Start address.
131 132 133 134
                                     This parameter must be a value between begin address and end address of bank1 */

  uint32_t SecureAreaEndAddr;   /*!< Bank Secure area End address.
                                     This parameter must be a value between Secure Area Start address and end address of a bank1 */
whj123999's avatar
whj123999 已提交
135 136 137

} FLASH_OBProgramInitTypeDef;

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
/**
  * @brief  FLASH Erase structure definition
  */
typedef struct
{
  uint32_t TypeCRC;          /*!< CRC Selection Type.
                             This parameter can be a value of @ref FLASHEx_CRC_Selection_Type */

  uint32_t BurstSize;       /*!< CRC Burst Size.
                             This parameter can be a value of @ref FLASHEx_CRC_Burst_Size */

  uint32_t Bank;             /*!< Select bank where CRC computation is enabled.
                             This parameter must be FLASH_BANK_1 or FLASH_BANK_2 */

  uint32_t Sector;      /*!< Initial FLASH sector from which starts the CRC computation
                             This parameter must be a value of @ref FLASH_Sectors */

  uint32_t NbSectors;   /*!< Number of sectors to be computed.
                             This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/

  uint32_t CRCStartAddr; /*!< CRC Start address.
                              This parameter must be a value between begin address and end address of a bank */

  uint32_t CRCEndAddr;   /*!< CRC End address.
                              This parameter must be a value between CRC Start address and end address of a bank */

} FLASH_CRCInitTypeDef;

whj123999's avatar
whj123999 已提交
166 167 168 169 170 171 172 173 174 175 176
/**
  * @}
  */
/* Exported constants --------------------------------------------------------*/

/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants
  * @{
  */

/** @defgroup FLASHEx_Type_Erase FLASH Type Erase
  * @{
177 178 179
  */
#define FLASH_TYPEERASE_SECTORS      0x00U  /*!< Sectors erase only          */
#define FLASH_TYPEERASE_MASSERASE    0x01U  /*!< Flash Mass erase activation */
whj123999's avatar
whj123999 已提交
180 181 182
/**
  * @}
  */
183

whj123999's avatar
whj123999 已提交
184 185
/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range
  * @{
186 187 188 189 190
  */
#define FLASH_VOLTAGE_RANGE_1        0x00000000U       /*!< Flash program/erase by 8 bits  */
#define FLASH_VOLTAGE_RANGE_2        FLASH_CR_PSIZE_0  /*!< Flash program/erase by 16 bits */
#define FLASH_VOLTAGE_RANGE_3        FLASH_CR_PSIZE_1  /*!< Flash program/erase by 32 bits */
#define FLASH_VOLTAGE_RANGE_4        FLASH_CR_PSIZE    /*!< Flash program/erase by 64 bits */
whj123999's avatar
whj123999 已提交
191 192 193
/**
  * @}
  */
194

whj123999's avatar
whj123999 已提交
195 196
/** @defgroup FLASHEx_WRP_State FLASH WRP State
  * @{
197 198 199
  */
#define OB_WRPSTATE_DISABLE          0x00000000U  /*!< Disable the write protection of the desired bank 1 sectors */
#define OB_WRPSTATE_ENABLE           0x00000001U  /*!< Enable the write protection of the desired bank 1 sectors  */
whj123999's avatar
whj123999 已提交
200 201 202
/**
  * @}
  */
203

whj123999's avatar
whj123999 已提交
204 205
/** @defgroup FLASHEx_Option_Type FLASH Option Type
  * @{
206 207 208 209 210 211 212 213 214 215 216 217 218 219
  */
#define OPTIONBYTE_WRP           0x01U  /*!< WRP option byte configuration  */
#define OPTIONBYTE_RDP           0x02U  /*!< RDP option byte configuration  */
#define OPTIONBYTE_USER          0x04U  /*!< USER option byte configuration */
#define OPTIONBYTE_PCROP         0x08U  /*!< PCROP option byte configuration */
#define OPTIONBYTE_BOR           0x10U  /*!< BOR option byte configuration */
#define OPTIONBYTE_SECURE_AREA   0x20U  /*!< secure area option byte configuration */
#if defined(DUAL_CORE)
#define OPTIONBYTE_CM7_BOOTADD   0x40U  /*!< CM7 BOOT ADD option byte configuration */
#define OPTIONBYTE_CM4_BOOTADD   0x80U  /*!< CM4 BOOT ADD option byte configuration */
#define OPTIONBYTE_BOOTADD       OPTIONBYTE_CM7_BOOTADD  /*!< BOOT ADD option byte configuration */
#else /* Single core*/
#define OPTIONBYTE_BOOTADD       0x40U  /*!< BOOT ADD option byte configuration */
#endif /*DUAL_CORE*/
whj123999's avatar
whj123999 已提交
220 221 222
/**
  * @}
  */
223

whj123999's avatar
whj123999 已提交
224 225 226
/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection
  * @{
  */
227 228 229 230
#define OB_RDP_LEVEL_0       0xAA00U
#define OB_RDP_LEVEL_1       0x5500U
#define OB_RDP_LEVEL_2       0xCC00U   /*!< Warning: When enabling read protection level 2
                                            it s no more possible to go back to level 1 or 0 */
whj123999's avatar
whj123999 已提交
231 232
/**
  * @}
233 234
  */

whj123999's avatar
whj123999 已提交
235 236
/** @defgroup FLASHEx_Option_Bytes_WWatchdog FLASH Option Bytes WWatchdog
  * @{
237 238 239
  */
#define OB_WWDG_SW           0x10U  /*!< Software WWDG selected */
#define OB_WWDG_HW           0x00U  /*!< Hardware WWDG selected */
whj123999's avatar
whj123999 已提交
240 241
/**
  * @}
242 243
  */

whj123999's avatar
whj123999 已提交
244 245 246

/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog
  * @{
247 248 249
  */
#define OB_IWDG_SW           0x20U  /*!< Software IWDG selected */
#define OB_IWDG_HW           0x00U  /*!< Hardware IWDG selected */
whj123999's avatar
whj123999 已提交
250 251
/**
  * @}
252
  */
whj123999's avatar
whj123999 已提交
253 254 255

/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP
  * @{
256 257 258
  */
#define OB_STOP_NO_RST       0x40U /*!< No reset generated when entering in STOP */
#define OB_STOP_RST          0x00U /*!< Reset generated when entering in STOP    */
whj123999's avatar
whj123999 已提交
259 260
/**
  * @}
261
  */
whj123999's avatar
whj123999 已提交
262 263 264

/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY
  * @{
265 266 267
  */
#define OB_STDBY_NO_RST      0x80U /*!< No reset generated when entering in STANDBY */
#define OB_STDBY_RST         0x00U /*!< Reset generated when entering in STANDBY    */
whj123999's avatar
whj123999 已提交
268 269 270 271 272 273 274
/**
  * @}
  */

/** @defgroup FLASHEx_Option_Bytes_IWDG_FREEZE_STOP FLASH IWDG Counter Freeze in STOP
  * @{
  */
275 276
#define OB_IWDG_STOP_FREEZE      0x00000000U /*!< Freeze IWDG counter in STOP mode */
#define OB_IWDG_STOP_ACTIVE      FLASH_OPTSR_FZ_IWDG_STOP /*!< IWDG counter active in STOP mode */
whj123999's avatar
whj123999 已提交
277 278 279 280 281 282 283
/**
  * @}
  */

/** @defgroup FLASHEx_Option_Bytes_IWDG_FREEZE_SANDBY FLASH IWDG Counter Freeze in STANDBY
  * @{
  */
284 285
#define OB_IWDG_STDBY_FREEZE      0x00000000U /*!< Freeze IWDG counter in STANDBY mode */
#define OB_IWDG_STDBY_ACTIVE      FLASH_OPTSR_FZ_IWDG_SDBY  /*!< IWDG counter active in STANDBY mode */
whj123999's avatar
whj123999 已提交
286 287 288 289 290 291 292
/**
  * @}
  */

/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level
  * @{
  */
293 294 295 296
#define OB_BOR_LEVEL0          0x00000000U                /*!< Reset level threshold is set to 1.6V */
#define OB_BOR_LEVEL1          FLASH_OPTSR_BOR_LEV_0      /*!< Reset level threshold is set to 2.1V */
#define OB_BOR_LEVEL2          FLASH_OPTSR_BOR_LEV_1      /*!< Reset level threshold is set to 2.4V */
#define OB_BOR_LEVEL3          (FLASH_OPTSR_BOR_LEV_1 | FLASH_OPTSR_BOR_LEV_0) /*!< Reset level threshold is set to 2.7V  */
whj123999's avatar
whj123999 已提交
297 298 299 300 301 302 303 304 305
/**
  * @}
  */



/** @defgroup FLASHEx_Boot_Address FLASH Boot Address
  * @{
  */
306 307 308 309 310 311 312
#define OB_BOOTADDR_ITCM_RAM         0x0000U  /*!< Boot from ITCM RAM (0x00000000)                 */
#define OB_BOOTADDR_SYSTEM           0x0040U  /*!< Boot from System memory bootloader (0x00100000) */
#define OB_BOOTADDR_ITCM_FLASH       0x0080U  /*!< Boot from Flash on ITCM interface (0x00200000)  */
#define OB_BOOTADDR_AXIM_FLASH       0x2000U  /*!< Boot from Flash on AXIM interface (0x08000000)  */
#define OB_BOOTADDR_DTCM_RAM         0x8000U  /*!< Boot from DTCM RAM (0x20000000)                 */
#define OB_BOOTADDR_SRAM1            0x8004U  /*!< Boot from SRAM1 (0x20010000)                    */
#define OB_BOOTADDR_SRAM2            0x8013U  /*!< Boot from SRAM2 (0x2004C000)                    */
whj123999's avatar
whj123999 已提交
313 314 315
/**
  * @}
  */
316

whj123999's avatar
whj123999 已提交
317 318 319
/** @defgroup FLASH_Latency FLASH Latency
  * @{
  */
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
#define FLASH_LATENCY_0          FLASH_ACR_LATENCY_0WS   /*!< FLASH Zero Latency cycle      */
#define FLASH_LATENCY_1          FLASH_ACR_LATENCY_1WS   /*!< FLASH One Latency cycle       */
#define FLASH_LATENCY_2          FLASH_ACR_LATENCY_2WS   /*!< FLASH Two Latency cycles      */
#define FLASH_LATENCY_3          FLASH_ACR_LATENCY_3WS   /*!< FLASH Three Latency cycles    */
#define FLASH_LATENCY_4          FLASH_ACR_LATENCY_4WS   /*!< FLASH Four Latency cycles     */
#define FLASH_LATENCY_5          FLASH_ACR_LATENCY_5WS   /*!< FLASH Five Latency cycles     */
#define FLASH_LATENCY_6          FLASH_ACR_LATENCY_6WS   /*!< FLASH Six Latency cycles      */
#define FLASH_LATENCY_7          FLASH_ACR_LATENCY_7WS   /*!< FLASH Seven Latency cycles    */
#define FLASH_LATENCY_8          FLASH_ACR_LATENCY_8WS   /*!< FLASH Eight Latency cycle     */
#define FLASH_LATENCY_9          FLASH_ACR_LATENCY_9WS   /*!< FLASH Nine Latency cycle      */
#define FLASH_LATENCY_10         FLASH_ACR_LATENCY_10WS  /*!< FLASH Ten Latency cycles      */
#define FLASH_LATENCY_11         FLASH_ACR_LATENCY_11WS  /*!< FLASH Eleven Latency cycles   */
#define FLASH_LATENCY_12         FLASH_ACR_LATENCY_12WS  /*!< FLASH Twelve Latency cycles   */
#define FLASH_LATENCY_13         FLASH_ACR_LATENCY_13WS  /*!< FLASH Thirteen Latency cycles */
#define FLASH_LATENCY_14         FLASH_ACR_LATENCY_14WS  /*!< FLASH Fourteen Latency cycles */
#define FLASH_LATENCY_15         FLASH_ACR_LATENCY_15WS  /*!< FLASH Fifteen Latency cycles  */
whj123999's avatar
whj123999 已提交
336 337 338 339 340 341 342
/**
  * @}
  */

/** @defgroup FLASHEx_Banks FLASH Banks
  * @{
  */
343 344 345
#define FLASH_BANK_1          0x01U                         /*!< Bank 1   */
#define FLASH_BANK_2          0x02U                         /*!< Bank 2   */
#define FLASH_BANK_BOTH       (FLASH_BANK_1 | FLASH_BANK_2) /*!< Bank1 and Bank2  */
whj123999's avatar
whj123999 已提交
346 347 348 349 350 351 352
/**
  * @}
  */

/** @defgroup FLASHEx_OB_PCROP_RDP  FLASHEx OB PCROP RDP
  * @{
  */
353 354 355 356
#define OB_PCROP_RDP_NOT_ERASE    0x00000000U     /*!< PCROP area is not erased when the RDP level
                                                       is decreased from Level 1 to Level 0 or during a mass erase */
#define OB_PCROP_RDP_ERASE        FLASH_PRAR_DMEP /*!< PCROP area is erased when the RDP level is
                                                       decreased from Level 1 to Level 0 (full mass erase) */
whj123999's avatar
whj123999 已提交
357 358 359 360 361 362 363 364

/**
  * @}
  */

/** @defgroup FLASHEx_Option_Bytes_Write_Protection FLASH Option Bytes Write Protection
  * @{
  */
365 366 367 368 369 370 371 372 373
#define OB_WRP_SECTOR_0       0x00000001U /*!< Write protection of Sector0     */
#define OB_WRP_SECTOR_1       0x00000002U /*!< Write protection of Sector1     */
#define OB_WRP_SECTOR_2       0x00000004U /*!< Write protection of Sector2     */
#define OB_WRP_SECTOR_3       0x00000008U /*!< Write protection of Sector3     */
#define OB_WRP_SECTOR_4       0x00000010U /*!< Write protection of Sector4     */
#define OB_WRP_SECTOR_5       0x00000020U /*!< Write protection of Sector5     */
#define OB_WRP_SECTOR_6       0x00000040U /*!< Write protection of Sector6     */
#define OB_WRP_SECTOR_7       0x00000080U /*!< Write protection of Sector7     */
#define OB_WRP_SECTOR_All     0x000000FFU /*!< Write protection of all Sectors */
whj123999's avatar
whj123999 已提交
374 375 376 377 378 379 380
/**
  * @}
  */

/** @defgroup FLASHEx_OB_SECURITY  FLASHEx OB SECURITY
  * @{
  */
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
#define OB_SECURITY_DISABLE   0x00000000U             /*!< security enabled */
#define OB_SECURITY_ENABLE    FLASH_OPTSR_SECURITY    /*!< security disabled */
/**
  * @}
  */

/** @defgroup FLASHEx_OB_ST_RAM_SIZE  FLASHEx OB ST RAM SIZE
  * @{
  */
#define OB_ST_RAM_SIZE_2KB   0x00000000U               /*!< 2 Kbytes reserved to ST code */
#define OB_ST_RAM_SIZE_4KB   FLASH_OPTSR_ST_RAM_SIZE_0 /*!< 4 Kbytes reserved to ST code */
#define OB_ST_RAM_SIZE_8KB   FLASH_OPTSR_ST_RAM_SIZE_1 /*!< 8 Kbytes reserved to ST code */
#define OB_ST_RAM_SIZE_16KB  FLASH_OPTSR_ST_RAM_SIZE   /*!< 16 Kbytes reserved to ST code */
/**
  * @}
  */

#if defined(DUAL_CORE)
/** @defgroup FLASHEx_OB_BCM7  FLASHEx OB BCM7
  * @{
  */
#define OB_BCM7_DISABLE       0x00000000U              /*!< CM7 Boot disabled */
#define OB_BCM7_ENABLE        FLASH_OPTSR_BCM7         /*!< CM7 Boot enabled */
whj123999's avatar
whj123999 已提交
404 405 406

/**
  * @}
407
  */
whj123999's avatar
whj123999 已提交
408

409 410 411 412 413 414 415 416 417
/** @defgroup FLASHEx_OB_BCM4  FLASHEx OB BCM4
  * @{
  */
#define OB_BCM4_DISABLE       0x00000000U              /*!< CM4 Boot disabled */
#define OB_BCM4_ENABLE        FLASH_OPTSR_BCM4         /*!< CM4 Boot enabled */
/**
  * @}
  */
#endif /*DUAL_CORE*/
whj123999's avatar
whj123999 已提交
418 419 420 421

/** @defgroup FLASHEx_OB_IWDG1_SW  FLASHEx OB IWDG1 SW
  * @{
  */
422 423
#define OB_IWDG1_SW            FLASH_OPTSR_IWDG1_SW /*!< Hardware independent watchdog 1 */
#define OB_IWDG1_HW            0x00000000U          /*!< Software independent watchdog 1 */
whj123999's avatar
whj123999 已提交
424 425 426
/**
  * @}
  */
427 428 429

#if defined(DUAL_CORE)
/** @defgroup FLASHEx_OB_IWDG2_SW  FLASHEx OB IWDG2 SW
whj123999's avatar
whj123999 已提交
430 431
  * @{
  */
432 433 434 435 436 437
#define OB_IWDG2_SW            FLASH_OPTSR_IWDG2_SW  /*!< Hardware independent watchdog 2*/
#define OB_IWDG2_HW            0x00000000U           /*!< Software independent watchdog 2*/
/**
  * @}
  */
#endif
whj123999's avatar
whj123999 已提交
438

439 440 441 442 443
/** @defgroup FLASHEx_OB_NRST_STOP_D1  FLASHEx OB NRST STOP D1
  * @{
  */
#define OB_STOP_RST_D1         0x00000000U              /*!< Reset generated when entering the D1 to stop mode */
#define OB_STOP_NO_RST_D1      FLASH_OPTSR_NRST_STOP_D1 /*!< No reset generated when entering the D1 to stop mode */
whj123999's avatar
whj123999 已提交
444 445 446 447 448 449 450
/**
  * @}
  */

/** @defgroup FLASHEx_OB_NRST_STDBY_D1  FLASHEx OB NRST STDBY D1
  * @{
  */
451 452 453 454 455
#define OB_STDBY_RST_D1        0x00000000U              /*!< Reset generated when entering the D1 to standby mode */
#define OB_STDBY_NO_RST_D1     FLASH_OPTSR_NRST_STBY_D1 /*!< No reset generated when entering the D1 to standby mode */
/**
  * @}
  */
whj123999's avatar
whj123999 已提交
456

457 458 459 460 461 462
#if defined(DUAL_CORE)
/** @defgroup FLASHEx_OB_NRST_STOP_D2  FLASHEx OB NRST STOP D2
  * @{
  */
#define OB_STOP_RST_D2         0x00000000U              /*!< Reset generated when entering the D2 to stop mode */
#define OB_STOP_NO_RST_D2      FLASH_OPTSR_NRST_STOP_D2 /*!< No reset generated when entering the D2 to stop mode */
whj123999's avatar
whj123999 已提交
463 464 465 466
/**
  * @}
  */

467
/** @defgroup FLASHEx_OB_NRST_STDBY_D2  FLASHEx OB NRST STDBY D2
whj123999's avatar
whj123999 已提交
468 469
  * @{
  */
470 471 472 473 474 475
#define OB_STDBY_RST_D2        0x00000000U              /*!< Reset generated when entering the D2 to standby mode */
#define OB_STDBY_NO_RST_D2     FLASH_OPTSR_NRST_STBY_D2 /*!< No reset generated when entering the D2 to standby mode */
/**
  * @}
  */
#endif
whj123999's avatar
whj123999 已提交
476

477 478 479 480 481
/** @defgroup FLASHEx_OB_SWAP_BANK  FLASHEx OB SWAP BANK
  * @{
  */
#define OB_SWAP_BANK_DISABLE   0x00000000U               /*!< Bank swap disabled */
#define OB_SWAP_BANK_ENABLE    FLASH_OPTSR_SWAP_BANK_OPT /*!< Bank swap enabled */
whj123999's avatar
whj123999 已提交
482 483 484
/**
  * @}
  */
485

whj123999's avatar
whj123999 已提交
486 487 488
/** @defgroup FLASHEx_OB_IOHSLV FLASHEx OB IOHSLV
  * @{
  */
489 490
#define OB_IOHSLV_DISABLE     0x00000000U         /*!< IOHSLV disabled */
#define OB_IOHSLV_ENABLE      FLASH_OPTSR_IO_HSLV /*!< IOHSLV enabled */
whj123999's avatar
whj123999 已提交
491 492
/**
  * @}
493
  */
whj123999's avatar
whj123999 已提交
494 495 496 497

/** @defgroup FLASHEx_OB_BOOT_OPTION  FLASHEx OB BOOT OPTION
  * @{
  */
498 499 500
#define OB_BOOT_ADD0          0x01U       /*!< Select Boot Address 0 */
#define OB_BOOT_ADD1          0x02U       /*!< Select Boot Address 1 */
#define OB_BOOT_ADD_BOTH      0x03U       /*!< Select Boot Address 0 and 1 */
whj123999's avatar
whj123999 已提交
501 502 503
/**
  * @}
  */
504

whj123999's avatar
whj123999 已提交
505 506 507
 /** @defgroup FLASHEx_OB_USER_Type  FLASHEx OB USER Type
  * @{
  */
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
#define OB_USER_IWDG1_SW          0x0001U /*!< Independent watchdog selection */
#define OB_USER_NRST_STOP_D1      0x0002U /*!< Reset when entering Stop mode selection*/
#define OB_USER_NRST_STDBY_D1     0x0004U /*!< Reset when entering standby mode selection*/
#define OB_USER_IWDG_STOP         0x0008U /*!< Independent watchdog counter freeze in stop mode */
#define OB_USER_IWDG_STDBY        0x0010U /*!< Independent watchdog counter freeze in standby mode */
#define OB_USER_ST_RAM_SIZE       0x0020U /*!< dedicated DTCM Ram size selection */
#define OB_USER_SECURITY          0x0040U /*!< security selection */
#define OB_USER_IOHSLV            0x0080U /*!< IO HSLV selection */
#define OB_USER_SWAP_BANK         0x0100U /*!< Bank swap selection */
#if defined (DUAL_CORE)
#define OB_USER_IWDG2_SW          0x0200U /*!< Window watchdog selection */
#define OB_USER_BCM4              0x0400U /*!< CM4 boot selection */
#define OB_USER_BCM7              0x0800U /*!< CM7 boot selection */
#define OB_USER_NRST_STOP_D2      0x1000U /*!< Reset when entering Stop mode selection*/
#define OB_USER_NRST_STDBY_D2     0x2000U /*!< Reset when entering standby mode selection*/
#endif /*DUAL_CORE*/
whj123999's avatar
whj123999 已提交
524 525 526 527

/**
  * @}
  */
528

whj123999's avatar
whj123999 已提交
529 530 531
/** @defgroup FLASHEx_OB_SECURE_RDP  FLASHEx OB SECURE RDP
  * @{
  */
532 533 534 535 536 537 538 539
#define OB_SECURE_RDP_NOT_ERASE   0x00000000U     /*!< Secure area is not erased when the RDP level
                                                       is decreased from Level 1 to Level 0 or during a mass erase */
#define OB_SECURE_RDP_ERASE       FLASH_SCAR_DMES /*!< Secure area is erased when the RDP level is
                                                       decreased from Level 1 to Level 0 (full mass erase) */

/**
  * @}
  */
whj123999's avatar
whj123999 已提交
540

541 542 543 544 545 546
/** @defgroup FLASHEx_CRC_Selection_Type FLASH CRC Selection Type
  * @{
  */
#define FLASH_CRC_ADDR         0x00000000U              /*!< CRC selection type by address  */
#define FLASH_CRC_SECTORS      FLASH_CRCCR_CRC_BY_SECT  /*!< CRC selection type by sectors  */
#define FLASH_CRC_BANK         (FLASH_CRCCR_ALL_BANK | FLASH_CRCCR_CRC_BY_SECT) /*!< CRC selection type by bank */
whj123999's avatar
whj123999 已提交
547 548
/**
  * @}
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
  */

/** @defgroup FLASHEx_CRC_Burst_Size FLASH CRC Burst Size
  * @{
  */
#define FLASH_CRC_BURST_SIZE_4    0x00000000U              /*!< Every burst has a size of 4 Flash words (256-bit)  */
#define FLASH_CRC_BURST_SIZE_16   FLASH_CRCCR_CRC_BURST_0  /*!< Every burst has a size of 16 Flash words (256-bit)   */
#define FLASH_CRC_BURST_SIZE_64   FLASH_CRCCR_CRC_BURST_1  /*!< Every burst has a size of 64 Flash words (256-bit)   */
#define FLASH_CRC_BURST_SIZE_256  FLASH_CRCCR_CRC_BURST    /*!< Every burst has a size of 256 Flash words (256-bit) */
/**
  * @}
  */

/** @defgroup FLASHEx_Programming_Delay FLASH Programming Delay
  * @{
  */
#define FLASH_PROGRAMMING_DELAY_0   0x00000000U            /*!< programming delay set for Flash running at 70 MHz or below          */
#define FLASH_PROGRAMMING_DELAY_1   FLASH_ACR_WRHIGHFREQ_0 /*!< programming delay set for Flash running between 70 MHz and 185 MHz  */
#define FLASH_PROGRAMMING_DELAY_2   FLASH_ACR_WRHIGHFREQ_1 /*!< programming delay set for Flash running between 185 MHz and 225 MHz */
#define FLASH_PROGRAMMING_DELAY_3   FLASH_ACR_WRHIGHFREQ   /*!< programming delay set for Flash at startup */
/**
  * @}
  */
whj123999's avatar
whj123999 已提交
572 573

/* Exported macro ------------------------------------------------------------*/
574
/** @defgroup FLASHEx_Exported_Macros FLASH Exported Macros
whj123999's avatar
whj123999 已提交
575 576 577 578 579 580 581 582
  * @{
  */
/**
  * @brief  Calculate the FLASH Boot Base Adress (BOOT_ADD0 or BOOT_ADD1)
  * @note   Returned value BOOT_ADDx[15:0] corresponds to boot address [29:14].
  * @param  __ADDRESS__: FLASH Boot Address (in the range 0x0000 0000 to 0x2004 FFFF with a granularity of 16KB)
  * @retval The FLASH Boot Base Adress
  */
583
#define __HAL_FLASH_CALC_BOOT_BASE_ADR(__ADDRESS__) ((__ADDRESS__) >> 14U)
whj123999's avatar
whj123999 已提交
584 585 586
 /**
  * @}
  */
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623

/**
  * @brief  Set the FLASH Program/Erase parallelism.
  * @param  __PSIZE__ FLASH Program/Erase parallelism
  *         This parameter can be a value of @ref FLASH_Program_Parallelism
  * @param  __BANK__: Flash bank (FLASH_BANK_1 or FLASH_BANK_2)
  * @retval none
  */
#define __HAL_FLASH_SET_PSIZE(__PSIZE__, __BANK__) (((__BANK__) == FLASH_BANK_1)  ? \
                              MODIFY_REG(FLASH->CR1, FLASH_CR_PSIZE, (__PSIZE__)) : \
                              MODIFY_REG(FLASH->CR2, FLASH_CR_PSIZE, (__PSIZE__)))

/**
  * @brief  Get the FLASH Program/Erase parallelism.
  * @param  __BANK__ Flash bank (FLASH_BANK_1 or FLASH_BANK_2)
  * @retval FLASH Program/Erase parallelism
  *         This return value can be a value of @ref FLASH_Program_Parallelism
  */
#define __HAL_FLASH_GET_PSIZE(__BANK__) (((__BANK__) == FLASH_BANK_1) ? \
                              READ_BIT((FLASH->CR1), FLASH_CR_PSIZE)  : \
                              READ_BIT((FLASH->CR2), FLASH_CR_PSIZE))

/**
  * @brief  Set the FLASH Programming Delay.
  * @param  __DELAY__ FLASH Programming Delay
  *         This parameter can be a value of @ref FLASHEx_Programming_Delay
  * @retval none
  */
#define __HAL_FLASH_SET_PROGRAM_DELAY(__DELAY__)  MODIFY_REG(FLASH->ACR, FLASH_ACR_WRHIGHFREQ, (__DELAY__))

/**
  * @brief  Get the FLASH Programming Delay.
  * @retval FLASH Programming Delay
  *         This return value can be a value of @ref FLASHEx_Programming_Delay
  */
#define __HAL_FLASH_GET_PROGRAM_DELAY()     READ_BIT(FLASH->ACR, FLASH_ACR_WRHIGHFREQ)

whj123999's avatar
whj123999 已提交
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642
/* Exported functions --------------------------------------------------------*/
/** @addtogroup FLASHEx_Exported_Functions
  * @{
  */

/** @addtogroup FLASHEx_Exported_Functions_Group1
  * @{
  */
/* Extension Program operation functions  *************************************/
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit);
HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);
void              HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);

HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank1(void);
HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank1(void);
HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank2(void);
HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank2(void);

643 644
HAL_StatusTypeDef HAL_FLASHEx_ComputeCRC(FLASH_CRCInitTypeDef *pCRCInit, uint32_t *CRC_Result);

whj123999's avatar
whj123999 已提交
645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
/**
  * @}
  */

/**
  * @}
  */
/* Private types -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros
  * @{
  */

/** @defgroup FLASHEx_IS_FLASH_Definitions FLASHEx Private macros to check input parameters
  * @{
  */

#define IS_FLASH_TYPEERASE(VALUE)    (((VALUE) == FLASH_TYPEERASE_SECTORS) || \
665
                                      ((VALUE) == FLASH_TYPEERASE_MASSERASE))
whj123999's avatar
whj123999 已提交
666 667 668 669

#define IS_VOLTAGERANGE(RANGE)    (((RANGE) == FLASH_VOLTAGE_RANGE_1) || \
                                   ((RANGE) == FLASH_VOLTAGE_RANGE_2) || \
                                   ((RANGE) == FLASH_VOLTAGE_RANGE_3) || \
670
                                   ((RANGE) == FLASH_VOLTAGE_RANGE_4))
whj123999's avatar
whj123999 已提交
671 672

#define IS_WRPSTATE(VALUE)    (((VALUE) == OB_WRPSTATE_DISABLE) || \
673 674 675 676 677 678
                               ((VALUE) == OB_WRPSTATE_ENABLE))
#if defined(DUAL_CORE)
#define IS_OPTIONBYTE(VALUE)    (((VALUE) <= 0x3FFFU) && ((VALUE) != 0U))
#else
#define IS_OPTIONBYTE(VALUE)    (((VALUE) <= 0x01FFU) && ((VALUE) != 0U))
#endif /*DUAL_CORE*/
whj123999's avatar
whj123999 已提交
679 680 681

#define IS_OB_BOOT_ADDRESS(ADDRESS)     ((ADDRESS) <= 0x8013U)

682 683 684
#define IS_OB_RDP_LEVEL(LEVEL)          (((LEVEL) == OB_RDP_LEVEL_0)   ||\
                                         ((LEVEL) == OB_RDP_LEVEL_1)   ||\
                                         ((LEVEL) == OB_RDP_LEVEL_2))
whj123999's avatar
whj123999 已提交
685 686 687 688 689 690 691 692 693 694 695 696 697

#define IS_OB_WWDG_SOURCE(SOURCE) (((SOURCE) == OB_WWDG_SW) || ((SOURCE) == OB_WWDG_HW))

#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW))

#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NO_RST) || ((SOURCE) == OB_STOP_RST))

#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NO_RST) || ((SOURCE) == OB_STDBY_RST))

#define IS_OB_IWDG_STOP_FREEZE(FREEZE) (((FREEZE) == OB_IWDG_STOP_FREEZE) || ((FREEZE) == OB_IWDG_STOP_ACTIVE))

#define IS_OB_IWDG_STDBY_FREEZE(FREEZE) (((FREEZE) == OB_IWDG_STDBY_FREEZE) || ((FREEZE) == OB_IWDG_STDBY_ACTIVE))

698 699
#define IS_OB_BOR_LEVEL(LEVEL) (((LEVEL) == OB_BOR_LEVEL0) || ((LEVEL) == OB_BOR_LEVEL1) || \
                                ((LEVEL) == OB_BOR_LEVEL2) || ((LEVEL) == OB_BOR_LEVEL3))
whj123999's avatar
whj123999 已提交
700 701 702 703 704 705 706 707

#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_LATENCY_0)  || \
                                   ((LATENCY) == FLASH_LATENCY_1)  || \
                                   ((LATENCY) == FLASH_LATENCY_2)  || \
                                   ((LATENCY) == FLASH_LATENCY_3)  || \
                                   ((LATENCY) == FLASH_LATENCY_4)  || \
                                   ((LATENCY) == FLASH_LATENCY_5)  || \
                                   ((LATENCY) == FLASH_LATENCY_6)  || \
708 709 710 711 712 713 714 715 716
                                   ((LATENCY) == FLASH_LATENCY_7)  || \
                                   ((LATENCY) == FLASH_LATENCY_8)  || \
                                   ((LATENCY) == FLASH_LATENCY_9)  || \
                                   ((LATENCY) == FLASH_LATENCY_10) || \
                                   ((LATENCY) == FLASH_LATENCY_11) || \
                                   ((LATENCY) == FLASH_LATENCY_12) || \
                                   ((LATENCY) == FLASH_LATENCY_13) || \
                                   ((LATENCY) == FLASH_LATENCY_14) || \
                                   ((LATENCY) == FLASH_LATENCY_15))
whj123999's avatar
whj123999 已提交
717

718
#define IS_FLASH_SECTOR(SECTOR) ((SECTOR) < FLASH_SECTOR_TOTAL)
whj123999's avatar
whj123999 已提交
719

720
#define IS_OB_WRP_SECTOR(SECTOR)  ((((SECTOR) & 0xFFFFFF00U) == 0x00000000U) && ((SECTOR) != 0x00000000U))
whj123999's avatar
whj123999 已提交
721 722

#define IS_OB_PCROP_RDP(CONFIG)         (((CONFIG) == OB_PCROP_RDP_NOT_ERASE) || \
723
                                         ((CONFIG) == OB_PCROP_RDP_ERASE))
whj123999's avatar
whj123999 已提交
724 725

#define IS_OB_SECURE_RDP(CONFIG)         (((CONFIG) == OB_SECURE_RDP_NOT_ERASE) || \
726
                                          ((CONFIG) == OB_SECURE_RDP_ERASE))
whj123999's avatar
whj123999 已提交
727 728 729 730 731 732

#define IS_OB_USER_SWAP_BANK(VALUE)      (((VALUE) == OB_SWAP_BANK_DISABLE) || ((VALUE) == OB_SWAP_BANK_ENABLE))

#define IS_OB_USER_IOHSLV(VALUE)         (((VALUE) == OB_IOHSLV_DISABLE) || ((VALUE) == OB_IOHSLV_ENABLE))

#define IS_OB_IWDG1_SOURCE(SOURCE)       (((SOURCE) == OB_IWDG1_SW) || ((SOURCE) == OB_IWDG1_HW))
733 734 735
#if defined(DUAL_CORE)
#define IS_OB_IWDG2_SOURCE(SOURCE)       (((SOURCE) == OB_IWDG2_SW) || ((SOURCE) == OB_IWDG2_HW))
#endif /*DUAL_CORE*/
whj123999's avatar
whj123999 已提交
736 737 738 739 740 741 742 743
#define IS_OB_STOP_D1_RESET(VALUE)       (((VALUE) == OB_STOP_NO_RST_D1) || ((VALUE) == OB_STOP_RST_D1))

#define IS_OB_STDBY_D1_RESET(VALUE)      (((VALUE) == OB_STDBY_NO_RST_D1) || ((VALUE) == OB_STDBY_RST_D1))

#define IS_OB_USER_IWDG_STOP(VALUE)      (((VALUE) == OB_IWDG_STOP_FREEZE) || ((VALUE) == OB_IWDG_STOP_ACTIVE))

#define IS_OB_USER_IWDG_STDBY(VALUE)     (((VALUE) == OB_IWDG_STDBY_FREEZE) || ((VALUE) == OB_IWDG_STDBY_ACTIVE))

744 745 746 747 748 749 750
#define IS_OB_USER_ST_RAM_SIZE(VALUE)    (((VALUE) == OB_ST_RAM_SIZE_2KB) || ((VALUE) == OB_ST_RAM_SIZE_4KB) || \
                                          ((VALUE) == OB_ST_RAM_SIZE_8KB) || ((VALUE) == OB_ST_RAM_SIZE_16KB))

#define IS_OB_USER_SECURITY(VALUE)       (((VALUE) == OB_SECURITY_ENABLE) || ((VALUE) == OB_SECURITY_DISABLE))

#if defined(DUAL_CORE)
#define IS_OB_USER_BCM4(VALUE)           (((VALUE) == OB_BCM4_DISABLE) || ((VALUE) == OB_BCM4_ENABLE))
whj123999's avatar
whj123999 已提交
751

752
#define IS_OB_USER_BCM7(VALUE)           (((VALUE) == OB_BCM7_DISABLE) || ((VALUE) == OB_BCM7_ENABLE))
whj123999's avatar
whj123999 已提交
753

754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770
#define IS_OB_STOP_D2_RESET(VALUE)       (((VALUE) == OB_STOP_NO_RST_D2) || ((VALUE) == OB_STOP_RST_D2))

#define IS_OB_STDBY_D2_RESET(VALUE)      (((VALUE) == OB_STDBY_NO_RST_D2) || ((VALUE) == OB_STDBY_RST_D2))
#endif /*DUAL_CORE*/
#if defined(DUAL_CORE)
#define IS_OB_USER_TYPE(TYPE)            (((TYPE) <= (uint32_t)0x3FFFU) && ((TYPE) != 0U))
#else
#define IS_OB_USER_TYPE(TYPE)            (((TYPE) <= (uint32_t)0x73FU) && ((TYPE) != 0U))
#endif

#define IS_OB_BOOT_ADD_OPTION(VALUE)     (((VALUE) == OB_BOOT_ADD0)  || \
                                          ((VALUE) == OB_BOOT_ADD1)  || \
                                          ((VALUE) == OB_BOOT_ADD_BOTH))

#define IS_FLASH_TYPECRC(VALUE)          (((VALUE) == FLASH_CRC_ADDR)    || \
                                          ((VALUE) == FLASH_CRC_SECTORS) || \
                                          ((VALUE) == FLASH_CRC_BANK))
whj123999's avatar
whj123999 已提交
771 772 773 774 775 776 777 778 779
/**
  * @}
  */

/**
  * @}
  */

/* Private functions ---------------------------------------------------------*/
780
/** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
whj123999's avatar
whj123999 已提交
781 782
  * @{
  */
783
void FLASH_Erase_Sector(uint32_t Sector, uint32_t Banks, uint32_t VoltageRange);
whj123999's avatar
whj123999 已提交
784 785
/**
  * @}
786
  */
whj123999's avatar
whj123999 已提交
787 788 789

/**
  * @}
790 791
  */

whj123999's avatar
whj123999 已提交
792 793
/**
  * @}
794 795
  */

whj123999's avatar
whj123999 已提交
796 797 798 799 800 801 802 803
/**
  * @}
  */

#ifdef __cplusplus
}
#endif

804
#endif /* STM32H7xx_HAL_FLASH_EX_H */
whj123999's avatar
whj123999 已提交
805 806

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/