mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 573:ad23fe03a082 1 /**
mbed_official 573:ad23fe03a082 2 ******************************************************************************
mbed_official 573:ad23fe03a082 3 * @file stm32f7xx_hal_flash_ex.c
mbed_official 573:ad23fe03a082 4 * @author MCD Application Team
mbed_official 610:813dcc80987e 5 * @version V1.0.1
mbed_official 610:813dcc80987e 6 * @date 25-June-2015
mbed_official 573:ad23fe03a082 7 * @brief Extended FLASH HAL module driver.
mbed_official 573:ad23fe03a082 8 * This file provides firmware functions to manage the following
mbed_official 573:ad23fe03a082 9 * functionalities of the FLASH extension peripheral:
mbed_official 573:ad23fe03a082 10 * + Extended programming operations functions
mbed_official 573:ad23fe03a082 11 *
mbed_official 573:ad23fe03a082 12 @verbatim
mbed_official 573:ad23fe03a082 13 ==============================================================================
mbed_official 573:ad23fe03a082 14 ##### Flash Extension features #####
mbed_official 573:ad23fe03a082 15 ==============================================================================
mbed_official 573:ad23fe03a082 16
mbed_official 573:ad23fe03a082 17 [..] Comparing to other previous devices, the FLASH interface for STM32F727xx/437xx and
mbed_official 573:ad23fe03a082 18 devices contains the following additional features
mbed_official 573:ad23fe03a082 19
mbed_official 573:ad23fe03a082 20 (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write
mbed_official 573:ad23fe03a082 21 capability (RWW)
mbed_official 573:ad23fe03a082 22 (+) Dual bank memory organization
mbed_official 573:ad23fe03a082 23 (+) PCROP protection for all banks
mbed_official 573:ad23fe03a082 24
mbed_official 573:ad23fe03a082 25 ##### How to use this driver #####
mbed_official 573:ad23fe03a082 26 ==============================================================================
mbed_official 573:ad23fe03a082 27 [..] This driver provides functions to configure and program the FLASH memory
mbed_official 573:ad23fe03a082 28 of all STM32F7xx devices. It includes
mbed_official 573:ad23fe03a082 29 (#) FLASH Memory Erase functions:
mbed_official 573:ad23fe03a082 30 (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and
mbed_official 573:ad23fe03a082 31 HAL_FLASH_Lock() functions
mbed_official 573:ad23fe03a082 32 (++) Erase function: Erase sector, erase all sectors
mbed_official 573:ad23fe03a082 33 (++) There are two modes of erase :
mbed_official 573:ad23fe03a082 34 (+++) Polling Mode using HAL_FLASHEx_Erase()
mbed_official 573:ad23fe03a082 35 (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()
mbed_official 573:ad23fe03a082 36
mbed_official 573:ad23fe03a082 37 (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to :
mbed_official 573:ad23fe03a082 38 (++) Set/Reset the write protection
mbed_official 573:ad23fe03a082 39 (++) Set the Read protection Level
mbed_official 573:ad23fe03a082 40 (++) Set the BOR level
mbed_official 573:ad23fe03a082 41 (++) Program the user Option Bytes
mbed_official 573:ad23fe03a082 42 (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to :
mbed_official 573:ad23fe03a082 43 (++) Extended space (bank 2) erase function
mbed_official 573:ad23fe03a082 44 (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2)
mbed_official 573:ad23fe03a082 45 (++) Dual Boot activation
mbed_official 573:ad23fe03a082 46 (++) Write protection configuration for bank 2
mbed_official 573:ad23fe03a082 47 (++) PCROP protection configuration and control for both banks
mbed_official 573:ad23fe03a082 48
mbed_official 573:ad23fe03a082 49 @endverbatim
mbed_official 573:ad23fe03a082 50 ******************************************************************************
mbed_official 573:ad23fe03a082 51 * @attention
mbed_official 573:ad23fe03a082 52 *
mbed_official 573:ad23fe03a082 53 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 573:ad23fe03a082 54 *
mbed_official 573:ad23fe03a082 55 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 573:ad23fe03a082 56 * are permitted provided that the following conditions are met:
mbed_official 573:ad23fe03a082 57 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 573:ad23fe03a082 58 * this list of conditions and the following disclaimer.
mbed_official 573:ad23fe03a082 59 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 573:ad23fe03a082 60 * this list of conditions and the following disclaimer in the documentation
mbed_official 573:ad23fe03a082 61 * and/or other materials provided with the distribution.
mbed_official 573:ad23fe03a082 62 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 573:ad23fe03a082 63 * may be used to endorse or promote products derived from this software
mbed_official 573:ad23fe03a082 64 * without specific prior written permission.
mbed_official 573:ad23fe03a082 65 *
mbed_official 573:ad23fe03a082 66 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 573:ad23fe03a082 67 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 573:ad23fe03a082 68 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 573:ad23fe03a082 69 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 573:ad23fe03a082 70 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 573:ad23fe03a082 71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 573:ad23fe03a082 72 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 573:ad23fe03a082 73 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 573:ad23fe03a082 74 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 573:ad23fe03a082 75 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 573:ad23fe03a082 76 *
mbed_official 573:ad23fe03a082 77 ******************************************************************************
mbed_official 573:ad23fe03a082 78 */
mbed_official 573:ad23fe03a082 79
mbed_official 573:ad23fe03a082 80 /* Includes ------------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 81 #include "stm32f7xx_hal.h"
mbed_official 573:ad23fe03a082 82
mbed_official 573:ad23fe03a082 83 /** @addtogroup STM32F7xx_HAL_Driver
mbed_official 573:ad23fe03a082 84 * @{
mbed_official 573:ad23fe03a082 85 */
mbed_official 573:ad23fe03a082 86
mbed_official 573:ad23fe03a082 87 /** @defgroup FLASHEx FLASHEx
mbed_official 573:ad23fe03a082 88 * @brief FLASH HAL Extension module driver
mbed_official 573:ad23fe03a082 89 * @{
mbed_official 573:ad23fe03a082 90 */
mbed_official 573:ad23fe03a082 91
mbed_official 573:ad23fe03a082 92 #ifdef HAL_FLASH_MODULE_ENABLED
mbed_official 573:ad23fe03a082 93
mbed_official 573:ad23fe03a082 94 /* Private typedef -----------------------------------------------------------*/
mbed_official 573:ad23fe03a082 95 /* Private define ------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 96 /** @addtogroup FLASHEx_Private_Constants
mbed_official 573:ad23fe03a082 97 * @{
mbed_official 573:ad23fe03a082 98 */
mbed_official 573:ad23fe03a082 99 #define SECTOR_MASK ((uint32_t)0xFFFFFF07)
mbed_official 573:ad23fe03a082 100 #define FLASH_TIMEOUT_VALUE ((uint32_t)50000)/* 50 s */
mbed_official 573:ad23fe03a082 101 /**
mbed_official 573:ad23fe03a082 102 * @}
mbed_official 573:ad23fe03a082 103 */
mbed_official 573:ad23fe03a082 104
mbed_official 573:ad23fe03a082 105 /* Private macro -------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 106 /* Private variables ---------------------------------------------------------*/
mbed_official 573:ad23fe03a082 107 /** @addtogroup FLASHEx_Private_Variables
mbed_official 573:ad23fe03a082 108 * @{
mbed_official 573:ad23fe03a082 109 */
mbed_official 573:ad23fe03a082 110 extern FLASH_ProcessTypeDef pFlash;
mbed_official 573:ad23fe03a082 111 /**
mbed_official 573:ad23fe03a082 112 * @}
mbed_official 573:ad23fe03a082 113 */
mbed_official 573:ad23fe03a082 114
mbed_official 573:ad23fe03a082 115 /* Private function prototypes -----------------------------------------------*/
mbed_official 573:ad23fe03a082 116 /** @addtogroup FLASHEx_Private_Functions
mbed_official 573:ad23fe03a082 117 * @{
mbed_official 573:ad23fe03a082 118 */
mbed_official 573:ad23fe03a082 119 /* Option bytes control */
mbed_official 573:ad23fe03a082 120 static void FLASH_MassErase(uint8_t VoltageRange);
mbed_official 573:ad23fe03a082 121 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector);
mbed_official 573:ad23fe03a082 122 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector);
mbed_official 573:ad23fe03a082 123 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint32_t Level);
mbed_official 573:ad23fe03a082 124 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t Wwdg, uint32_t Iwdg, uint32_t Stop, uint32_t Stdby, uint32_t Iwdgstop, uint32_t Iwdgstdby);
mbed_official 573:ad23fe03a082 125 static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level);
mbed_official 573:ad23fe03a082 126 static HAL_StatusTypeDef FLASH_OB_BootAddressConfig(uint32_t BootOption, uint32_t Address);
mbed_official 573:ad23fe03a082 127 static uint32_t FLASH_OB_GetUser(void);
mbed_official 573:ad23fe03a082 128 static uint32_t FLASH_OB_GetWRP(void);
mbed_official 610:813dcc80987e 129 static uint8_t FLASH_OB_GetRDP(void);
mbed_official 573:ad23fe03a082 130 static uint32_t FLASH_OB_GetBOR(void);
mbed_official 573:ad23fe03a082 131 static uint32_t FLASH_OB_GetBootAddress(uint32_t BootOption);
mbed_official 573:ad23fe03a082 132
mbed_official 573:ad23fe03a082 133 extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
mbed_official 573:ad23fe03a082 134 /**
mbed_official 573:ad23fe03a082 135 * @}
mbed_official 573:ad23fe03a082 136 */
mbed_official 573:ad23fe03a082 137
mbed_official 573:ad23fe03a082 138 /* Exported functions --------------------------------------------------------*/
mbed_official 573:ad23fe03a082 139 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
mbed_official 573:ad23fe03a082 140 * @{
mbed_official 573:ad23fe03a082 141 */
mbed_official 573:ad23fe03a082 142
mbed_official 573:ad23fe03a082 143 /** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions
mbed_official 573:ad23fe03a082 144 * @brief Extended IO operation functions
mbed_official 573:ad23fe03a082 145 *
mbed_official 573:ad23fe03a082 146 @verbatim
mbed_official 573:ad23fe03a082 147 ===============================================================================
mbed_official 573:ad23fe03a082 148 ##### Extended programming operation functions #####
mbed_official 573:ad23fe03a082 149 ===============================================================================
mbed_official 573:ad23fe03a082 150 [..]
mbed_official 573:ad23fe03a082 151 This subsection provides a set of functions allowing to manage the Extension FLASH
mbed_official 573:ad23fe03a082 152 programming operations Operations.
mbed_official 573:ad23fe03a082 153
mbed_official 573:ad23fe03a082 154 @endverbatim
mbed_official 573:ad23fe03a082 155 * @{
mbed_official 573:ad23fe03a082 156 */
mbed_official 573:ad23fe03a082 157 /**
mbed_official 573:ad23fe03a082 158 * @brief Perform a mass erase or erase the specified FLASH memory sectors
mbed_official 573:ad23fe03a082 159 * @param[in] pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 573:ad23fe03a082 160 * contains the configuration information for the erasing.
mbed_official 573:ad23fe03a082 161 *
mbed_official 573:ad23fe03a082 162 * @param[out] SectorError: pointer to variable that
mbed_official 573:ad23fe03a082 163 * contains the configuration information on faulty sector in case of error
mbed_official 573:ad23fe03a082 164 * (0xFFFFFFFF means that all the sectors have been correctly erased)
mbed_official 573:ad23fe03a082 165 *
mbed_official 573:ad23fe03a082 166 * @retval HAL Status
mbed_official 573:ad23fe03a082 167 */
mbed_official 573:ad23fe03a082 168 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
mbed_official 573:ad23fe03a082 169 {
mbed_official 573:ad23fe03a082 170 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 573:ad23fe03a082 171 uint32_t index = 0;
mbed_official 573:ad23fe03a082 172
mbed_official 573:ad23fe03a082 173 /* Process Locked */
mbed_official 573:ad23fe03a082 174 __HAL_LOCK(&pFlash);
mbed_official 573:ad23fe03a082 175
mbed_official 573:ad23fe03a082 176 /* Check the parameters */
mbed_official 573:ad23fe03a082 177 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 573:ad23fe03a082 178
mbed_official 573:ad23fe03a082 179 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 180 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 181
mbed_official 573:ad23fe03a082 182 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 183 {
mbed_official 573:ad23fe03a082 184 /*Initialization of SectorError variable*/
mbed_official 573:ad23fe03a082 185 *SectorError = 0xFFFFFFFF;
mbed_official 573:ad23fe03a082 186
mbed_official 573:ad23fe03a082 187 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 573:ad23fe03a082 188 {
mbed_official 573:ad23fe03a082 189 /*Mass erase to be done*/
mbed_official 573:ad23fe03a082 190 FLASH_MassErase((uint8_t) pEraseInit->VoltageRange);
mbed_official 573:ad23fe03a082 191
mbed_official 573:ad23fe03a082 192 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 193 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 194
mbed_official 573:ad23fe03a082 195 /* if the erase operation is completed, disable the MER Bit */
mbed_official 573:ad23fe03a082 196 FLASH->CR &= (~FLASH_MER_BIT);
mbed_official 573:ad23fe03a082 197 }
mbed_official 573:ad23fe03a082 198 else
mbed_official 573:ad23fe03a082 199 {
mbed_official 573:ad23fe03a082 200 /* Check the parameters */
mbed_official 573:ad23fe03a082 201 assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
mbed_official 573:ad23fe03a082 202
mbed_official 573:ad23fe03a082 203 /* Erase by sector by sector to be done*/
mbed_official 573:ad23fe03a082 204 for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++)
mbed_official 573:ad23fe03a082 205 {
mbed_official 573:ad23fe03a082 206 FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange);
mbed_official 573:ad23fe03a082 207
mbed_official 573:ad23fe03a082 208 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 209 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 210
mbed_official 573:ad23fe03a082 211 /* If the erase operation is completed, disable the SER Bit */
mbed_official 573:ad23fe03a082 212 FLASH->CR &= (~FLASH_CR_SER);
mbed_official 573:ad23fe03a082 213 FLASH->CR &= SECTOR_MASK;
mbed_official 573:ad23fe03a082 214
mbed_official 573:ad23fe03a082 215 if(status != HAL_OK)
mbed_official 573:ad23fe03a082 216 {
mbed_official 573:ad23fe03a082 217 /* In case of error, stop erase procedure and return the faulty sector*/
mbed_official 573:ad23fe03a082 218 *SectorError = index;
mbed_official 573:ad23fe03a082 219 break;
mbed_official 573:ad23fe03a082 220 }
mbed_official 573:ad23fe03a082 221 }
mbed_official 573:ad23fe03a082 222 }
mbed_official 573:ad23fe03a082 223 }
mbed_official 573:ad23fe03a082 224
mbed_official 573:ad23fe03a082 225 /* Process Unlocked */
mbed_official 573:ad23fe03a082 226 __HAL_UNLOCK(&pFlash);
mbed_official 573:ad23fe03a082 227
mbed_official 573:ad23fe03a082 228 return status;
mbed_official 573:ad23fe03a082 229 }
mbed_official 573:ad23fe03a082 230
mbed_official 573:ad23fe03a082 231 /**
mbed_official 573:ad23fe03a082 232 * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled
mbed_official 573:ad23fe03a082 233 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 573:ad23fe03a082 234 * contains the configuration information for the erasing.
mbed_official 573:ad23fe03a082 235 *
mbed_official 573:ad23fe03a082 236 * @retval HAL Status
mbed_official 573:ad23fe03a082 237 */
mbed_official 573:ad23fe03a082 238 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
mbed_official 573:ad23fe03a082 239 {
mbed_official 573:ad23fe03a082 240 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 241
mbed_official 573:ad23fe03a082 242 /* Process Locked */
mbed_official 573:ad23fe03a082 243 __HAL_LOCK(&pFlash);
mbed_official 573:ad23fe03a082 244
mbed_official 573:ad23fe03a082 245 /* Check the parameters */
mbed_official 573:ad23fe03a082 246 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 573:ad23fe03a082 247
mbed_official 573:ad23fe03a082 248 /* Enable End of FLASH Operation interrupt */
mbed_official 573:ad23fe03a082 249 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
mbed_official 573:ad23fe03a082 250
mbed_official 573:ad23fe03a082 251 /* Enable Error source interrupt */
mbed_official 573:ad23fe03a082 252 __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
mbed_official 573:ad23fe03a082 253
mbed_official 573:ad23fe03a082 254 /* Clear pending flags (if any) */
mbed_official 573:ad23fe03a082 255 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\
mbed_official 573:ad23fe03a082 256 FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_ERSERR);
mbed_official 573:ad23fe03a082 257
mbed_official 573:ad23fe03a082 258 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 573:ad23fe03a082 259 {
mbed_official 573:ad23fe03a082 260 /*Mass erase to be done*/
mbed_official 573:ad23fe03a082 261 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
mbed_official 573:ad23fe03a082 262 FLASH_MassErase((uint8_t) pEraseInit->VoltageRange);
mbed_official 573:ad23fe03a082 263 }
mbed_official 573:ad23fe03a082 264 else
mbed_official 573:ad23fe03a082 265 {
mbed_official 573:ad23fe03a082 266 /* Erase by sector to be done*/
mbed_official 573:ad23fe03a082 267
mbed_official 573:ad23fe03a082 268 /* Check the parameters */
mbed_official 573:ad23fe03a082 269 assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
mbed_official 573:ad23fe03a082 270
mbed_official 573:ad23fe03a082 271 pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE;
mbed_official 573:ad23fe03a082 272 pFlash.NbSectorsToErase = pEraseInit->NbSectors;
mbed_official 573:ad23fe03a082 273 pFlash.Sector = pEraseInit->Sector;
mbed_official 573:ad23fe03a082 274 pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange;
mbed_official 573:ad23fe03a082 275
mbed_official 573:ad23fe03a082 276 /*Erase 1st sector and wait for IT*/
mbed_official 573:ad23fe03a082 277 FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange);
mbed_official 573:ad23fe03a082 278 }
mbed_official 573:ad23fe03a082 279
mbed_official 573:ad23fe03a082 280 return status;
mbed_official 573:ad23fe03a082 281 }
mbed_official 573:ad23fe03a082 282
mbed_official 573:ad23fe03a082 283 /**
mbed_official 573:ad23fe03a082 284 * @brief Program option bytes
mbed_official 573:ad23fe03a082 285 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 573:ad23fe03a082 286 * contains the configuration information for the programming.
mbed_official 573:ad23fe03a082 287 *
mbed_official 573:ad23fe03a082 288 * @retval HAL Status
mbed_official 573:ad23fe03a082 289 */
mbed_official 573:ad23fe03a082 290 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 573:ad23fe03a082 291 {
mbed_official 573:ad23fe03a082 292 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 573:ad23fe03a082 293
mbed_official 573:ad23fe03a082 294 /* Process Locked */
mbed_official 573:ad23fe03a082 295 __HAL_LOCK(&pFlash);
mbed_official 573:ad23fe03a082 296
mbed_official 573:ad23fe03a082 297 /* Check the parameters */
mbed_official 573:ad23fe03a082 298 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
mbed_official 573:ad23fe03a082 299
mbed_official 573:ad23fe03a082 300 /* Write protection configuration */
mbed_official 573:ad23fe03a082 301 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
mbed_official 573:ad23fe03a082 302 {
mbed_official 573:ad23fe03a082 303 assert_param(IS_WRPSTATE(pOBInit->WRPState));
mbed_official 573:ad23fe03a082 304 if(pOBInit->WRPState == OB_WRPSTATE_ENABLE)
mbed_official 573:ad23fe03a082 305 {
mbed_official 573:ad23fe03a082 306 /*Enable of Write protection on the selected Sector*/
mbed_official 573:ad23fe03a082 307 status = FLASH_OB_EnableWRP(pOBInit->WRPSector);
mbed_official 573:ad23fe03a082 308 }
mbed_official 573:ad23fe03a082 309 else
mbed_official 573:ad23fe03a082 310 {
mbed_official 573:ad23fe03a082 311 /*Disable of Write protection on the selected Sector*/
mbed_official 573:ad23fe03a082 312 status = FLASH_OB_DisableWRP(pOBInit->WRPSector);
mbed_official 573:ad23fe03a082 313 }
mbed_official 573:ad23fe03a082 314 }
mbed_official 573:ad23fe03a082 315
mbed_official 573:ad23fe03a082 316 /* Read protection configuration */
mbed_official 573:ad23fe03a082 317 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
mbed_official 573:ad23fe03a082 318 {
mbed_official 573:ad23fe03a082 319 status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
mbed_official 573:ad23fe03a082 320 }
mbed_official 573:ad23fe03a082 321
mbed_official 573:ad23fe03a082 322 /* USER configuration */
mbed_official 573:ad23fe03a082 323 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
mbed_official 573:ad23fe03a082 324 {
mbed_official 573:ad23fe03a082 325 status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_WWDG_SW,
mbed_official 573:ad23fe03a082 326 pOBInit->USERConfig & OB_IWDG_SW,
mbed_official 573:ad23fe03a082 327 pOBInit->USERConfig & OB_STOP_NO_RST,
mbed_official 573:ad23fe03a082 328 pOBInit->USERConfig & OB_STDBY_NO_RST,
mbed_official 573:ad23fe03a082 329 pOBInit->USERConfig & OB_IWDG_STOP_ACTIVE,
mbed_official 573:ad23fe03a082 330 pOBInit->USERConfig & OB_IWDG_STDBY_ACTIVE);
mbed_official 573:ad23fe03a082 331 }
mbed_official 573:ad23fe03a082 332
mbed_official 573:ad23fe03a082 333 /* BOR Level configuration */
mbed_official 573:ad23fe03a082 334 if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
mbed_official 573:ad23fe03a082 335 {
mbed_official 573:ad23fe03a082 336 status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel);
mbed_official 573:ad23fe03a082 337 }
mbed_official 573:ad23fe03a082 338
mbed_official 573:ad23fe03a082 339 /* Boot 0 Address configuration */
mbed_official 573:ad23fe03a082 340 if((pOBInit->OptionType & OPTIONBYTE_BOOTADDR_0) == OPTIONBYTE_BOOTADDR_0)
mbed_official 573:ad23fe03a082 341 {
mbed_official 573:ad23fe03a082 342 status = FLASH_OB_BootAddressConfig(OPTIONBYTE_BOOTADDR_0, pOBInit->BootAddr0);
mbed_official 573:ad23fe03a082 343 }
mbed_official 573:ad23fe03a082 344
mbed_official 573:ad23fe03a082 345 /* Boot 1 Address configuration */
mbed_official 573:ad23fe03a082 346 if((pOBInit->OptionType & OPTIONBYTE_BOOTADDR_1) == OPTIONBYTE_BOOTADDR_1)
mbed_official 573:ad23fe03a082 347 {
mbed_official 573:ad23fe03a082 348 status = FLASH_OB_BootAddressConfig(OPTIONBYTE_BOOTADDR_1, pOBInit->BootAddr1);
mbed_official 573:ad23fe03a082 349 }
mbed_official 573:ad23fe03a082 350
mbed_official 573:ad23fe03a082 351 /* Process Unlocked */
mbed_official 573:ad23fe03a082 352 __HAL_UNLOCK(&pFlash);
mbed_official 573:ad23fe03a082 353
mbed_official 573:ad23fe03a082 354 return status;
mbed_official 573:ad23fe03a082 355 }
mbed_official 573:ad23fe03a082 356
mbed_official 573:ad23fe03a082 357 /**
mbed_official 573:ad23fe03a082 358 * @brief Get the Option byte configuration
mbed_official 573:ad23fe03a082 359 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 573:ad23fe03a082 360 * contains the configuration information for the programming.
mbed_official 573:ad23fe03a082 361 *
mbed_official 573:ad23fe03a082 362 * @retval None
mbed_official 573:ad23fe03a082 363 */
mbed_official 573:ad23fe03a082 364 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 573:ad23fe03a082 365 {
mbed_official 573:ad23fe03a082 366 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER |\
mbed_official 573:ad23fe03a082 367 OPTIONBYTE_BOR | OPTIONBYTE_BOOTADDR_0 | OPTIONBYTE_BOOTADDR_1;
mbed_official 573:ad23fe03a082 368
mbed_official 573:ad23fe03a082 369 /*Get WRP*/
mbed_official 573:ad23fe03a082 370 pOBInit->WRPSector = FLASH_OB_GetWRP();
mbed_official 573:ad23fe03a082 371
mbed_official 573:ad23fe03a082 372 /*Get RDP Level*/
mbed_official 573:ad23fe03a082 373 pOBInit->RDPLevel = FLASH_OB_GetRDP();
mbed_official 573:ad23fe03a082 374
mbed_official 573:ad23fe03a082 375 /*Get USER*/
mbed_official 573:ad23fe03a082 376 pOBInit->USERConfig = FLASH_OB_GetUser();
mbed_official 573:ad23fe03a082 377
mbed_official 573:ad23fe03a082 378 /*Get BOR Level*/
mbed_official 573:ad23fe03a082 379 pOBInit->BORLevel = FLASH_OB_GetBOR();
mbed_official 573:ad23fe03a082 380
mbed_official 573:ad23fe03a082 381 /*Get Boot Address when Boot pin = 0 */
mbed_official 573:ad23fe03a082 382 pOBInit->BootAddr0 = FLASH_OB_GetBootAddress(OPTIONBYTE_BOOTADDR_0);
mbed_official 573:ad23fe03a082 383
mbed_official 573:ad23fe03a082 384 /*Get Boot Address when Boot pin = 1 */
mbed_official 573:ad23fe03a082 385 pOBInit->BootAddr1 = FLASH_OB_GetBootAddress(OPTIONBYTE_BOOTADDR_1);
mbed_official 573:ad23fe03a082 386 }
mbed_official 573:ad23fe03a082 387
mbed_official 573:ad23fe03a082 388 /**
mbed_official 573:ad23fe03a082 389 * @}
mbed_official 573:ad23fe03a082 390 */
mbed_official 573:ad23fe03a082 391
mbed_official 573:ad23fe03a082 392 /**
mbed_official 573:ad23fe03a082 393 * @brief Full erase of FLASH memory sectors
mbed_official 573:ad23fe03a082 394 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 573:ad23fe03a082 395 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 396 * @arg VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 573:ad23fe03a082 397 * the operation will be done by byte (8-bit)
mbed_official 573:ad23fe03a082 398 * @arg VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 573:ad23fe03a082 399 * the operation will be done by half word (16-bit)
mbed_official 573:ad23fe03a082 400 * @arg VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 573:ad23fe03a082 401 * the operation will be done by word (32-bit)
mbed_official 573:ad23fe03a082 402 * @arg VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 573:ad23fe03a082 403 * the operation will be done by double word (64-bit)
mbed_official 573:ad23fe03a082 404 *
mbed_official 573:ad23fe03a082 405 * @retval HAL Status
mbed_official 573:ad23fe03a082 406 */
mbed_official 573:ad23fe03a082 407 static void FLASH_MassErase(uint8_t VoltageRange)
mbed_official 573:ad23fe03a082 408 {
mbed_official 573:ad23fe03a082 409 uint32_t tmp_psize = 0;
mbed_official 573:ad23fe03a082 410
mbed_official 573:ad23fe03a082 411 /* Check the parameters */
mbed_official 573:ad23fe03a082 412 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 573:ad23fe03a082 413
mbed_official 573:ad23fe03a082 414 /* if the previous operation is completed, proceed to erase all sectors */
mbed_official 573:ad23fe03a082 415 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 573:ad23fe03a082 416 FLASH->CR |= tmp_psize;
mbed_official 573:ad23fe03a082 417 FLASH->CR |= FLASH_CR_MER;
mbed_official 573:ad23fe03a082 418 FLASH->CR |= FLASH_CR_STRT;
mbed_official 573:ad23fe03a082 419 /* Data synchronous Barrier (DSB) Just after the write operation
mbed_official 573:ad23fe03a082 420 This will force the CPU to respect the sequence of instruction (no optimization).*/
mbed_official 573:ad23fe03a082 421 __DSB();
mbed_official 573:ad23fe03a082 422 }
mbed_official 573:ad23fe03a082 423
mbed_official 573:ad23fe03a082 424 /**
mbed_official 573:ad23fe03a082 425 * @brief Erase the specified FLASH memory sector
mbed_official 573:ad23fe03a082 426 * @param Sector: FLASH sector to erase
mbed_official 573:ad23fe03a082 427 * The value of this parameter depend on device used within the same series
mbed_official 573:ad23fe03a082 428 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 573:ad23fe03a082 429 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 430 * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 573:ad23fe03a082 431 * the operation will be done by byte (8-bit)
mbed_official 573:ad23fe03a082 432 * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 573:ad23fe03a082 433 * the operation will be done by half word (16-bit)
mbed_official 573:ad23fe03a082 434 * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 573:ad23fe03a082 435 * the operation will be done by word (32-bit)
mbed_official 573:ad23fe03a082 436 * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 573:ad23fe03a082 437 * the operation will be done by double word (64-bit)
mbed_official 573:ad23fe03a082 438 *
mbed_official 573:ad23fe03a082 439 * @retval None
mbed_official 573:ad23fe03a082 440 */
mbed_official 573:ad23fe03a082 441 void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
mbed_official 573:ad23fe03a082 442 {
mbed_official 573:ad23fe03a082 443 uint32_t tmp_psize = 0;
mbed_official 573:ad23fe03a082 444
mbed_official 573:ad23fe03a082 445 /* Check the parameters */
mbed_official 573:ad23fe03a082 446 assert_param(IS_FLASH_SECTOR(Sector));
mbed_official 573:ad23fe03a082 447 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 573:ad23fe03a082 448
mbed_official 573:ad23fe03a082 449 if(VoltageRange == FLASH_VOLTAGE_RANGE_1)
mbed_official 573:ad23fe03a082 450 {
mbed_official 573:ad23fe03a082 451 tmp_psize = FLASH_PSIZE_BYTE;
mbed_official 573:ad23fe03a082 452 }
mbed_official 573:ad23fe03a082 453 else if(VoltageRange == FLASH_VOLTAGE_RANGE_2)
mbed_official 573:ad23fe03a082 454 {
mbed_official 573:ad23fe03a082 455 tmp_psize = FLASH_PSIZE_HALF_WORD;
mbed_official 573:ad23fe03a082 456 }
mbed_official 573:ad23fe03a082 457 else if(VoltageRange == FLASH_VOLTAGE_RANGE_3)
mbed_official 573:ad23fe03a082 458 {
mbed_official 573:ad23fe03a082 459 tmp_psize = FLASH_PSIZE_WORD;
mbed_official 573:ad23fe03a082 460 }
mbed_official 573:ad23fe03a082 461 else
mbed_official 573:ad23fe03a082 462 {
mbed_official 573:ad23fe03a082 463 tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
mbed_official 573:ad23fe03a082 464 }
mbed_official 573:ad23fe03a082 465
mbed_official 573:ad23fe03a082 466 /* If the previous operation is completed, proceed to erase the sector */
mbed_official 573:ad23fe03a082 467 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 573:ad23fe03a082 468 FLASH->CR |= tmp_psize;
mbed_official 573:ad23fe03a082 469 FLASH->CR &= SECTOR_MASK;
mbed_official 573:ad23fe03a082 470 FLASH->CR |= FLASH_CR_SER | (Sector << POSITION_VAL(FLASH_CR_SNB));
mbed_official 573:ad23fe03a082 471 FLASH->CR |= FLASH_CR_STRT;
mbed_official 573:ad23fe03a082 472
mbed_official 573:ad23fe03a082 473 /* Data synchronous Barrier (DSB) Just after the write operation
mbed_official 573:ad23fe03a082 474 This will force the CPU to respect the sequence of instruction (no optimization).*/
mbed_official 573:ad23fe03a082 475 __DSB();
mbed_official 573:ad23fe03a082 476 }
mbed_official 573:ad23fe03a082 477
mbed_official 573:ad23fe03a082 478 /**
mbed_official 573:ad23fe03a082 479 * @brief Enable the write protection of the desired bank1 or bank 2 sectors
mbed_official 573:ad23fe03a082 480 *
mbed_official 573:ad23fe03a082 481 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 573:ad23fe03a082 482 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 573:ad23fe03a082 483 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 573:ad23fe03a082 484 * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).
mbed_official 573:ad23fe03a082 485 *
mbed_official 573:ad23fe03a082 486 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 573:ad23fe03a082 487 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 488 * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_7
mbed_official 573:ad23fe03a082 489 * @arg OB_WRP_SECTOR_All
mbed_official 573:ad23fe03a082 490 *
mbed_official 573:ad23fe03a082 491 * @retval HAL FLASH State
mbed_official 573:ad23fe03a082 492 */
mbed_official 573:ad23fe03a082 493 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector)
mbed_official 573:ad23fe03a082 494 {
mbed_official 573:ad23fe03a082 495 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 496
mbed_official 573:ad23fe03a082 497 /* Check the parameters */
mbed_official 573:ad23fe03a082 498 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 573:ad23fe03a082 499
mbed_official 573:ad23fe03a082 500 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 501 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 502
mbed_official 573:ad23fe03a082 503 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 504 {
mbed_official 573:ad23fe03a082 505 /*Write protection enabled on sectors */
mbed_official 573:ad23fe03a082 506 FLASH->OPTCR &= (~WRPSector);
mbed_official 573:ad23fe03a082 507 }
mbed_official 573:ad23fe03a082 508
mbed_official 573:ad23fe03a082 509 return status;
mbed_official 573:ad23fe03a082 510 }
mbed_official 573:ad23fe03a082 511
mbed_official 573:ad23fe03a082 512 /**
mbed_official 573:ad23fe03a082 513 * @brief Disable the write protection of the desired bank1 or bank 2 sectors
mbed_official 573:ad23fe03a082 514 *
mbed_official 573:ad23fe03a082 515 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 573:ad23fe03a082 516 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 573:ad23fe03a082 517 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 573:ad23fe03a082 518 *
mbed_official 573:ad23fe03a082 519 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 573:ad23fe03a082 520 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 521 * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_7
mbed_official 573:ad23fe03a082 522 * @arg OB_WRP_Sector_All
mbed_official 573:ad23fe03a082 523 *
mbed_official 573:ad23fe03a082 524 *
mbed_official 573:ad23fe03a082 525 * @retval HAL Status
mbed_official 573:ad23fe03a082 526 */
mbed_official 573:ad23fe03a082 527 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector)
mbed_official 573:ad23fe03a082 528 {
mbed_official 573:ad23fe03a082 529 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 530
mbed_official 573:ad23fe03a082 531 /* Check the parameters */
mbed_official 573:ad23fe03a082 532 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 573:ad23fe03a082 533
mbed_official 573:ad23fe03a082 534 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 535 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 536
mbed_official 573:ad23fe03a082 537 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 538 {
mbed_official 573:ad23fe03a082 539 /* Write protection disabled on sectors */
mbed_official 573:ad23fe03a082 540 FLASH->OPTCR |= (WRPSector);
mbed_official 573:ad23fe03a082 541 }
mbed_official 573:ad23fe03a082 542
mbed_official 573:ad23fe03a082 543 return status;
mbed_official 573:ad23fe03a082 544 }
mbed_official 573:ad23fe03a082 545
mbed_official 573:ad23fe03a082 546
mbed_official 573:ad23fe03a082 547
mbed_official 573:ad23fe03a082 548
mbed_official 573:ad23fe03a082 549 /**
mbed_official 573:ad23fe03a082 550 * @brief Set the read protection level.
mbed_official 573:ad23fe03a082 551 * @param Level: specifies the read protection level.
mbed_official 573:ad23fe03a082 552 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 553 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 573:ad23fe03a082 554 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 573:ad23fe03a082 555 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 573:ad23fe03a082 556 *
mbed_official 573:ad23fe03a082 557 * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0
mbed_official 573:ad23fe03a082 558 *
mbed_official 573:ad23fe03a082 559 * @retval HAL Status
mbed_official 573:ad23fe03a082 560 */
mbed_official 573:ad23fe03a082 561 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint32_t Level)
mbed_official 573:ad23fe03a082 562 {
mbed_official 573:ad23fe03a082 563 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 564
mbed_official 573:ad23fe03a082 565 /* Check the parameters */
mbed_official 573:ad23fe03a082 566 assert_param(IS_OB_RDP_LEVEL(Level));
mbed_official 573:ad23fe03a082 567
mbed_official 573:ad23fe03a082 568 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 569 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 570
mbed_official 573:ad23fe03a082 571 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 572 {
mbed_official 573:ad23fe03a082 573 MODIFY_REG(FLASH->OPTCR, FLASH_OPTCR_RDP, Level);
mbed_official 573:ad23fe03a082 574 }
mbed_official 573:ad23fe03a082 575
mbed_official 573:ad23fe03a082 576 return status;
mbed_official 573:ad23fe03a082 577 }
mbed_official 573:ad23fe03a082 578
mbed_official 573:ad23fe03a082 579 /**
mbed_official 573:ad23fe03a082 580 * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
mbed_official 573:ad23fe03a082 581 * @param Wwdg: Selects the IWDG mode
mbed_official 573:ad23fe03a082 582 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 583 * @arg OB_WWDG_SW: Software WWDG selected
mbed_official 573:ad23fe03a082 584 * @arg OB_WWDG_HW: Hardware WWDG selected
mbed_official 573:ad23fe03a082 585 * @param Iwdg: Selects the WWDG mode
mbed_official 573:ad23fe03a082 586 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 587 * @arg OB_IWDG_SW: Software IWDG selected
mbed_official 573:ad23fe03a082 588 * @arg OB_IWDG_HW: Hardware IWDG selected
mbed_official 573:ad23fe03a082 589 * @param Stop: Reset event when entering STOP mode.
mbed_official 573:ad23fe03a082 590 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 591 * @arg OB_STOP_NO_RST: No reset generated when entering in STOP
mbed_official 573:ad23fe03a082 592 * @arg OB_STOP_RST: Reset generated when entering in STOP
mbed_official 573:ad23fe03a082 593 * @param Stdby: Reset event when entering Standby mode.
mbed_official 573:ad23fe03a082 594 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 595 * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY
mbed_official 573:ad23fe03a082 596 * @arg OB_STDBY_RST: Reset generated when entering in STANDBY
mbed_official 573:ad23fe03a082 597 * @param Iwdgstop: Independent watchdog counter freeze in Stop mode.
mbed_official 573:ad23fe03a082 598 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 599 * @arg OB_IWDG_STOP_FREEZE: Freeze IWDG counter in STOP
mbed_official 573:ad23fe03a082 600 * @arg OB_IWDG_STOP_ACTIVE: IWDG counter active in STOP
mbed_official 573:ad23fe03a082 601 * @param Iwdgstdby: Independent watchdog counter freeze in standby mode.
mbed_official 573:ad23fe03a082 602 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 603 * @arg OB_IWDG_STDBY_FREEZE: Freeze IWDG counter in STANDBY
mbed_official 573:ad23fe03a082 604 * @arg OB_IWDG_STDBY_ACTIVE: IWDG counter active in STANDBY
mbed_official 573:ad23fe03a082 605 * @retval HAL Status
mbed_official 573:ad23fe03a082 606 */
mbed_official 573:ad23fe03a082 607 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t Wwdg, uint32_t Iwdg, uint32_t Stop, uint32_t Stdby, uint32_t Iwdgstop, uint32_t Iwdgstdby )
mbed_official 573:ad23fe03a082 608 {
mbed_official 573:ad23fe03a082 609 uint32_t useroptionmask = 0x00;
mbed_official 573:ad23fe03a082 610 uint32_t useroptionvalue = 0x00;
mbed_official 573:ad23fe03a082 611
mbed_official 573:ad23fe03a082 612 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 613
mbed_official 573:ad23fe03a082 614 /* Check the parameters */
mbed_official 573:ad23fe03a082 615 assert_param(IS_OB_WWDG_SOURCE(Wwdg));
mbed_official 573:ad23fe03a082 616 assert_param(IS_OB_IWDG_SOURCE(Iwdg));
mbed_official 573:ad23fe03a082 617 assert_param(IS_OB_STOP_SOURCE(Stop));
mbed_official 573:ad23fe03a082 618 assert_param(IS_OB_STDBY_SOURCE(Stdby));
mbed_official 573:ad23fe03a082 619 assert_param(IS_OB_IWDG_STOP_FREEZE(Iwdgstop));
mbed_official 573:ad23fe03a082 620 assert_param(IS_OB_IWDG_STDBY_FREEZE(Iwdgstdby));
mbed_official 573:ad23fe03a082 621
mbed_official 573:ad23fe03a082 622 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 623 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 624
mbed_official 573:ad23fe03a082 625 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 626 {
mbed_official 573:ad23fe03a082 627 useroptionmask = (FLASH_OPTCR_WWDG_SW | FLASH_OPTCR_IWDG_SW | FLASH_OPTCR_nRST_STOP | \
mbed_official 573:ad23fe03a082 628 FLASH_OPTCR_nRST_STDBY | FLASH_OPTCR_IWDG_STOP | FLASH_OPTCR_IWDG_STDBY);
mbed_official 573:ad23fe03a082 629
mbed_official 573:ad23fe03a082 630 useroptionvalue = (Iwdg | Wwdg | Stop | Stdby | Iwdgstop | Iwdgstdby);
mbed_official 573:ad23fe03a082 631
mbed_official 573:ad23fe03a082 632 /* Update User Option Byte */
mbed_official 573:ad23fe03a082 633 MODIFY_REG(FLASH->OPTCR, useroptionmask, useroptionvalue);
mbed_official 573:ad23fe03a082 634 }
mbed_official 573:ad23fe03a082 635
mbed_official 573:ad23fe03a082 636 return status;
mbed_official 573:ad23fe03a082 637
mbed_official 573:ad23fe03a082 638 }
mbed_official 573:ad23fe03a082 639
mbed_official 573:ad23fe03a082 640 /**
mbed_official 573:ad23fe03a082 641 * @brief Set the BOR Level.
mbed_official 573:ad23fe03a082 642 * @param Level: specifies the Option Bytes BOR Reset Level.
mbed_official 573:ad23fe03a082 643 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 644 * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V
mbed_official 573:ad23fe03a082 645 * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V
mbed_official 573:ad23fe03a082 646 * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V
mbed_official 573:ad23fe03a082 647 * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V
mbed_official 573:ad23fe03a082 648 * @retval HAL Status
mbed_official 573:ad23fe03a082 649 */
mbed_official 573:ad23fe03a082 650 static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level)
mbed_official 573:ad23fe03a082 651 {
mbed_official 573:ad23fe03a082 652 /* Check the parameters */
mbed_official 573:ad23fe03a082 653 assert_param(IS_OB_BOR_LEVEL(Level));
mbed_official 573:ad23fe03a082 654
mbed_official 573:ad23fe03a082 655 /* Set the BOR Level */
mbed_official 573:ad23fe03a082 656 MODIFY_REG(FLASH->OPTCR, FLASH_OPTCR_BOR_LEV, Level);
mbed_official 573:ad23fe03a082 657
mbed_official 573:ad23fe03a082 658 return HAL_OK;
mbed_official 573:ad23fe03a082 659
mbed_official 573:ad23fe03a082 660 }
mbed_official 573:ad23fe03a082 661
mbed_official 573:ad23fe03a082 662 /**
mbed_official 573:ad23fe03a082 663 * @brief Configure Boot base address.
mbed_official 573:ad23fe03a082 664 *
mbed_official 573:ad23fe03a082 665 * @param BootOption : specifies Boot base address depending from Boot pin = 0 or pin = 1
mbed_official 573:ad23fe03a082 666 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 667 * @arg OPTIONBYTE_BOOTADDR_0 : Boot address based when Boot pin = 0
mbed_official 573:ad23fe03a082 668 * @arg OPTIONBYTE_BOOTADDR_1 : Boot address based when Boot pin = 1
mbed_official 573:ad23fe03a082 669 * @param Address: specifies Boot base address
mbed_official 573:ad23fe03a082 670 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 671 * @arg OB_BOOTADDR_ITCM_RAM : Boot from ITCM RAM (0x00000000)
mbed_official 573:ad23fe03a082 672 * @arg OB_BOOTADDR_SYSTEM : Boot from System memory bootloader (0x00100000)
mbed_official 573:ad23fe03a082 673 * @arg OB_BOOTADDR_ITCM_FLASH : Boot from Flash on ITCM interface (0x00200000)
mbed_official 573:ad23fe03a082 674 * @arg OB_BOOTADDR_AXIM_FLASH : Boot from Flash on AXIM interface (0x08000000)
mbed_official 573:ad23fe03a082 675 * @arg OB_BOOTADDR_DTCM_RAM : Boot from DTCM RAM (0x20000000)
mbed_official 573:ad23fe03a082 676 * @arg OB_BOOTADDR_SRAM1 : Boot from SRAM1 (0x20010000)
mbed_official 573:ad23fe03a082 677 * @arg OB_BOOTADDR_SRAM2 : Boot from SRAM2 (0x2004C000)
mbed_official 573:ad23fe03a082 678 *
mbed_official 573:ad23fe03a082 679 * @retval HAL Status
mbed_official 573:ad23fe03a082 680 */
mbed_official 573:ad23fe03a082 681 static HAL_StatusTypeDef FLASH_OB_BootAddressConfig(uint32_t BootOption, uint32_t Address)
mbed_official 573:ad23fe03a082 682 {
mbed_official 573:ad23fe03a082 683 HAL_StatusTypeDef status = HAL_OK;
mbed_official 573:ad23fe03a082 684
mbed_official 573:ad23fe03a082 685 /* Check the parameters */
mbed_official 573:ad23fe03a082 686 assert_param(IS_OB_BOOT_ADDRESS(Address));
mbed_official 573:ad23fe03a082 687
mbed_official 573:ad23fe03a082 688 /* Wait for last operation to be completed */
mbed_official 573:ad23fe03a082 689 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 573:ad23fe03a082 690
mbed_official 573:ad23fe03a082 691 if(status == HAL_OK)
mbed_official 573:ad23fe03a082 692 {
mbed_official 573:ad23fe03a082 693 if(BootOption == OPTIONBYTE_BOOTADDR_0)
mbed_official 573:ad23fe03a082 694 {
mbed_official 573:ad23fe03a082 695 MODIFY_REG(FLASH->OPTCR1, FLASH_OPTCR1_BOOT_ADD0, Address);
mbed_official 573:ad23fe03a082 696 }
mbed_official 573:ad23fe03a082 697 else
mbed_official 573:ad23fe03a082 698 {
mbed_official 573:ad23fe03a082 699 MODIFY_REG(FLASH->OPTCR1, FLASH_OPTCR1_BOOT_ADD1, (Address << 16));
mbed_official 573:ad23fe03a082 700 }
mbed_official 573:ad23fe03a082 701 }
mbed_official 573:ad23fe03a082 702
mbed_official 573:ad23fe03a082 703 return status;
mbed_official 573:ad23fe03a082 704 }
mbed_official 573:ad23fe03a082 705
mbed_official 573:ad23fe03a082 706 /**
mbed_official 573:ad23fe03a082 707 * @brief Return the FLASH User Option Byte value.
mbed_official 573:ad23fe03a082 708 * @retval uint32_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1)
mbed_official 573:ad23fe03a082 709 * and RST_STDBY(Bit2).
mbed_official 573:ad23fe03a082 710 */
mbed_official 573:ad23fe03a082 711 static uint32_t FLASH_OB_GetUser(void)
mbed_official 573:ad23fe03a082 712 {
mbed_official 573:ad23fe03a082 713 /* Return the User Option Byte */
mbed_official 573:ad23fe03a082 714 return ((uint32_t)(FLASH->OPTCR & 0xC00000F0));
mbed_official 573:ad23fe03a082 715 }
mbed_official 573:ad23fe03a082 716
mbed_official 573:ad23fe03a082 717 /**
mbed_official 573:ad23fe03a082 718 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 573:ad23fe03a082 719 * @retval uint32_t FLASH Write Protection Option Bytes value
mbed_official 573:ad23fe03a082 720 */
mbed_official 573:ad23fe03a082 721 static uint32_t FLASH_OB_GetWRP(void)
mbed_official 573:ad23fe03a082 722 {
mbed_official 573:ad23fe03a082 723 /* Return the FLASH write protection Register value */
mbed_official 573:ad23fe03a082 724 return ((uint32_t)(FLASH->OPTCR & 0x00FF0000));
mbed_official 573:ad23fe03a082 725 }
mbed_official 573:ad23fe03a082 726
mbed_official 573:ad23fe03a082 727 /**
mbed_official 573:ad23fe03a082 728 * @brief Returns the FLASH Read Protection level.
mbed_official 573:ad23fe03a082 729 * @retval FlagStatus FLASH ReadOut Protection Status:
mbed_official 610:813dcc80987e 730 * This parameter can be one of the following values:
mbed_official 610:813dcc80987e 731 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 610:813dcc80987e 732 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 610:813dcc80987e 733 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 573:ad23fe03a082 734 */
mbed_official 610:813dcc80987e 735 static uint8_t FLASH_OB_GetRDP(void)
mbed_official 573:ad23fe03a082 736 {
mbed_official 610:813dcc80987e 737 uint8_t readstatus = OB_RDP_LEVEL_0;
mbed_official 610:813dcc80987e 738
mbed_official 610:813dcc80987e 739 if (((FLASH->OPTCR & FLASH_OPTCR_RDP) >> 8) == OB_RDP_LEVEL_0)
mbed_official 610:813dcc80987e 740 {
mbed_official 610:813dcc80987e 741 readstatus = OB_RDP_LEVEL_0;
mbed_official 610:813dcc80987e 742 }
mbed_official 610:813dcc80987e 743 else if (((FLASH->OPTCR & FLASH_OPTCR_RDP) >> 8) == OB_RDP_LEVEL_2)
mbed_official 573:ad23fe03a082 744 {
mbed_official 610:813dcc80987e 745 readstatus = OB_RDP_LEVEL_2;
mbed_official 573:ad23fe03a082 746 }
mbed_official 610:813dcc80987e 747 else
mbed_official 610:813dcc80987e 748 {
mbed_official 610:813dcc80987e 749 readstatus = OB_RDP_LEVEL_1;
mbed_official 610:813dcc80987e 750 }
mbed_official 610:813dcc80987e 751
mbed_official 573:ad23fe03a082 752 return readstatus;
mbed_official 573:ad23fe03a082 753 }
mbed_official 573:ad23fe03a082 754
mbed_official 573:ad23fe03a082 755 /**
mbed_official 573:ad23fe03a082 756 * @brief Returns the FLASH BOR level.
mbed_official 573:ad23fe03a082 757 * @retval uint32_t The FLASH BOR level:
mbed_official 573:ad23fe03a082 758 * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V
mbed_official 573:ad23fe03a082 759 * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V
mbed_official 573:ad23fe03a082 760 * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V
mbed_official 573:ad23fe03a082 761 * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V
mbed_official 573:ad23fe03a082 762 */
mbed_official 573:ad23fe03a082 763 static uint32_t FLASH_OB_GetBOR(void)
mbed_official 573:ad23fe03a082 764 {
mbed_official 573:ad23fe03a082 765 /* Return the FLASH BOR level */
mbed_official 573:ad23fe03a082 766 return ((uint32_t)(FLASH->OPTCR & 0x0C));
mbed_official 573:ad23fe03a082 767 }
mbed_official 573:ad23fe03a082 768
mbed_official 573:ad23fe03a082 769 /**
mbed_official 573:ad23fe03a082 770 * @brief Configure Boot base address.
mbed_official 573:ad23fe03a082 771 *
mbed_official 573:ad23fe03a082 772 * @param BootOption : specifies Boot base address depending from Boot pin = 0 or pin = 1
mbed_official 573:ad23fe03a082 773 * This parameter can be one of the following values:
mbed_official 573:ad23fe03a082 774 * @arg OPTIONBYTE_BOOTADDR_0 : Boot address based when Boot pin = 0
mbed_official 573:ad23fe03a082 775 * @arg OPTIONBYTE_BOOTADDR_1 : Boot address based when Boot pin = 1
mbed_official 573:ad23fe03a082 776 *
mbed_official 573:ad23fe03a082 777 * @retval uint32_t Boot Base Address:
mbed_official 573:ad23fe03a082 778 * - OB_BOOTADDR_ITCM_RAM : Boot from ITCM RAM (0x00000000)
mbed_official 573:ad23fe03a082 779 * - OB_BOOTADDR_SYSTEM : Boot from System memory bootloader (0x00100000)
mbed_official 573:ad23fe03a082 780 * - OB_BOOTADDR_ITCM_FLASH : Boot from Flash on ITCM interface (0x00200000)
mbed_official 573:ad23fe03a082 781 * - OB_BOOTADDR_AXIM_FLASH : Boot from Flash on AXIM interface (0x08000000)
mbed_official 573:ad23fe03a082 782 * - OB_BOOTADDR_DTCM_RAM : Boot from DTCM RAM (0x20000000)
mbed_official 573:ad23fe03a082 783 * - OB_BOOTADDR_SRAM1 : Boot from SRAM1 (0x20010000)
mbed_official 573:ad23fe03a082 784 * - OB_BOOTADDR_SRAM2 : Boot from SRAM2 (0x2004C000)
mbed_official 573:ad23fe03a082 785 */
mbed_official 573:ad23fe03a082 786 static uint32_t FLASH_OB_GetBootAddress(uint32_t BootOption)
mbed_official 573:ad23fe03a082 787 {
mbed_official 573:ad23fe03a082 788 uint32_t Address = 0;
mbed_official 573:ad23fe03a082 789
mbed_official 573:ad23fe03a082 790 /* Return the Boot base Address */
mbed_official 573:ad23fe03a082 791 if(BootOption == OPTIONBYTE_BOOTADDR_0)
mbed_official 573:ad23fe03a082 792 {
mbed_official 573:ad23fe03a082 793 Address = FLASH->OPTCR1 & FLASH_OPTCR1_BOOT_ADD0;
mbed_official 573:ad23fe03a082 794 }
mbed_official 573:ad23fe03a082 795 else
mbed_official 573:ad23fe03a082 796 {
mbed_official 573:ad23fe03a082 797 Address = ((FLASH->OPTCR1 & FLASH_OPTCR1_BOOT_ADD1) >> 16);
mbed_official 573:ad23fe03a082 798 }
mbed_official 573:ad23fe03a082 799
mbed_official 573:ad23fe03a082 800 return Address;
mbed_official 573:ad23fe03a082 801 }
mbed_official 573:ad23fe03a082 802
mbed_official 573:ad23fe03a082 803 /**
mbed_official 573:ad23fe03a082 804 * @}
mbed_official 573:ad23fe03a082 805 */
mbed_official 573:ad23fe03a082 806
mbed_official 573:ad23fe03a082 807 #endif /* HAL_FLASH_MODULE_ENABLED */
mbed_official 573:ad23fe03a082 808
mbed_official 573:ad23fe03a082 809 /**
mbed_official 573:ad23fe03a082 810 * @}
mbed_official 573:ad23fe03a082 811 */
mbed_official 573:ad23fe03a082 812
mbed_official 573:ad23fe03a082 813 /**
mbed_official 573:ad23fe03a082 814 * @}
mbed_official 573:ad23fe03a082 815 */
mbed_official 573:ad23fe03a082 816
mbed_official 573:ad23fe03a082 817 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/