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:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_flash_ex.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 87:085cde657901 5 * @version V1.0.0RC2
mbed_official 87:085cde657901 6 * @date 04-February-2014
mbed_official 87:085cde657901 7 * @brief Extended FLASH HAL module driver.
mbed_official 87:085cde657901 8 * This file provides firmware functions to manage the following
mbed_official 87:085cde657901 9 * functionalities of the FLASH extension peripheral:
mbed_official 87:085cde657901 10 * + Extended programming operations functions
mbed_official 87:085cde657901 11 *
mbed_official 87:085cde657901 12 @verbatim
mbed_official 87:085cde657901 13 ==============================================================================
mbed_official 87:085cde657901 14 ##### Flash Extension features #####
mbed_official 87:085cde657901 15 ==============================================================================
mbed_official 87:085cde657901 16
mbed_official 87:085cde657901 17 [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and
mbed_official 87:085cde657901 18 STM32F429xx/439xx devices contains the following additional features
mbed_official 87:085cde657901 19
mbed_official 87:085cde657901 20 (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write
mbed_official 87:085cde657901 21 capability (RWW)
mbed_official 87:085cde657901 22 (+) Dual bank memory organization
mbed_official 87:085cde657901 23 (+) PCROP protection for all banks
mbed_official 87:085cde657901 24
mbed_official 87:085cde657901 25 ##### How to use this driver #####
mbed_official 87:085cde657901 26 ==============================================================================
mbed_official 87:085cde657901 27 [..] This driver provides functions to configure and program the FLASH memory
mbed_official 87:085cde657901 28 of all STM32F427xx/437xx andSTM32F429xx/439xx devices. It includes
mbed_official 87:085cde657901 29 (#) FLASH Memory Erase functions:
mbed_official 87:085cde657901 30 (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and
mbed_official 87:085cde657901 31 HAL_FLASH_Lock() functions
mbed_official 87:085cde657901 32 (++) Erase function: Erase sector, erase all sectors
mbed_official 87:085cde657901 33 (++) There is two mode of erase :
mbed_official 87:085cde657901 34 (+++) Polling Mode using HAL_FLASHEx_Erase()
mbed_official 87:085cde657901 35 (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()
mbed_official 87:085cde657901 36
mbed_official 87:085cde657901 37 (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to :
mbed_official 87:085cde657901 38 (++) Set/Reset the write protection
mbed_official 87:085cde657901 39 (++) Set the Read protection Level
mbed_official 87:085cde657901 40 (++) Set the BOR level
mbed_official 87:085cde657901 41 (++) Program the user Option Bytes
mbed_official 87:085cde657901 42 (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to :
mbed_official 87:085cde657901 43 (++) Extended space (bank 2) erase function
mbed_official 87:085cde657901 44 (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2)
mbed_official 87:085cde657901 45 (++) Dual Boot actrivation
mbed_official 87:085cde657901 46 (++) Write protection configuration for bank 2
mbed_official 87:085cde657901 47 (++) PCROP protection configuration and control for both banks
mbed_official 87:085cde657901 48
mbed_official 87:085cde657901 49 @endverbatim
mbed_official 87:085cde657901 50 ******************************************************************************
mbed_official 87:085cde657901 51 * @attention
mbed_official 87:085cde657901 52 *
mbed_official 87:085cde657901 53 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 54 *
mbed_official 87:085cde657901 55 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 56 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 57 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 58 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 59 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 60 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 61 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 62 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 63 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 64 * without specific prior written permission.
mbed_official 87:085cde657901 65 *
mbed_official 87:085cde657901 66 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 67 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 68 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 69 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 70 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 72 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 73 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 74 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 75 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 76 *
mbed_official 87:085cde657901 77 ******************************************************************************
mbed_official 87:085cde657901 78 */
mbed_official 87:085cde657901 79
mbed_official 87:085cde657901 80 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 81 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 82
mbed_official 87:085cde657901 83 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 84 * @{
mbed_official 87:085cde657901 85 */
mbed_official 87:085cde657901 86
mbed_official 87:085cde657901 87 /** @defgroup FLASHEx
mbed_official 87:085cde657901 88 * @brief FLASH HAL Extension module driver
mbed_official 87:085cde657901 89 * @{
mbed_official 87:085cde657901 90 */
mbed_official 87:085cde657901 91
mbed_official 87:085cde657901 92 #ifdef HAL_FLASH_MODULE_ENABLED
mbed_official 87:085cde657901 93
mbed_official 87:085cde657901 94 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 95 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 96 #define SECTOR_MASK ((uint32_t)0xFFFFFF07)
mbed_official 87:085cde657901 97
mbed_official 87:085cde657901 98 #define HAL_FLASH_TIMEOUT_VALUE ((uint32_t)50000)/* 50 s */
mbed_official 87:085cde657901 99 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 100 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 101 extern FLASH_ProcessTypeDef pFlash;
mbed_official 87:085cde657901 102
mbed_official 87:085cde657901 103 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 104 /* Option bytes control */
mbed_official 87:085cde657901 105 static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks);
mbed_official 87:085cde657901 106 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks);
mbed_official 87:085cde657901 107 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks);
mbed_official 87:085cde657901 108 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level);
mbed_official 87:085cde657901 109 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby);
mbed_official 87:085cde657901 110 static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level);
mbed_official 87:085cde657901 111 static uint8_t FLASH_OB_GetUser(void);
mbed_official 87:085cde657901 112 static uint16_t FLASH_OB_GetWRP(void);
mbed_official 87:085cde657901 113 static FlagStatus FLASH_OB_GetRDP(void);
mbed_official 87:085cde657901 114 static uint8_t FLASH_OB_GetBOR(void);
mbed_official 87:085cde657901 115
mbed_official 87:085cde657901 116 #if defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 117 static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector);
mbed_official 87:085cde657901 118 static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector);
mbed_official 87:085cde657901 119 #endif /* STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 120
mbed_official 87:085cde657901 121 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx)
mbed_official 87:085cde657901 122 static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks);
mbed_official 87:085cde657901 123 static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks);
mbed_official 87:085cde657901 124 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig);
mbed_official 87:085cde657901 125 #endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx */
mbed_official 87:085cde657901 126
mbed_official 87:085cde657901 127 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 128 extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
mbed_official 87:085cde657901 129
mbed_official 87:085cde657901 130 /** @defgroup FLASHEx_Private_Functions Extended FLASH Private functions
mbed_official 87:085cde657901 131 * @{
mbed_official 87:085cde657901 132 */
mbed_official 87:085cde657901 133
mbed_official 87:085cde657901 134 /** @defgroup FLASHEx_Group1 Extended IO operation functions
mbed_official 87:085cde657901 135 * @brief Extended IO operation functions
mbed_official 87:085cde657901 136 *
mbed_official 87:085cde657901 137 @verbatim
mbed_official 87:085cde657901 138 ===============================================================================
mbed_official 87:085cde657901 139 ##### Extended programming operation functions #####
mbed_official 87:085cde657901 140 ===============================================================================
mbed_official 87:085cde657901 141 [..]
mbed_official 87:085cde657901 142 This subsection provides a set of functions allowing to manage the Extension FLASH
mbed_official 87:085cde657901 143 programming operations Operations.
mbed_official 87:085cde657901 144
mbed_official 87:085cde657901 145 @endverbatim
mbed_official 87:085cde657901 146 * @{
mbed_official 87:085cde657901 147 */
mbed_official 87:085cde657901 148 /**
mbed_official 87:085cde657901 149 * @brief Perform a mass erase or erase the specified FLASH memory sectors
mbed_official 87:085cde657901 150 * @param[in] pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 87:085cde657901 151 * contains the configuration information for the erasing.
mbed_official 87:085cde657901 152 *
mbed_official 87:085cde657901 153 * @param[out] SectorError: pointer to variable that
mbed_official 87:085cde657901 154 * contains the configuration information on faulty sector in case of error
mbed_official 87:085cde657901 155 * (0xFFFFFFFF means that all the sectors have been correctly erased)
mbed_official 87:085cde657901 156 *
mbed_official 87:085cde657901 157 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 158 */
mbed_official 87:085cde657901 159 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
mbed_official 87:085cde657901 160 {
mbed_official 87:085cde657901 161 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 87:085cde657901 162 uint32_t index = 0;
mbed_official 87:085cde657901 163
mbed_official 87:085cde657901 164 /* Process Locked */
mbed_official 87:085cde657901 165 __HAL_LOCK(&pFlash);
mbed_official 87:085cde657901 166
mbed_official 87:085cde657901 167 /* Check the parameters */
mbed_official 87:085cde657901 168 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
mbed_official 87:085cde657901 169
mbed_official 87:085cde657901 170 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 171 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 172
mbed_official 87:085cde657901 173 if (status == HAL_OK)
mbed_official 87:085cde657901 174 {
mbed_official 87:085cde657901 175 /*Initialization of SectorError variable*/
mbed_official 87:085cde657901 176 *SectorError = 0xFFFFFFFF;
mbed_official 87:085cde657901 177
mbed_official 87:085cde657901 178 if (pEraseInit->TypeErase == TYPEERASE_MASSERASE)
mbed_official 87:085cde657901 179 {
mbed_official 87:085cde657901 180 /*Mass erase to be done*/
mbed_official 87:085cde657901 181 FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks);
mbed_official 87:085cde657901 182
mbed_official 87:085cde657901 183 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 184 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 185
mbed_official 87:085cde657901 186 /* if the erase operation is completed, disable the MER Bit */
mbed_official 87:085cde657901 187 FLASH->CR &= (~FLASH_MER_BIT);
mbed_official 87:085cde657901 188 }
mbed_official 87:085cde657901 189 else
mbed_official 87:085cde657901 190 {
mbed_official 87:085cde657901 191 /* Check the parameters */
mbed_official 87:085cde657901 192 assert_param(IS_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
mbed_official 87:085cde657901 193
mbed_official 87:085cde657901 194 /* Erase by sector by sector to be done*/
mbed_official 87:085cde657901 195 for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++)
mbed_official 87:085cde657901 196 {
mbed_official 87:085cde657901 197 FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange);
mbed_official 87:085cde657901 198
mbed_official 87:085cde657901 199 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 200 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 201
mbed_official 87:085cde657901 202 /* If the erase operation is completed, disable the SER Bit */
mbed_official 87:085cde657901 203 FLASH->CR &= (~FLASH_CR_SER);
mbed_official 87:085cde657901 204 FLASH->CR &= SECTOR_MASK;
mbed_official 87:085cde657901 205
mbed_official 87:085cde657901 206 if (status != HAL_OK)
mbed_official 87:085cde657901 207 {
mbed_official 87:085cde657901 208 /* In case of error, stop erase procedure and return the faulty sector*/
mbed_official 87:085cde657901 209 *SectorError = index;
mbed_official 87:085cde657901 210 break;
mbed_official 87:085cde657901 211 }
mbed_official 87:085cde657901 212 }
mbed_official 87:085cde657901 213 }
mbed_official 87:085cde657901 214 }
mbed_official 87:085cde657901 215
mbed_official 87:085cde657901 216 /* Process Unlocked */
mbed_official 87:085cde657901 217 __HAL_UNLOCK(&pFlash);
mbed_official 87:085cde657901 218
mbed_official 87:085cde657901 219 return status;
mbed_official 87:085cde657901 220 }
mbed_official 87:085cde657901 221
mbed_official 87:085cde657901 222 /**
mbed_official 87:085cde657901 223 * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled
mbed_official 87:085cde657901 224 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 87:085cde657901 225 * contains the configuration information for the erasing.
mbed_official 87:085cde657901 226 *
mbed_official 87:085cde657901 227 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 228 */
mbed_official 87:085cde657901 229 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
mbed_official 87:085cde657901 230 {
mbed_official 87:085cde657901 231 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 232
mbed_official 87:085cde657901 233 /* Process Locked */
mbed_official 87:085cde657901 234 __HAL_LOCK(&pFlash);
mbed_official 87:085cde657901 235
mbed_official 87:085cde657901 236 /* Check the parameters */
mbed_official 87:085cde657901 237 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
mbed_official 87:085cde657901 238
mbed_official 87:085cde657901 239 /* Enable End of FLASH Operation interrupt */
mbed_official 87:085cde657901 240 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
mbed_official 87:085cde657901 241
mbed_official 87:085cde657901 242 /* Enable Error source interrupt */
mbed_official 87:085cde657901 243 __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
mbed_official 87:085cde657901 244
mbed_official 87:085cde657901 245 /* Clear pending flags (if any) */
mbed_official 87:085cde657901 246 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\
mbed_official 87:085cde657901 247 FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR);
mbed_official 87:085cde657901 248
mbed_official 87:085cde657901 249 if (pEraseInit->TypeErase == TYPEERASE_MASSERASE)
mbed_official 87:085cde657901 250 {
mbed_official 87:085cde657901 251 /*Mass erase to be done*/
mbed_official 87:085cde657901 252 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
mbed_official 87:085cde657901 253 pFlash.Bank = pEraseInit->Banks;
mbed_official 87:085cde657901 254 FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks);
mbed_official 87:085cde657901 255 }
mbed_official 87:085cde657901 256 else
mbed_official 87:085cde657901 257 {
mbed_official 87:085cde657901 258 /* Erase by sector to be done*/
mbed_official 87:085cde657901 259
mbed_official 87:085cde657901 260 /* Check the parameters */
mbed_official 87:085cde657901 261 assert_param(IS_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector));
mbed_official 87:085cde657901 262
mbed_official 87:085cde657901 263 pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE;
mbed_official 87:085cde657901 264 pFlash.NbSectorsToErase = pEraseInit->NbSectors;
mbed_official 87:085cde657901 265 pFlash.Sector = pEraseInit->Sector;
mbed_official 87:085cde657901 266 pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange;
mbed_official 87:085cde657901 267
mbed_official 87:085cde657901 268 /*Erase 1st sector and wait for IT*/
mbed_official 87:085cde657901 269 FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange);
mbed_official 87:085cde657901 270 }
mbed_official 87:085cde657901 271
mbed_official 87:085cde657901 272 return status;
mbed_official 87:085cde657901 273 }
mbed_official 87:085cde657901 274
mbed_official 87:085cde657901 275 /**
mbed_official 87:085cde657901 276 * @brief Program option bytes
mbed_official 87:085cde657901 277 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 87:085cde657901 278 * contains the configuration information for the programming.
mbed_official 87:085cde657901 279 *
mbed_official 87:085cde657901 280 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 281 */
mbed_official 87:085cde657901 282 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 87:085cde657901 283 {
mbed_official 87:085cde657901 284 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 87:085cde657901 285
mbed_official 87:085cde657901 286 /* Process Locked */
mbed_official 87:085cde657901 287 __HAL_LOCK(&pFlash);
mbed_official 87:085cde657901 288
mbed_official 87:085cde657901 289 /* Check the parameters */
mbed_official 87:085cde657901 290 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
mbed_official 87:085cde657901 291
mbed_official 87:085cde657901 292 /*Write protection configuration*/
mbed_official 87:085cde657901 293 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
mbed_official 87:085cde657901 294 {
mbed_official 87:085cde657901 295 assert_param(IS_WRPSTATE(pOBInit->WRPState));
mbed_official 87:085cde657901 296 if (pOBInit->WRPState == WRPSTATE_ENABLE)
mbed_official 87:085cde657901 297 {
mbed_official 87:085cde657901 298 /*Enable of Write protection on the selected Sector*/
mbed_official 87:085cde657901 299 status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks);
mbed_official 87:085cde657901 300 }
mbed_official 87:085cde657901 301 else
mbed_official 87:085cde657901 302 {
mbed_official 87:085cde657901 303 /*Disable of Write protection on the selected Sector*/
mbed_official 87:085cde657901 304 status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks);
mbed_official 87:085cde657901 305 }
mbed_official 87:085cde657901 306 }
mbed_official 87:085cde657901 307
mbed_official 87:085cde657901 308 /*Read protection configuration*/
mbed_official 87:085cde657901 309 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
mbed_official 87:085cde657901 310 {
mbed_official 87:085cde657901 311 status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
mbed_official 87:085cde657901 312 }
mbed_official 87:085cde657901 313
mbed_official 87:085cde657901 314 /*USER configuration*/
mbed_official 87:085cde657901 315 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
mbed_official 87:085cde657901 316 {
mbed_official 87:085cde657901 317 status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW,
mbed_official 87:085cde657901 318 pOBInit->USERConfig&OB_STOP_NO_RST,
mbed_official 87:085cde657901 319 pOBInit->USERConfig&OB_STDBY_NO_RST);
mbed_official 87:085cde657901 320 }
mbed_official 87:085cde657901 321
mbed_official 87:085cde657901 322 /*BOR Level configuration*/
mbed_official 87:085cde657901 323 if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
mbed_official 87:085cde657901 324 {
mbed_official 87:085cde657901 325 status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel);
mbed_official 87:085cde657901 326 }
mbed_official 87:085cde657901 327
mbed_official 87:085cde657901 328 /* Process Unlocked */
mbed_official 87:085cde657901 329 __HAL_UNLOCK(&pFlash);
mbed_official 87:085cde657901 330
mbed_official 87:085cde657901 331 return status;
mbed_official 87:085cde657901 332 }
mbed_official 87:085cde657901 333
mbed_official 87:085cde657901 334 /**
mbed_official 87:085cde657901 335 * @brief Get the Option byte configuration
mbed_official 87:085cde657901 336 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 87:085cde657901 337 * contains the configuration information for the programming.
mbed_official 87:085cde657901 338 *
mbed_official 87:085cde657901 339 * @retval None
mbed_official 87:085cde657901 340 */
mbed_official 87:085cde657901 341 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 87:085cde657901 342 {
mbed_official 87:085cde657901 343 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR;
mbed_official 87:085cde657901 344
mbed_official 87:085cde657901 345 /*Get WRP*/
mbed_official 87:085cde657901 346 pOBInit->WRPSector = FLASH_OB_GetWRP();
mbed_official 87:085cde657901 347
mbed_official 87:085cde657901 348 /*Get RDP Level*/
mbed_official 87:085cde657901 349 pOBInit->RDPLevel = FLASH_OB_GetRDP();
mbed_official 87:085cde657901 350
mbed_official 87:085cde657901 351 /*Get USER*/
mbed_official 87:085cde657901 352 pOBInit->USERConfig = FLASH_OB_GetUser();
mbed_official 87:085cde657901 353
mbed_official 87:085cde657901 354 /*Get BOR Level*/
mbed_official 87:085cde657901 355 pOBInit->BORLevel = FLASH_OB_GetBOR();
mbed_official 87:085cde657901 356 }
mbed_official 87:085cde657901 357
mbed_official 87:085cde657901 358 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 359 /**
mbed_official 87:085cde657901 360 * @brief Program option bytes
mbed_official 87:085cde657901 361 * @param pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
mbed_official 87:085cde657901 362 * contains the configuration information for the programming.
mbed_official 87:085cde657901 363 *
mbed_official 87:085cde657901 364 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 365 */
mbed_official 87:085cde657901 366 HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
mbed_official 87:085cde657901 367 {
mbed_official 87:085cde657901 368 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 87:085cde657901 369
mbed_official 87:085cde657901 370 /* Check the parameters */
mbed_official 87:085cde657901 371 assert_param(IS_OBEX(pAdvOBInit->OptionType));
mbed_official 87:085cde657901 372
mbed_official 87:085cde657901 373 /*Program PCROP option byte*/
mbed_official 87:085cde657901 374 if (((pAdvOBInit->OptionType) & OBEX_PCROP) == OBEX_PCROP)
mbed_official 87:085cde657901 375 {
mbed_official 87:085cde657901 376 /* Check the parameters */
mbed_official 87:085cde657901 377 assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState));
mbed_official 87:085cde657901 378 if ((pAdvOBInit->PCROPState) == PCROPSTATE_ENABLE)
mbed_official 87:085cde657901 379 {
mbed_official 87:085cde657901 380 /*Enable of Write protection on the selected Sector*/
mbed_official 87:085cde657901 381 #if defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 382 status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors);
mbed_official 87:085cde657901 383 #else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx */
mbed_official 87:085cde657901 384 status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks);
mbed_official 87:085cde657901 385 #endif /* STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 386 }
mbed_official 87:085cde657901 387 else
mbed_official 87:085cde657901 388 {
mbed_official 87:085cde657901 389 /*Disable of Write protection on the selected Sector*/
mbed_official 87:085cde657901 390 #if defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 391 status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors);
mbed_official 87:085cde657901 392 #else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx */
mbed_official 87:085cde657901 393 status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks);
mbed_official 87:085cde657901 394 #endif /* STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 395 }
mbed_official 87:085cde657901 396 }
mbed_official 87:085cde657901 397
mbed_official 87:085cde657901 398 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx)
mbed_official 87:085cde657901 399 /*Program BOOT config option byte*/
mbed_official 87:085cde657901 400 if (((pAdvOBInit->OptionType) & OBEX_BOOTCONFIG) == OBEX_BOOTCONFIG)
mbed_official 87:085cde657901 401 {
mbed_official 87:085cde657901 402 status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig);
mbed_official 87:085cde657901 403 }
mbed_official 87:085cde657901 404 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 405
mbed_official 87:085cde657901 406 return status;
mbed_official 87:085cde657901 407 }
mbed_official 87:085cde657901 408
mbed_official 87:085cde657901 409 /**
mbed_official 87:085cde657901 410 * @brief Get the OBEX byte configuration
mbed_official 87:085cde657901 411 * @param pAdvOBInit: pointer to an FLASH_AdvOBProgramInitTypeDef structure that
mbed_official 87:085cde657901 412 * contains the configuration information for the programming.
mbed_official 87:085cde657901 413 *
mbed_official 87:085cde657901 414 * @retval None
mbed_official 87:085cde657901 415 */
mbed_official 87:085cde657901 416 void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
mbed_official 87:085cde657901 417 {
mbed_official 87:085cde657901 418 #if defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 419 /*Get Sector*/
mbed_official 87:085cde657901 420 pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS));
mbed_official 87:085cde657901 421 #else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx */
mbed_official 87:085cde657901 422 /*Get Sector for Bank1*/
mbed_official 87:085cde657901 423 pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS));
mbed_official 87:085cde657901 424
mbed_official 87:085cde657901 425 /*Get Sector for Bank2*/
mbed_official 87:085cde657901 426 pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS));
mbed_official 87:085cde657901 427
mbed_official 87:085cde657901 428 /*Get Boot config OB*/
mbed_official 87:085cde657901 429 pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS;
mbed_official 87:085cde657901 430 #endif /* STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 431 }
mbed_official 87:085cde657901 432
mbed_official 87:085cde657901 433 /**
mbed_official 87:085cde657901 434 * @brief Select the Protection Mode
mbed_official 87:085cde657901 435 *
mbed_official 87:085cde657901 436 * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted
mbed_official 87:085cde657901 437 * Global Read Out Protection modification (from level1 to level0)
mbed_official 87:085cde657901 438 * @note Once SPRMOD bit is active unprotection of a protected sector is not possible
mbed_official 87:085cde657901 439 * @note Read a prtotected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
mbed_official 87:085cde657901 440 * @note This function can be used only for STM32F427xx/STM32F429xx/STM32F437xx/STM32F439xx/STM32F401xx devices.
mbed_official 87:085cde657901 441 *
mbed_official 87:085cde657901 442 * @param None
mbed_official 87:085cde657901 443 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 444 */
mbed_official 87:085cde657901 445 HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void)
mbed_official 87:085cde657901 446 {
mbed_official 87:085cde657901 447 uint8_t optiontmp = 0xFF;
mbed_official 87:085cde657901 448
mbed_official 87:085cde657901 449 /* Mask SPRMOD bit */
mbed_official 87:085cde657901 450 optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F);
mbed_official 87:085cde657901 451
mbed_official 87:085cde657901 452 /* Update Option Byte */
mbed_official 87:085cde657901 453 *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp);
mbed_official 87:085cde657901 454
mbed_official 87:085cde657901 455 return HAL_OK;
mbed_official 87:085cde657901 456
mbed_official 87:085cde657901 457 }
mbed_official 87:085cde657901 458
mbed_official 87:085cde657901 459 /**
mbed_official 87:085cde657901 460 * @brief Deselect the Protection Mode
mbed_official 87:085cde657901 461 *
mbed_official 87:085cde657901 462 * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted
mbed_official 87:085cde657901 463 * Global Read Out Protection modification (from level1 to level0)
mbed_official 87:085cde657901 464 * @note Once SPRMOD bit is active unprotection of a protected sector is not possible
mbed_official 87:085cde657901 465 * @note Read a prtotected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
mbed_official 87:085cde657901 466 * @note This function can be used only for STM32F427xx/STM32F429xx/STM32F437xx/STM32F439xx/STM32F401xx devices.
mbed_official 87:085cde657901 467 *
mbed_official 87:085cde657901 468 * @param None
mbed_official 87:085cde657901 469 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 470 */
mbed_official 87:085cde657901 471 HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void)
mbed_official 87:085cde657901 472 {
mbed_official 87:085cde657901 473 uint8_t optiontmp = 0xFF;
mbed_official 87:085cde657901 474
mbed_official 87:085cde657901 475 /* Mask SPRMOD bit */
mbed_official 87:085cde657901 476 optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F);
mbed_official 87:085cde657901 477
mbed_official 87:085cde657901 478 /* Update Option Byte */
mbed_official 87:085cde657901 479 *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp);
mbed_official 87:085cde657901 480
mbed_official 87:085cde657901 481 return HAL_OK;
mbed_official 87:085cde657901 482 }
mbed_official 87:085cde657901 483
mbed_official 87:085cde657901 484 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 485
mbed_official 87:085cde657901 486 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx)
mbed_official 87:085cde657901 487
mbed_official 87:085cde657901 488 /**
mbed_official 87:085cde657901 489 * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2
mbed_official 87:085cde657901 490 * @note This function can be used only for STM32F427X and STM32F429X devices.
mbed_official 87:085cde657901 491 * @param None
mbed_official 87:085cde657901 492 * @retval The FLASH Write Protection Option Bytes value
mbed_official 87:085cde657901 493 */
mbed_official 87:085cde657901 494 uint16_t HAL_FLASHEx_OB_GetBank2WRP(void)
mbed_official 87:085cde657901 495 {
mbed_official 87:085cde657901 496 /* Return the FLASH write protection Register value */
mbed_official 87:085cde657901 497 return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS));
mbed_official 87:085cde657901 498 }
mbed_official 87:085cde657901 499 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 500
mbed_official 87:085cde657901 501 /**
mbed_official 87:085cde657901 502 * @}
mbed_official 87:085cde657901 503 */
mbed_official 87:085cde657901 504
mbed_official 87:085cde657901 505 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx)
mbed_official 87:085cde657901 506 /**
mbed_official 87:085cde657901 507 * @brief Full erase of FLASH memory sectors
mbed_official 87:085cde657901 508 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 87:085cde657901 509 * This parameter can be one of the following values:
mbed_official 87:085cde657901 510 * @arg VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 87:085cde657901 511 * the operation will be done by byte (8-bit)
mbed_official 87:085cde657901 512 * @arg VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 87:085cde657901 513 * the operation will be done by half word (16-bit)
mbed_official 87:085cde657901 514 * @arg VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 87:085cde657901 515 * the operation will be done by word (32-bit)
mbed_official 87:085cde657901 516 * @arg VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 87:085cde657901 517 * the operation will be done by double word (64-bit)
mbed_official 87:085cde657901 518 *
mbed_official 87:085cde657901 519 * @param Banks: Banks to be erased
mbed_official 87:085cde657901 520 * This parameter can be one of the following values:
mbed_official 87:085cde657901 521 * @arg FLASH_BANK_1: Bank1 to be erased
mbed_official 87:085cde657901 522 * @arg FLASH_BANK_2: Bank2 to be erased
mbed_official 87:085cde657901 523 * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased
mbed_official 87:085cde657901 524 *
mbed_official 87:085cde657901 525 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 526 */
mbed_official 87:085cde657901 527 static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks)
mbed_official 87:085cde657901 528 {
mbed_official 87:085cde657901 529 uint32_t tmp_psize = 0;
mbed_official 87:085cde657901 530
mbed_official 87:085cde657901 531 /* Check the parameters */
mbed_official 87:085cde657901 532 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 87:085cde657901 533 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 534
mbed_official 87:085cde657901 535 /* if the previous operation is completed, proceed to erase all sectors */
mbed_official 87:085cde657901 536 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 87:085cde657901 537 FLASH->CR |= tmp_psize;
mbed_official 87:085cde657901 538 if(Banks == FLASH_BANK_BOTH)
mbed_official 87:085cde657901 539 {
mbed_official 87:085cde657901 540 /* bank1 & bank2 will be erased*/
mbed_official 87:085cde657901 541 FLASH->CR |= FLASH_MER_BIT;
mbed_official 87:085cde657901 542 }
mbed_official 87:085cde657901 543 else if(Banks == FLASH_BANK_1)
mbed_official 87:085cde657901 544 {
mbed_official 87:085cde657901 545 /*Only bank1 will be erased*/
mbed_official 87:085cde657901 546 FLASH->CR |= FLASH_CR_MER1;
mbed_official 87:085cde657901 547 }
mbed_official 87:085cde657901 548 else
mbed_official 87:085cde657901 549 {
mbed_official 87:085cde657901 550 /*Only bank2 will be erased*/
mbed_official 87:085cde657901 551 FLASH->CR |= FLASH_CR_MER2;
mbed_official 87:085cde657901 552 }
mbed_official 87:085cde657901 553 FLASH->CR |= FLASH_CR_STRT;
mbed_official 87:085cde657901 554 }
mbed_official 87:085cde657901 555
mbed_official 87:085cde657901 556 /**
mbed_official 87:085cde657901 557 * @brief Erase the specified FLASH memory sector
mbed_official 87:085cde657901 558 * @param Sector: FLASH sector to erase
mbed_official 87:085cde657901 559 * The value of this parameter depend on device used within the same series
mbed_official 87:085cde657901 560 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 87:085cde657901 561 * This parameter can be one of the following values:
mbed_official 87:085cde657901 562 * @arg VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 87:085cde657901 563 * the operation will be done by byte (8-bit)
mbed_official 87:085cde657901 564 * @arg VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 87:085cde657901 565 * the operation will be done by half word (16-bit)
mbed_official 87:085cde657901 566 * @arg VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 87:085cde657901 567 * the operation will be done by word (32-bit)
mbed_official 87:085cde657901 568 * @arg VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 87:085cde657901 569 * the operation will be done by double word (64-bit)
mbed_official 87:085cde657901 570 *
mbed_official 87:085cde657901 571 * @retval None
mbed_official 87:085cde657901 572 */
mbed_official 87:085cde657901 573 void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
mbed_official 87:085cde657901 574 {
mbed_official 87:085cde657901 575 uint32_t tmp_psize = 0;
mbed_official 87:085cde657901 576
mbed_official 87:085cde657901 577 /* Check the parameters */
mbed_official 87:085cde657901 578 assert_param(IS_FLASH_SECTOR(Sector));
mbed_official 87:085cde657901 579 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 87:085cde657901 580
mbed_official 87:085cde657901 581 if(VoltageRange == VOLTAGE_RANGE_1)
mbed_official 87:085cde657901 582 {
mbed_official 87:085cde657901 583 tmp_psize = FLASH_PSIZE_BYTE;
mbed_official 87:085cde657901 584 }
mbed_official 87:085cde657901 585 else if(VoltageRange == VOLTAGE_RANGE_2)
mbed_official 87:085cde657901 586 {
mbed_official 87:085cde657901 587 tmp_psize = FLASH_PSIZE_HALF_WORD;
mbed_official 87:085cde657901 588 }
mbed_official 87:085cde657901 589 else if(VoltageRange == VOLTAGE_RANGE_3)
mbed_official 87:085cde657901 590 {
mbed_official 87:085cde657901 591 tmp_psize = FLASH_PSIZE_WORD;
mbed_official 87:085cde657901 592 }
mbed_official 87:085cde657901 593 else
mbed_official 87:085cde657901 594 {
mbed_official 87:085cde657901 595 tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
mbed_official 87:085cde657901 596 }
mbed_official 87:085cde657901 597
mbed_official 87:085cde657901 598 /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */
mbed_official 87:085cde657901 599 if (Sector > FLASH_SECTOR_11)
mbed_official 87:085cde657901 600 {
mbed_official 87:085cde657901 601 Sector += 4;
mbed_official 87:085cde657901 602 }
mbed_official 87:085cde657901 603 /* If the previous operation is completed, proceed to erase the sector */
mbed_official 87:085cde657901 604 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 87:085cde657901 605 FLASH->CR |= tmp_psize;
mbed_official 87:085cde657901 606 FLASH->CR &= SECTOR_MASK;
mbed_official 87:085cde657901 607 FLASH->CR |= FLASH_CR_SER | (Sector << POSITION_VAL(FLASH_CR_SNB));
mbed_official 87:085cde657901 608 FLASH->CR |= FLASH_CR_STRT;
mbed_official 87:085cde657901 609 }
mbed_official 87:085cde657901 610
mbed_official 87:085cde657901 611 /**
mbed_official 87:085cde657901 612 * @brief Enable the write protection of the desired bank1 or bank 2 sectors
mbed_official 87:085cde657901 613 *
mbed_official 87:085cde657901 614 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 87:085cde657901 615 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 87:085cde657901 616 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 87:085cde657901 617 * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).
mbed_official 87:085cde657901 618 *
mbed_official 87:085cde657901 619 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 87:085cde657901 620 * This parameter can be one of the following values:
mbed_official 87:085cde657901 621 * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23
mbed_official 87:085cde657901 622 * @arg OB_WRP_SECTOR_All
mbed_official 87:085cde657901 623 * @note BANK2 starts from OB_WRP_SECTOR_12
mbed_official 87:085cde657901 624 *
mbed_official 87:085cde657901 625 * @param Banks: Enable write protection on all the sectors for the specific bank
mbed_official 87:085cde657901 626 * This parameter can be one of the following values:
mbed_official 87:085cde657901 627 * @arg FLASH_BANK_1: WRP on all sectors of bank1
mbed_official 87:085cde657901 628 * @arg FLASH_BANK_2: WRP on all sectors of bank2
mbed_official 87:085cde657901 629 * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
mbed_official 87:085cde657901 630 *
mbed_official 87:085cde657901 631 * @retval HAL FLASH State
mbed_official 87:085cde657901 632 */
mbed_official 87:085cde657901 633 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks)
mbed_official 87:085cde657901 634 {
mbed_official 87:085cde657901 635 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 636
mbed_official 87:085cde657901 637 /* Check the parameters */
mbed_official 87:085cde657901 638 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 87:085cde657901 639 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 640
mbed_official 87:085cde657901 641 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 642 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 643
mbed_official 87:085cde657901 644 if(status == HAL_OK)
mbed_official 87:085cde657901 645 {
mbed_official 87:085cde657901 646 if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) ||
mbed_official 87:085cde657901 647 (WRPSector < OB_WRP_SECTOR_12))
mbed_official 87:085cde657901 648 {
mbed_official 87:085cde657901 649 if (WRPSector == OB_WRP_SECTOR_All)
mbed_official 87:085cde657901 650 {
mbed_official 87:085cde657901 651 /*Write protection on all sector of BANK1*/
mbed_official 87:085cde657901 652 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12));
mbed_official 87:085cde657901 653 }
mbed_official 87:085cde657901 654 else
mbed_official 87:085cde657901 655 {
mbed_official 87:085cde657901 656 /*Write protection done on sectors of BANK1*/
mbed_official 87:085cde657901 657 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector);
mbed_official 87:085cde657901 658 }
mbed_official 87:085cde657901 659 }
mbed_official 87:085cde657901 660 else
mbed_official 87:085cde657901 661 {
mbed_official 87:085cde657901 662 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 663 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12));
mbed_official 87:085cde657901 664 }
mbed_official 87:085cde657901 665
mbed_official 87:085cde657901 666 /*Write protection on all sector of BANK2*/
mbed_official 87:085cde657901 667 if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH))
mbed_official 87:085cde657901 668 {
mbed_official 87:085cde657901 669 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 670 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 671
mbed_official 87:085cde657901 672 if(status == HAL_OK)
mbed_official 87:085cde657901 673 {
mbed_official 87:085cde657901 674 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12));
mbed_official 87:085cde657901 675 }
mbed_official 87:085cde657901 676 }
mbed_official 87:085cde657901 677
mbed_official 87:085cde657901 678 }
mbed_official 87:085cde657901 679
mbed_official 87:085cde657901 680 return status;
mbed_official 87:085cde657901 681 }
mbed_official 87:085cde657901 682
mbed_official 87:085cde657901 683 /**
mbed_official 87:085cde657901 684 * @brief Disable the write protection of the desired bank1 or bank 2 sectors
mbed_official 87:085cde657901 685 *
mbed_official 87:085cde657901 686 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 87:085cde657901 687 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 87:085cde657901 688 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 87:085cde657901 689 * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).
mbed_official 87:085cde657901 690 *
mbed_official 87:085cde657901 691 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 87:085cde657901 692 * This parameter can be one of the following values:
mbed_official 87:085cde657901 693 * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23
mbed_official 87:085cde657901 694 * @arg OB_WRP_Sector_All
mbed_official 87:085cde657901 695 * @note BANK2 starts from OB_WRP_SECTOR_12
mbed_official 87:085cde657901 696 *
mbed_official 87:085cde657901 697 * @param Banks: Disable write protection on all the sectors for the specific bank
mbed_official 87:085cde657901 698 * This parameter can be one of the following values:
mbed_official 87:085cde657901 699 * @arg FLASH_BANK_1: Bank1 to be erased
mbed_official 87:085cde657901 700 * @arg FLASH_BANK_2: Bank2 to be erased
mbed_official 87:085cde657901 701 * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased
mbed_official 87:085cde657901 702 *
mbed_official 87:085cde657901 703 * @retval HAL Staus
mbed_official 87:085cde657901 704 */
mbed_official 87:085cde657901 705 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks)
mbed_official 87:085cde657901 706 {
mbed_official 87:085cde657901 707 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 708
mbed_official 87:085cde657901 709 /* Check the parameters */
mbed_official 87:085cde657901 710 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 87:085cde657901 711 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 712
mbed_official 87:085cde657901 713 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 714 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 715
mbed_official 87:085cde657901 716 if(status == HAL_OK)
mbed_official 87:085cde657901 717 {
mbed_official 87:085cde657901 718 if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) ||
mbed_official 87:085cde657901 719 (WRPSector < OB_WRP_SECTOR_12))
mbed_official 87:085cde657901 720 {
mbed_official 87:085cde657901 721 if (WRPSector == OB_WRP_SECTOR_All)
mbed_official 87:085cde657901 722 {
mbed_official 87:085cde657901 723 /*Write protection on all sector of BANK1*/
mbed_official 87:085cde657901 724 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12);
mbed_official 87:085cde657901 725 }
mbed_official 87:085cde657901 726 else
mbed_official 87:085cde657901 727 {
mbed_official 87:085cde657901 728 /*Write protection done on sectors of BANK1*/
mbed_official 87:085cde657901 729 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector;
mbed_official 87:085cde657901 730 }
mbed_official 87:085cde657901 731 }
mbed_official 87:085cde657901 732 else
mbed_official 87:085cde657901 733 {
mbed_official 87:085cde657901 734 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 735 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12);
mbed_official 87:085cde657901 736 }
mbed_official 87:085cde657901 737
mbed_official 87:085cde657901 738 /*Write protection on all sector of BANK2*/
mbed_official 87:085cde657901 739 if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH))
mbed_official 87:085cde657901 740 {
mbed_official 87:085cde657901 741 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 742 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 743
mbed_official 87:085cde657901 744 if(status == HAL_OK)
mbed_official 87:085cde657901 745 {
mbed_official 87:085cde657901 746 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12);
mbed_official 87:085cde657901 747 }
mbed_official 87:085cde657901 748 }
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 }
mbed_official 87:085cde657901 751
mbed_official 87:085cde657901 752 return status;
mbed_official 87:085cde657901 753 }
mbed_official 87:085cde657901 754
mbed_official 87:085cde657901 755 /**
mbed_official 87:085cde657901 756 * @brief Configure the Dual Bank Boot.
mbed_official 87:085cde657901 757 *
mbed_official 87:085cde657901 758 * @note This function can be used only for STM32F42xxx/43xxx devices.
mbed_official 87:085cde657901 759 *
mbed_official 87:085cde657901 760 * @param BootConfig specifies the Dual Bank Boot Option byte.
mbed_official 87:085cde657901 761 * This parameter can be one of the following values:
mbed_official 87:085cde657901 762 * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable
mbed_official 87:085cde657901 763 * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled
mbed_official 87:085cde657901 764 * @retval None
mbed_official 87:085cde657901 765 */
mbed_official 87:085cde657901 766 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig)
mbed_official 87:085cde657901 767 {
mbed_official 87:085cde657901 768 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 769
mbed_official 87:085cde657901 770 /* Check the parameters */
mbed_official 87:085cde657901 771 assert_param(IS_OB_BOOT(BootConfig));
mbed_official 87:085cde657901 772
mbed_official 87:085cde657901 773 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 774 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 775
mbed_official 87:085cde657901 776 if(status == HAL_OK)
mbed_official 87:085cde657901 777 {
mbed_official 87:085cde657901 778 /* Set Dual Bank Boot */
mbed_official 87:085cde657901 779 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2);
mbed_official 87:085cde657901 780 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig;
mbed_official 87:085cde657901 781 }
mbed_official 87:085cde657901 782
mbed_official 87:085cde657901 783 return status;
mbed_official 87:085cde657901 784 }
mbed_official 87:085cde657901 785
mbed_official 87:085cde657901 786 /**
mbed_official 87:085cde657901 787 * @brief Enable the read/write protection (PCROP) of the desired
mbed_official 87:085cde657901 788 * sectors of Bank 1 and/or Bank 2.
mbed_official 87:085cde657901 789 * @note This function can be used only for STM32F42xxx/43xxx devices.
mbed_official 87:085cde657901 790 * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1.
mbed_official 87:085cde657901 791 * This parameter can be one of the following values:
mbed_official 87:085cde657901 792 * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11
mbed_official 87:085cde657901 793 * @arg OB_PCROP_SECTOR__All
mbed_official 87:085cde657901 794 * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2.
mbed_official 87:085cde657901 795 * This parameter can be one of the following values:
mbed_official 87:085cde657901 796 * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23
mbed_official 87:085cde657901 797 * @arg OB_PCROP_SECTOR__All
mbed_official 87:085cde657901 798 * @param Banks Enable PCROP protection on all the sectors for the specific bank
mbed_official 87:085cde657901 799 * This parameter can be one of the following values:
mbed_official 87:085cde657901 800 * @arg FLASH_BANK_1: WRP on all sectors of bank1
mbed_official 87:085cde657901 801 * @arg FLASH_BANK_2: WRP on all sectors of bank2
mbed_official 87:085cde657901 802 * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
mbed_official 87:085cde657901 803 *
mbed_official 87:085cde657901 804 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 805 */
mbed_official 87:085cde657901 806 static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks)
mbed_official 87:085cde657901 807 {
mbed_official 87:085cde657901 808 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 809
mbed_official 87:085cde657901 810 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 811
mbed_official 87:085cde657901 812 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 813 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 814
mbed_official 87:085cde657901 815 if(status == HAL_OK)
mbed_official 87:085cde657901 816 {
mbed_official 87:085cde657901 817 if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))
mbed_official 87:085cde657901 818 {
mbed_official 87:085cde657901 819 assert_param(IS_OB_PCROP(SectorBank1));
mbed_official 87:085cde657901 820 /*Write protection done on sectors of BANK1*/
mbed_official 87:085cde657901 821 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1;
mbed_official 87:085cde657901 822 }
mbed_official 87:085cde657901 823 else
mbed_official 87:085cde657901 824 {
mbed_official 87:085cde657901 825 assert_param(IS_OB_PCROP(SectorBank2));
mbed_official 87:085cde657901 826 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 827 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2;
mbed_official 87:085cde657901 828 }
mbed_official 87:085cde657901 829
mbed_official 87:085cde657901 830 /*Write protection on all sector of BANK2*/
mbed_official 87:085cde657901 831 if (Banks == FLASH_BANK_BOTH)
mbed_official 87:085cde657901 832 {
mbed_official 87:085cde657901 833 assert_param(IS_OB_PCROP(SectorBank2));
mbed_official 87:085cde657901 834 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 835 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 836
mbed_official 87:085cde657901 837 if(status == HAL_OK)
mbed_official 87:085cde657901 838 {
mbed_official 87:085cde657901 839 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 840 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2;
mbed_official 87:085cde657901 841 }
mbed_official 87:085cde657901 842 }
mbed_official 87:085cde657901 843
mbed_official 87:085cde657901 844 }
mbed_official 87:085cde657901 845
mbed_official 87:085cde657901 846 return status;
mbed_official 87:085cde657901 847 }
mbed_official 87:085cde657901 848
mbed_official 87:085cde657901 849
mbed_official 87:085cde657901 850 /**
mbed_official 87:085cde657901 851 * @brief Disable the read/write protection (PCROP) of the desired
mbed_official 87:085cde657901 852 * sectors of Bank 1 and/or Bank 2.
mbed_official 87:085cde657901 853 * @note This function can be used only for STM32F42xxx/43xxx devices.
mbed_official 87:085cde657901 854 * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1.
mbed_official 87:085cde657901 855 * This parameter can be one of the following values:
mbed_official 87:085cde657901 856 * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11
mbed_official 87:085cde657901 857 * @arg OB_PCROP_SECTOR__All
mbed_official 87:085cde657901 858 * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2.
mbed_official 87:085cde657901 859 * This parameter can be one of the following values:
mbed_official 87:085cde657901 860 * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23
mbed_official 87:085cde657901 861 * @arg OB_PCROP_SECTOR__All
mbed_official 87:085cde657901 862 * @param Banks Disable PCROP protection on all the sectors for the specific bank
mbed_official 87:085cde657901 863 * This parameter can be one of the following values:
mbed_official 87:085cde657901 864 * @arg FLASH_BANK_1: WRP on all sectors of bank1
mbed_official 87:085cde657901 865 * @arg FLASH_BANK_2: WRP on all sectors of bank2
mbed_official 87:085cde657901 866 * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2
mbed_official 87:085cde657901 867 *
mbed_official 87:085cde657901 868 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 869 */
mbed_official 87:085cde657901 870 static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks)
mbed_official 87:085cde657901 871 {
mbed_official 87:085cde657901 872 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 873
mbed_official 87:085cde657901 874 /* Check the parameters */
mbed_official 87:085cde657901 875 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 876
mbed_official 87:085cde657901 877 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 878 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 879
mbed_official 87:085cde657901 880 if(status == HAL_OK)
mbed_official 87:085cde657901 881 {
mbed_official 87:085cde657901 882 if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))
mbed_official 87:085cde657901 883 {
mbed_official 87:085cde657901 884 assert_param(IS_OB_PCROP(SectorBank1));
mbed_official 87:085cde657901 885 /*Write protection done on sectors of BANK1*/
mbed_official 87:085cde657901 886 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1);
mbed_official 87:085cde657901 887 }
mbed_official 87:085cde657901 888 else
mbed_official 87:085cde657901 889 {
mbed_official 87:085cde657901 890 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 891 assert_param(IS_OB_PCROP(SectorBank2));
mbed_official 87:085cde657901 892 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2);
mbed_official 87:085cde657901 893 }
mbed_official 87:085cde657901 894
mbed_official 87:085cde657901 895 /*Write protection on all sector of BANK2*/
mbed_official 87:085cde657901 896 if (Banks == FLASH_BANK_BOTH)
mbed_official 87:085cde657901 897 {
mbed_official 87:085cde657901 898 assert_param(IS_OB_PCROP(SectorBank2));
mbed_official 87:085cde657901 899 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 900 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 901
mbed_official 87:085cde657901 902 if(status == HAL_OK)
mbed_official 87:085cde657901 903 {
mbed_official 87:085cde657901 904 /*Write protection done on sectors of BANK2*/
mbed_official 87:085cde657901 905 *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2);
mbed_official 87:085cde657901 906 }
mbed_official 87:085cde657901 907 }
mbed_official 87:085cde657901 908
mbed_official 87:085cde657901 909 }
mbed_official 87:085cde657901 910
mbed_official 87:085cde657901 911 return status;
mbed_official 87:085cde657901 912
mbed_official 87:085cde657901 913 }
mbed_official 87:085cde657901 914
mbed_official 87:085cde657901 915 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 916
mbed_official 87:085cde657901 917 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) || defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 918 /**
mbed_official 87:085cde657901 919 * @brief Mass erase of FLASH memory
mbed_official 87:085cde657901 920 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 87:085cde657901 921 * This parameter can be one of the following values:
mbed_official 87:085cde657901 922 * @arg VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 87:085cde657901 923 * the operation will be done by byte (8-bit)
mbed_official 87:085cde657901 924 * @arg VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 87:085cde657901 925 * the operation will be done by half word (16-bit)
mbed_official 87:085cde657901 926 * @arg VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 87:085cde657901 927 * the operation will be done by word (32-bit)
mbed_official 87:085cde657901 928 * @arg VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 87:085cde657901 929 * the operation will be done by double word (64-bit)
mbed_official 87:085cde657901 930 *
mbed_official 87:085cde657901 931 * @param Banks: Banks to be erased
mbed_official 87:085cde657901 932 * This parameter can be one of the following values:
mbed_official 87:085cde657901 933 * @arg FLASH_BANK_1: Bank1 to be erased
mbed_official 87:085cde657901 934 *
mbed_official 87:085cde657901 935 * @retval None
mbed_official 87:085cde657901 936 */
mbed_official 87:085cde657901 937 static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks)
mbed_official 87:085cde657901 938 {
mbed_official 87:085cde657901 939 uint32_t tmp_psize = 0;
mbed_official 87:085cde657901 940
mbed_official 87:085cde657901 941 /* Check the parameters */
mbed_official 87:085cde657901 942 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 87:085cde657901 943 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 944
mbed_official 87:085cde657901 945 /* If the previous operation is completed, proceed to erase all sectors */
mbed_official 87:085cde657901 946 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 87:085cde657901 947 FLASH->CR |= tmp_psize;
mbed_official 87:085cde657901 948 FLASH->CR |= FLASH_CR_MER;
mbed_official 87:085cde657901 949 FLASH->CR |= FLASH_CR_STRT;
mbed_official 87:085cde657901 950 }
mbed_official 87:085cde657901 951
mbed_official 87:085cde657901 952 /**
mbed_official 87:085cde657901 953 * @brief Erase the specified FLASH memory sector
mbed_official 87:085cde657901 954 * @param Sector: FLASH sector to erase
mbed_official 87:085cde657901 955 * The value of this parameter depend on device used within the same series
mbed_official 87:085cde657901 956 * @param VoltageRange: The device voltage range which defines the erase parallelism.
mbed_official 87:085cde657901 957 * This parameter can be one of the following values:
mbed_official 87:085cde657901 958 * @arg VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
mbed_official 87:085cde657901 959 * the operation will be done by byte (8-bit)
mbed_official 87:085cde657901 960 * @arg VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
mbed_official 87:085cde657901 961 * the operation will be done by half word (16-bit)
mbed_official 87:085cde657901 962 * @arg VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
mbed_official 87:085cde657901 963 * the operation will be done by word (32-bit)
mbed_official 87:085cde657901 964 * @arg VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
mbed_official 87:085cde657901 965 * the operation will be done by double word (64-bit)
mbed_official 87:085cde657901 966 *
mbed_official 87:085cde657901 967 * @retval None
mbed_official 87:085cde657901 968 */
mbed_official 87:085cde657901 969 void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
mbed_official 87:085cde657901 970 {
mbed_official 87:085cde657901 971 uint32_t tmp_psize = 0;
mbed_official 87:085cde657901 972
mbed_official 87:085cde657901 973 /* Check the parameters */
mbed_official 87:085cde657901 974 assert_param(IS_FLASH_SECTOR(Sector));
mbed_official 87:085cde657901 975 assert_param(IS_VOLTAGERANGE(VoltageRange));
mbed_official 87:085cde657901 976
mbed_official 87:085cde657901 977 if(VoltageRange == VOLTAGE_RANGE_1)
mbed_official 87:085cde657901 978 {
mbed_official 87:085cde657901 979 tmp_psize = FLASH_PSIZE_BYTE;
mbed_official 87:085cde657901 980 }
mbed_official 87:085cde657901 981 else if(VoltageRange == VOLTAGE_RANGE_2)
mbed_official 87:085cde657901 982 {
mbed_official 87:085cde657901 983 tmp_psize = FLASH_PSIZE_HALF_WORD;
mbed_official 87:085cde657901 984 }
mbed_official 87:085cde657901 985 else if(VoltageRange == VOLTAGE_RANGE_3)
mbed_official 87:085cde657901 986 {
mbed_official 87:085cde657901 987 tmp_psize = FLASH_PSIZE_WORD;
mbed_official 87:085cde657901 988 }
mbed_official 87:085cde657901 989 else
mbed_official 87:085cde657901 990 {
mbed_official 87:085cde657901 991 tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
mbed_official 87:085cde657901 992 }
mbed_official 87:085cde657901 993
mbed_official 87:085cde657901 994 /* If the previous operation is completed, proceed to erase the sector */
mbed_official 87:085cde657901 995 FLASH->CR &= CR_PSIZE_MASK;
mbed_official 87:085cde657901 996 FLASH->CR |= tmp_psize;
mbed_official 87:085cde657901 997 FLASH->CR &= SECTOR_MASK;
mbed_official 87:085cde657901 998 FLASH->CR |= FLASH_CR_SER | (Sector << POSITION_VAL(FLASH_CR_SNB));
mbed_official 87:085cde657901 999 FLASH->CR |= FLASH_CR_STRT;
mbed_official 87:085cde657901 1000 }
mbed_official 87:085cde657901 1001
mbed_official 87:085cde657901 1002 /**
mbed_official 87:085cde657901 1003 * @brief Enable the write protection of the desired bank 1 sectors
mbed_official 87:085cde657901 1004 *
mbed_official 87:085cde657901 1005 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 87:085cde657901 1006 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 87:085cde657901 1007 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 87:085cde657901 1008 * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).
mbed_official 87:085cde657901 1009 *
mbed_official 87:085cde657901 1010 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 87:085cde657901 1011 * The value of this parameter depend on device used within the same series
mbed_official 87:085cde657901 1012 *
mbed_official 87:085cde657901 1013 * @param Banks: Enable write protection on all the sectors for the specific bank
mbed_official 87:085cde657901 1014 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1015 * @arg FLASH_BANK_1: WRP on all sectors of bank1
mbed_official 87:085cde657901 1016 *
mbed_official 87:085cde657901 1017 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1018 */
mbed_official 87:085cde657901 1019 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks)
mbed_official 87:085cde657901 1020 {
mbed_official 87:085cde657901 1021 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1022
mbed_official 87:085cde657901 1023 /* Check the parameters */
mbed_official 87:085cde657901 1024 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 87:085cde657901 1025 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 1026
mbed_official 87:085cde657901 1027 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1028 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1029
mbed_official 87:085cde657901 1030 if(status == HAL_OK)
mbed_official 87:085cde657901 1031 {
mbed_official 87:085cde657901 1032 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector);
mbed_official 87:085cde657901 1033 }
mbed_official 87:085cde657901 1034
mbed_official 87:085cde657901 1035 return status;
mbed_official 87:085cde657901 1036 }
mbed_official 87:085cde657901 1037
mbed_official 87:085cde657901 1038 /**
mbed_official 87:085cde657901 1039 * @brief Disable the write protection of the desired bank 1 sectors
mbed_official 87:085cde657901 1040 *
mbed_official 87:085cde657901 1041 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 87:085cde657901 1042 * it is not possible to program or erase the flash sector i if CortexM4
mbed_official 87:085cde657901 1043 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 87:085cde657901 1044 * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1).
mbed_official 87:085cde657901 1045 *
mbed_official 87:085cde657901 1046 * @param WRPSector: specifies the sector(s) to be write protected.
mbed_official 87:085cde657901 1047 * The value of this parameter depend on device used within the same series
mbed_official 87:085cde657901 1048 *
mbed_official 87:085cde657901 1049 * @param Banks: Enable write protection on all the sectors for the specific bank
mbed_official 87:085cde657901 1050 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1051 * @arg FLASH_BANK_1: WRP on all sectors of bank1
mbed_official 87:085cde657901 1052 *
mbed_official 87:085cde657901 1053 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1054 */
mbed_official 87:085cde657901 1055 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks)
mbed_official 87:085cde657901 1056 {
mbed_official 87:085cde657901 1057 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1058
mbed_official 87:085cde657901 1059 /* Check the parameters */
mbed_official 87:085cde657901 1060 assert_param(IS_OB_WRP_SECTOR(WRPSector));
mbed_official 87:085cde657901 1061 assert_param(IS_FLASH_BANK(Banks));
mbed_official 87:085cde657901 1062
mbed_official 87:085cde657901 1063 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1064 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1065
mbed_official 87:085cde657901 1066 if(status == HAL_OK)
mbed_official 87:085cde657901 1067 {
mbed_official 87:085cde657901 1068 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector;
mbed_official 87:085cde657901 1069 }
mbed_official 87:085cde657901 1070
mbed_official 87:085cde657901 1071 return status;
mbed_official 87:085cde657901 1072 }
mbed_official 87:085cde657901 1073 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 1074
mbed_official 87:085cde657901 1075 #if defined(STM32F401xC) || defined(STM32F401xE)
mbed_official 87:085cde657901 1076 /**
mbed_official 87:085cde657901 1077 * @brief Enable the read/write protection (PCROP) of the desired sectors.
mbed_official 87:085cde657901 1078 * @note This function can be used only for STM32F401xx devices.
mbed_official 87:085cde657901 1079 * @param Sector specifies the sector(s) to be read/write protected or unprotected.
mbed_official 87:085cde657901 1080 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1081 * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5
mbed_official 87:085cde657901 1082 * @arg OB_PCROP_Sector_All
mbed_official 87:085cde657901 1083 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1084 */
mbed_official 87:085cde657901 1085 static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector)
mbed_official 87:085cde657901 1086 {
mbed_official 87:085cde657901 1087 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1088
mbed_official 87:085cde657901 1089 /* Check the parameters */
mbed_official 87:085cde657901 1090 assert_param(IS_OB_PCROP(Sector));
mbed_official 87:085cde657901 1091
mbed_official 87:085cde657901 1092 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1093 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1094
mbed_official 87:085cde657901 1095 if(status == HAL_OK)
mbed_official 87:085cde657901 1096 {
mbed_official 87:085cde657901 1097 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector;
mbed_official 87:085cde657901 1098 }
mbed_official 87:085cde657901 1099
mbed_official 87:085cde657901 1100 return status;
mbed_official 87:085cde657901 1101 }
mbed_official 87:085cde657901 1102
mbed_official 87:085cde657901 1103
mbed_official 87:085cde657901 1104 /**
mbed_official 87:085cde657901 1105 * @brief Disable the read/write protection (PCROP) of the desired sectors.
mbed_official 87:085cde657901 1106 * @note This function can be used only for STM32F401xx devices.
mbed_official 87:085cde657901 1107 * @param Sector specifies the sector(s) to be read/write protected or unprotected.
mbed_official 87:085cde657901 1108 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1109 * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5
mbed_official 87:085cde657901 1110 * @arg OB_PCROP_Sector_All
mbed_official 87:085cde657901 1111 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1112 */
mbed_official 87:085cde657901 1113 static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector)
mbed_official 87:085cde657901 1114 {
mbed_official 87:085cde657901 1115 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1116
mbed_official 87:085cde657901 1117 /* Check the parameters */
mbed_official 87:085cde657901 1118 assert_param(IS_OB_PCROP(Sector));
mbed_official 87:085cde657901 1119
mbed_official 87:085cde657901 1120 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1121 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1122
mbed_official 87:085cde657901 1123 if(status == HAL_OK)
mbed_official 87:085cde657901 1124 {
mbed_official 87:085cde657901 1125 *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~Sector);
mbed_official 87:085cde657901 1126 }
mbed_official 87:085cde657901 1127
mbed_official 87:085cde657901 1128 return status;
mbed_official 87:085cde657901 1129
mbed_official 87:085cde657901 1130 }
mbed_official 87:085cde657901 1131 #endif /* STM32F401xC || STM32F401xE */
mbed_official 87:085cde657901 1132
mbed_official 87:085cde657901 1133 /**
mbed_official 87:085cde657901 1134 * @brief Set the read protection level.
mbed_official 87:085cde657901 1135 * @param Level: specifies the read protection level.
mbed_official 87:085cde657901 1136 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1137 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 87:085cde657901 1138 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 87:085cde657901 1139 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 87:085cde657901 1140 *
mbed_official 87:085cde657901 1141 * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0
mbed_official 87:085cde657901 1142 *
mbed_official 87:085cde657901 1143 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1144 */
mbed_official 87:085cde657901 1145 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level)
mbed_official 87:085cde657901 1146 {
mbed_official 87:085cde657901 1147 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1148
mbed_official 87:085cde657901 1149 /* Check the parameters */
mbed_official 87:085cde657901 1150 assert_param(IS_OB_RDP_LEVEL(Level));
mbed_official 87:085cde657901 1151
mbed_official 87:085cde657901 1152 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1153 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1154
mbed_official 87:085cde657901 1155 if(status == HAL_OK)
mbed_official 87:085cde657901 1156 {
mbed_official 87:085cde657901 1157 *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = Level;
mbed_official 87:085cde657901 1158 }
mbed_official 87:085cde657901 1159
mbed_official 87:085cde657901 1160 return status;
mbed_official 87:085cde657901 1161 }
mbed_official 87:085cde657901 1162
mbed_official 87:085cde657901 1163 /**
mbed_official 87:085cde657901 1164 * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
mbed_official 87:085cde657901 1165 * @param Iwdg: Selects the IWDG mode
mbed_official 87:085cde657901 1166 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1167 * @arg OB_IWDG_SW: Software IWDG selected
mbed_official 87:085cde657901 1168 * @arg OB_IWDG_HW: Hardware IWDG selected
mbed_official 87:085cde657901 1169 * @param Stop: Reset event when entering STOP mode.
mbed_official 87:085cde657901 1170 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1171 * @arg OB_STOP_NO_RST: No reset generated when entering in STOP
mbed_official 87:085cde657901 1172 * @arg OB_STOP_RST: Reset generated when entering in STOP
mbed_official 87:085cde657901 1173 * @param Stdby: Reset event when entering Standby mode.
mbed_official 87:085cde657901 1174 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1175 * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY
mbed_official 87:085cde657901 1176 * @arg OB_STDBY_RST: Reset generated when entering in STANDBY
mbed_official 87:085cde657901 1177 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1178 */
mbed_official 87:085cde657901 1179 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby)
mbed_official 87:085cde657901 1180 {
mbed_official 87:085cde657901 1181 uint8_t optiontmp = 0xFF;
mbed_official 87:085cde657901 1182 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 1183
mbed_official 87:085cde657901 1184 /* Check the parameters */
mbed_official 87:085cde657901 1185 assert_param(IS_OB_IWDG_SOURCE(Iwdg));
mbed_official 87:085cde657901 1186 assert_param(IS_OB_STOP_SOURCE(Stop));
mbed_official 87:085cde657901 1187 assert_param(IS_OB_STDBY_SOURCE(Stdby));
mbed_official 87:085cde657901 1188
mbed_official 87:085cde657901 1189 /* Wait for last operation to be completed */
mbed_official 87:085cde657901 1190 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 87:085cde657901 1191
mbed_official 87:085cde657901 1192 if(status == HAL_OK)
mbed_official 87:085cde657901 1193 {
mbed_official 87:085cde657901 1194 /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */
mbed_official 87:085cde657901 1195 optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F);
mbed_official 87:085cde657901 1196
mbed_official 87:085cde657901 1197 /* Update User Option Byte */
mbed_official 87:085cde657901 1198 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp)));
mbed_official 87:085cde657901 1199 }
mbed_official 87:085cde657901 1200
mbed_official 87:085cde657901 1201 return status;
mbed_official 87:085cde657901 1202
mbed_official 87:085cde657901 1203 }
mbed_official 87:085cde657901 1204
mbed_official 87:085cde657901 1205 /**
mbed_official 87:085cde657901 1206 * @brief Set the BOR Level.
mbed_official 87:085cde657901 1207 * @param Level: specifies the Option Bytes BOR Reset Level.
mbed_official 87:085cde657901 1208 * This parameter can be one of the following values:
mbed_official 87:085cde657901 1209 * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V
mbed_official 87:085cde657901 1210 * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V
mbed_official 87:085cde657901 1211 * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V
mbed_official 87:085cde657901 1212 * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V
mbed_official 87:085cde657901 1213 * @retval HAL_StatusTypeDef HAL Status
mbed_official 87:085cde657901 1214 */
mbed_official 87:085cde657901 1215 static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level)
mbed_official 87:085cde657901 1216 {
mbed_official 87:085cde657901 1217 /* Check the parameters */
mbed_official 87:085cde657901 1218 assert_param(IS_OB_BOR_LEVEL(Level));
mbed_official 87:085cde657901 1219
mbed_official 87:085cde657901 1220 /* Set the BOR Level */
mbed_official 87:085cde657901 1221 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV);
mbed_official 87:085cde657901 1222 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level;
mbed_official 87:085cde657901 1223
mbed_official 87:085cde657901 1224 return HAL_OK;
mbed_official 87:085cde657901 1225
mbed_official 87:085cde657901 1226 }
mbed_official 87:085cde657901 1227
mbed_official 87:085cde657901 1228 /**
mbed_official 87:085cde657901 1229 * @brief Return the FLASH User Option Byte value.
mbed_official 87:085cde657901 1230 * @param None
mbed_official 87:085cde657901 1231 * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1)
mbed_official 87:085cde657901 1232 * and RST_STDBY(Bit2).
mbed_official 87:085cde657901 1233 */
mbed_official 87:085cde657901 1234 static uint8_t FLASH_OB_GetUser(void)
mbed_official 87:085cde657901 1235 {
mbed_official 87:085cde657901 1236 /* Return the User Option Byte */
mbed_official 87:085cde657901 1237 return ((uint8_t)(FLASH->OPTCR & 0xE0));
mbed_official 87:085cde657901 1238 }
mbed_official 87:085cde657901 1239
mbed_official 87:085cde657901 1240 /**
mbed_official 87:085cde657901 1241 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 87:085cde657901 1242 * @param None
mbed_official 87:085cde657901 1243 * @retval uint16_t FLASH Write Protection Option Bytes value
mbed_official 87:085cde657901 1244 */
mbed_official 87:085cde657901 1245 static uint16_t FLASH_OB_GetWRP(void)
mbed_official 87:085cde657901 1246 {
mbed_official 87:085cde657901 1247 /* Return the FLASH write protection Register value */
mbed_official 87:085cde657901 1248 return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS));
mbed_official 87:085cde657901 1249 }
mbed_official 87:085cde657901 1250
mbed_official 87:085cde657901 1251 /**
mbed_official 87:085cde657901 1252 * @brief Returns the FLASH Read Protection level.
mbed_official 87:085cde657901 1253 * @param None
mbed_official 87:085cde657901 1254 * @retval FlagStatus FLASH ReadOut Protection Status:
mbed_official 87:085cde657901 1255 * - SET, when OB_RDP_Level_1 or OB_RDP_Level_2 is set
mbed_official 87:085cde657901 1256 * - RESET, when OB_RDP_Level_0 is set
mbed_official 87:085cde657901 1257 */
mbed_official 87:085cde657901 1258 static FlagStatus FLASH_OB_GetRDP(void)
mbed_official 87:085cde657901 1259 {
mbed_official 87:085cde657901 1260 FlagStatus readstatus = RESET;
mbed_official 87:085cde657901 1261
mbed_official 87:085cde657901 1262 if ((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) != (uint8_t)OB_RDP_LEVEL_0))
mbed_official 87:085cde657901 1263 {
mbed_official 87:085cde657901 1264 readstatus = SET;
mbed_official 87:085cde657901 1265 }
mbed_official 87:085cde657901 1266
mbed_official 87:085cde657901 1267 return readstatus;
mbed_official 87:085cde657901 1268 }
mbed_official 87:085cde657901 1269
mbed_official 87:085cde657901 1270 /**
mbed_official 87:085cde657901 1271 * @brief Returns the FLASH BOR level.
mbed_official 87:085cde657901 1272 * @param None
mbed_official 87:085cde657901 1273 * @retval uint8_t The FLASH BOR level:
mbed_official 87:085cde657901 1274 * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V
mbed_official 87:085cde657901 1275 * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V
mbed_official 87:085cde657901 1276 * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V
mbed_official 87:085cde657901 1277 * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V
mbed_official 87:085cde657901 1278 */
mbed_official 87:085cde657901 1279 static uint8_t FLASH_OB_GetBOR(void)
mbed_official 87:085cde657901 1280 {
mbed_official 87:085cde657901 1281 /* Return the FLASH BOR level */
mbed_official 87:085cde657901 1282 return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C);
mbed_official 87:085cde657901 1283 }
mbed_official 87:085cde657901 1284
mbed_official 87:085cde657901 1285 /**
mbed_official 87:085cde657901 1286 * @}
mbed_official 87:085cde657901 1287 */
mbed_official 87:085cde657901 1288
mbed_official 87:085cde657901 1289 #endif /* HAL_FLASH_MODULE_ENABLED */
mbed_official 87:085cde657901 1290
mbed_official 87:085cde657901 1291 /**
mbed_official 87:085cde657901 1292 * @}
mbed_official 87:085cde657901 1293 */
mbed_official 87:085cde657901 1294
mbed_official 87:085cde657901 1295 /**
mbed_official 87:085cde657901 1296 * @}
mbed_official 87:085cde657901 1297 */
mbed_official 87:085cde657901 1298
mbed_official 87:085cde657901 1299 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/