mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

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