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:
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****/