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:
Mon Sep 28 10:45:10 2015 +0100
Revision:
630:825f75ca301e
Parent:
441:d2c15dda23c1
Synchronized with git revision 54fbe4144faf309c37205a5d39fa665daa919f10

Full URL: https://github.com/mbedmicro/mbed/commit/54fbe4144faf309c37205a5d39fa665daa919f10/

NUCLEO_F031K6 : Add new target

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 340:28d1f895c6fe 1 /**
mbed_official 340:28d1f895c6fe 2 ******************************************************************************
mbed_official 340:28d1f895c6fe 3 * @file stm32f0xx_hal_flash_ex.c
mbed_official 340:28d1f895c6fe 4 * @author MCD Application Team
mbed_official 630:825f75ca301e 5 * @version V1.3.0
mbed_official 630:825f75ca301e 6 * @date 26-June-2015
mbed_official 340:28d1f895c6fe 7 * @brief Extended FLASH HAL module driver.
mbed_official 630:825f75ca301e 8 *
mbed_official 340:28d1f895c6fe 9 * This file provides firmware functions to manage the following
mbed_official 340:28d1f895c6fe 10 * functionalities of the FLASH peripheral:
mbed_official 340:28d1f895c6fe 11 * + Extended Initialization/de-initialization functions
mbed_official 340:28d1f895c6fe 12 * + Extended I/O operation functions
mbed_official 340:28d1f895c6fe 13 * + Extended Peripheral Control functions
mbed_official 340:28d1f895c6fe 14 *
mbed_official 340:28d1f895c6fe 15 @verbatim
mbed_official 340:28d1f895c6fe 16 ==============================================================================
mbed_official 340:28d1f895c6fe 17 ##### Flash peripheral extended features #####
mbed_official 340:28d1f895c6fe 18 ==============================================================================
mbed_official 340:28d1f895c6fe 19
mbed_official 340:28d1f895c6fe 20 ##### How to use this driver #####
mbed_official 340:28d1f895c6fe 21 ==============================================================================
mbed_official 340:28d1f895c6fe 22 [..] This driver provides functions to configure and program the FLASH memory
mbed_official 340:28d1f895c6fe 23 of all STM32F0xxx devices. It includes
mbed_official 340:28d1f895c6fe 24
mbed_official 630:825f75ca301e 25 (++) Set/Reset the write protection
mbed_official 630:825f75ca301e 26 (++) Program the user Option Bytes
mbed_official 630:825f75ca301e 27 (++) Get the Read protection Level
mbed_official 340:28d1f895c6fe 28
mbed_official 340:28d1f895c6fe 29 @endverbatim
mbed_official 340:28d1f895c6fe 30 ******************************************************************************
mbed_official 340:28d1f895c6fe 31 * @attention
mbed_official 340:28d1f895c6fe 32 *
mbed_official 630:825f75ca301e 33 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 340:28d1f895c6fe 34 *
mbed_official 340:28d1f895c6fe 35 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 340:28d1f895c6fe 36 * are permitted provided that the following conditions are met:
mbed_official 340:28d1f895c6fe 37 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 340:28d1f895c6fe 38 * this list of conditions and the following disclaimer.
mbed_official 340:28d1f895c6fe 39 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 340:28d1f895c6fe 40 * this list of conditions and the following disclaimer in the documentation
mbed_official 340:28d1f895c6fe 41 * and/or other materials provided with the distribution.
mbed_official 340:28d1f895c6fe 42 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 340:28d1f895c6fe 43 * may be used to endorse or promote products derived from this software
mbed_official 340:28d1f895c6fe 44 * without specific prior written permission.
mbed_official 340:28d1f895c6fe 45 *
mbed_official 340:28d1f895c6fe 46 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 340:28d1f895c6fe 47 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 340:28d1f895c6fe 48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 340:28d1f895c6fe 49 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 340:28d1f895c6fe 50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 340:28d1f895c6fe 51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 340:28d1f895c6fe 52 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 340:28d1f895c6fe 53 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 340:28d1f895c6fe 54 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 340:28d1f895c6fe 55 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 340:28d1f895c6fe 56 *
mbed_official 340:28d1f895c6fe 57 ******************************************************************************
mbed_official 340:28d1f895c6fe 58 */
mbed_official 340:28d1f895c6fe 59
mbed_official 340:28d1f895c6fe 60 /* Includes ------------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 61 #include "stm32f0xx_hal.h"
mbed_official 340:28d1f895c6fe 62
mbed_official 340:28d1f895c6fe 63 /** @addtogroup STM32F0xx_HAL_Driver
mbed_official 340:28d1f895c6fe 64 * @{
mbed_official 340:28d1f895c6fe 65 */
mbed_official 340:28d1f895c6fe 66 #ifdef HAL_FLASH_MODULE_ENABLED
mbed_official 340:28d1f895c6fe 67
mbed_official 630:825f75ca301e 68 /** @addtogroup FLASH
mbed_official 340:28d1f895c6fe 69 * @{
mbed_official 630:825f75ca301e 70 */
mbed_official 630:825f75ca301e 71 /** @addtogroup FLASH_Private_Variables
mbed_official 630:825f75ca301e 72 * @{
mbed_official 630:825f75ca301e 73 */
mbed_official 630:825f75ca301e 74 /* Variables used for Erase pages under interruption*/
mbed_official 630:825f75ca301e 75 extern FLASH_ProcessTypeDef pFlash;
mbed_official 630:825f75ca301e 76 /**
mbed_official 630:825f75ca301e 77 * @}
mbed_official 630:825f75ca301e 78 */
mbed_official 340:28d1f895c6fe 79
mbed_official 340:28d1f895c6fe 80 /**
mbed_official 340:28d1f895c6fe 81 * @}
mbed_official 340:28d1f895c6fe 82 */
mbed_official 340:28d1f895c6fe 83
mbed_official 630:825f75ca301e 84 /** @defgroup FLASHEx FLASHEx
mbed_official 630:825f75ca301e 85 * @brief FLASH Extended HAL module driver
mbed_official 340:28d1f895c6fe 86 * @{
mbed_official 630:825f75ca301e 87 */
mbed_official 340:28d1f895c6fe 88
mbed_official 630:825f75ca301e 89 /* Private typedef -----------------------------------------------------------*/
mbed_official 630:825f75ca301e 90 /* Private define ------------------------------------------------------------*/
mbed_official 630:825f75ca301e 91 /** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants
mbed_official 630:825f75ca301e 92 * @{
mbed_official 630:825f75ca301e 93 */
mbed_official 630:825f75ca301e 94 #define FLASH_POSITION_IWDGSW_BIT (uint32_t)8
mbed_official 340:28d1f895c6fe 95 /**
mbed_official 340:28d1f895c6fe 96 * @}
mbed_official 340:28d1f895c6fe 97 */
mbed_official 630:825f75ca301e 98
mbed_official 630:825f75ca301e 99 /* Private macro -------------------------------------------------------------*/
mbed_official 630:825f75ca301e 100 /** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros
mbed_official 340:28d1f895c6fe 101 * @{
mbed_official 340:28d1f895c6fe 102 */
mbed_official 630:825f75ca301e 103 /**
mbed_official 630:825f75ca301e 104 * @}
mbed_official 630:825f75ca301e 105 */
mbed_official 630:825f75ca301e 106
mbed_official 630:825f75ca301e 107 /* Private variables ---------------------------------------------------------*/
mbed_official 630:825f75ca301e 108 /* Private function prototypes -----------------------------------------------*/
mbed_official 630:825f75ca301e 109 /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
mbed_official 630:825f75ca301e 110 * @{
mbed_official 630:825f75ca301e 111 */
mbed_official 340:28d1f895c6fe 112 /* Erase operations */
mbed_official 340:28d1f895c6fe 113 static void FLASH_MassErase(void);
mbed_official 340:28d1f895c6fe 114
mbed_official 340:28d1f895c6fe 115 /* Option bytes control */
mbed_official 340:28d1f895c6fe 116 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage);
mbed_official 340:28d1f895c6fe 117 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage);
mbed_official 340:28d1f895c6fe 118 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel);
mbed_official 340:28d1f895c6fe 119 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig);
mbed_official 340:28d1f895c6fe 120 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data);
mbed_official 340:28d1f895c6fe 121 static uint32_t FLASH_OB_GetWRP(void);
mbed_official 630:825f75ca301e 122 static uint8_t FLASH_OB_GetRDP(void);
mbed_official 340:28d1f895c6fe 123 static uint8_t FLASH_OB_GetUser(void);
mbed_official 340:28d1f895c6fe 124
mbed_official 340:28d1f895c6fe 125 /**
mbed_official 340:28d1f895c6fe 126 * @}
mbed_official 340:28d1f895c6fe 127 */
mbed_official 340:28d1f895c6fe 128
mbed_official 630:825f75ca301e 129 /* Exported functions ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 130 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
mbed_official 340:28d1f895c6fe 131 * @{
mbed_official 340:28d1f895c6fe 132 */
mbed_official 630:825f75ca301e 133
mbed_official 630:825f75ca301e 134 /** @defgroup FLASHEx_Exported_Functions_Group1 Extended Input and Output operation functions
mbed_official 630:825f75ca301e 135 * @brief I/O operation functions
mbed_official 340:28d1f895c6fe 136 *
mbed_official 340:28d1f895c6fe 137 @verbatim
mbed_official 340:28d1f895c6fe 138 ===============================================================================
mbed_official 340:28d1f895c6fe 139 ##### IO operation functions #####
mbed_official 340:28d1f895c6fe 140 ===============================================================================
mbed_official 340:28d1f895c6fe 141
mbed_official 340:28d1f895c6fe 142 @endverbatim
mbed_official 340:28d1f895c6fe 143 * @{
mbed_official 340:28d1f895c6fe 144 */
mbed_official 630:825f75ca301e 145
mbed_official 630:825f75ca301e 146
mbed_official 340:28d1f895c6fe 147 /**
mbed_official 630:825f75ca301e 148 * @brief Perform a mass erase or erase the specified FLASH memory pages
mbed_official 340:28d1f895c6fe 149 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 150 * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
mbed_official 340:28d1f895c6fe 151 * @param[in] pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 340:28d1f895c6fe 152 * contains the configuration information for the erasing.
mbed_official 630:825f75ca301e 153 *
mbed_official 340:28d1f895c6fe 154 * @param[out] PageError: pointer to variable that
mbed_official 630:825f75ca301e 155 * contains the configuration information on faulty page in case of error
mbed_official 340:28d1f895c6fe 156 * (0xFFFFFFFF means that all the pages have been correctly erased)
mbed_official 630:825f75ca301e 157 *
mbed_official 340:28d1f895c6fe 158 * @retval HAL_StatusTypeDef HAL Status
mbed_official 340:28d1f895c6fe 159 */
mbed_official 340:28d1f895c6fe 160 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
mbed_official 340:28d1f895c6fe 161 {
mbed_official 340:28d1f895c6fe 162 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 163 uint32_t address = 0;
mbed_official 630:825f75ca301e 164
mbed_official 340:28d1f895c6fe 165 /* Process Locked */
mbed_official 340:28d1f895c6fe 166 __HAL_LOCK(&pFlash);
mbed_official 340:28d1f895c6fe 167
mbed_official 340:28d1f895c6fe 168 /* Check the parameters */
mbed_official 630:825f75ca301e 169 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 340:28d1f895c6fe 170
mbed_official 630:825f75ca301e 171 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 340:28d1f895c6fe 172 {
mbed_official 630:825f75ca301e 173 /* Mass Erase requested for Bank1 */
mbed_official 340:28d1f895c6fe 174 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 175 if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
mbed_official 630:825f75ca301e 176 {
mbed_official 630:825f75ca301e 177 /*Mass erase to be done*/
mbed_official 630:825f75ca301e 178 FLASH_MassErase();
mbed_official 630:825f75ca301e 179
mbed_official 630:825f75ca301e 180 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 181 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 182
mbed_official 630:825f75ca301e 183 /* If the erase operation is completed, disable the MER Bit */
mbed_official 630:825f75ca301e 184 CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
mbed_official 630:825f75ca301e 185 }
mbed_official 630:825f75ca301e 186 }
mbed_official 630:825f75ca301e 187 else
mbed_official 630:825f75ca301e 188 {
mbed_official 630:825f75ca301e 189 /* Page Erase is requested */
mbed_official 630:825f75ca301e 190 /* Check the parameters */
mbed_official 630:825f75ca301e 191 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
mbed_official 630:825f75ca301e 192 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
mbed_official 340:28d1f895c6fe 193
mbed_official 630:825f75ca301e 194 /* Page Erase requested on address located on bank1 */
mbed_official 630:825f75ca301e 195 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 196 if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
mbed_official 340:28d1f895c6fe 197 {
mbed_official 630:825f75ca301e 198 /*Initialization of PageError variable*/
mbed_official 630:825f75ca301e 199 *PageError = 0xFFFFFFFF;
mbed_official 630:825f75ca301e 200
mbed_official 630:825f75ca301e 201 /* Erase by page by page to be done*/
mbed_official 630:825f75ca301e 202 for(address = pEraseInit->PageAddress;
mbed_official 630:825f75ca301e 203 address < (pEraseInit->PageAddress + (pEraseInit->NbPages)*FLASH_PAGE_SIZE);
mbed_official 630:825f75ca301e 204 address += FLASH_PAGE_SIZE)
mbed_official 340:28d1f895c6fe 205 {
mbed_official 630:825f75ca301e 206 FLASH_PageErase(address);
mbed_official 630:825f75ca301e 207
mbed_official 630:825f75ca301e 208 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 209 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 210
mbed_official 630:825f75ca301e 211 /* If the erase operation is completed, disable the PER Bit */
mbed_official 630:825f75ca301e 212 CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
mbed_official 630:825f75ca301e 213
mbed_official 630:825f75ca301e 214 if (status != HAL_OK)
mbed_official 630:825f75ca301e 215 {
mbed_official 630:825f75ca301e 216 /* In case of error, stop erase procedure and return the faulty address */
mbed_official 630:825f75ca301e 217 *PageError = address;
mbed_official 630:825f75ca301e 218 break;
mbed_official 630:825f75ca301e 219 }
mbed_official 340:28d1f895c6fe 220 }
mbed_official 340:28d1f895c6fe 221 }
mbed_official 340:28d1f895c6fe 222 }
mbed_official 340:28d1f895c6fe 223
mbed_official 340:28d1f895c6fe 224 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 225 __HAL_UNLOCK(&pFlash);
mbed_official 340:28d1f895c6fe 226
mbed_official 340:28d1f895c6fe 227 return status;
mbed_official 340:28d1f895c6fe 228 }
mbed_official 340:28d1f895c6fe 229
mbed_official 340:28d1f895c6fe 230 /**
mbed_official 340:28d1f895c6fe 231 * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled
mbed_official 340:28d1f895c6fe 232 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 233 * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
mbed_official 340:28d1f895c6fe 234 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 340:28d1f895c6fe 235 * contains the configuration information for the erasing.
mbed_official 630:825f75ca301e 236 *
mbed_official 340:28d1f895c6fe 237 * @retval HAL_StatusTypeDef HAL Status
mbed_official 340:28d1f895c6fe 238 */
mbed_official 340:28d1f895c6fe 239 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
mbed_official 340:28d1f895c6fe 240 {
mbed_official 340:28d1f895c6fe 241 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 242
mbed_official 340:28d1f895c6fe 243 /* Process Locked */
mbed_official 340:28d1f895c6fe 244 __HAL_LOCK(&pFlash);
mbed_official 340:28d1f895c6fe 245
mbed_official 441:d2c15dda23c1 246 /* If procedure already ongoing, reject the next one */
mbed_official 441:d2c15dda23c1 247 if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
mbed_official 441:d2c15dda23c1 248 {
mbed_official 441:d2c15dda23c1 249 return HAL_ERROR;
mbed_official 441:d2c15dda23c1 250 }
mbed_official 441:d2c15dda23c1 251
mbed_official 340:28d1f895c6fe 252 /* Check the parameters */
mbed_official 630:825f75ca301e 253 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 340:28d1f895c6fe 254
mbed_official 340:28d1f895c6fe 255 /* Enable End of FLASH Operation and Error source interrupts */
mbed_official 340:28d1f895c6fe 256 __HAL_FLASH_ENABLE_IT((FLASH_IT_EOP | FLASH_IT_ERR));
mbed_official 630:825f75ca301e 257
mbed_official 630:825f75ca301e 258 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 340:28d1f895c6fe 259 {
mbed_official 340:28d1f895c6fe 260 /*Mass erase to be done*/
mbed_official 340:28d1f895c6fe 261 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
mbed_official 630:825f75ca301e 262 FLASH_MassErase();
mbed_official 340:28d1f895c6fe 263 }
mbed_official 340:28d1f895c6fe 264 else
mbed_official 340:28d1f895c6fe 265 {
mbed_official 340:28d1f895c6fe 266 /* Erase by page to be done*/
mbed_official 340:28d1f895c6fe 267
mbed_official 340:28d1f895c6fe 268 /* Check the parameters */
mbed_official 340:28d1f895c6fe 269 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
mbed_official 340:28d1f895c6fe 270 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
mbed_official 340:28d1f895c6fe 271
mbed_official 340:28d1f895c6fe 272 pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE;
mbed_official 340:28d1f895c6fe 273 pFlash.DataRemaining = pEraseInit->NbPages;
mbed_official 340:28d1f895c6fe 274 pFlash.Address = pEraseInit->PageAddress;
mbed_official 340:28d1f895c6fe 275
mbed_official 340:28d1f895c6fe 276 /*Erase 1st page and wait for IT*/
mbed_official 340:28d1f895c6fe 277 FLASH_PageErase(pEraseInit->PageAddress);
mbed_official 340:28d1f895c6fe 278 }
mbed_official 340:28d1f895c6fe 279
mbed_official 340:28d1f895c6fe 280 return status;
mbed_official 340:28d1f895c6fe 281 }
mbed_official 340:28d1f895c6fe 282
mbed_official 340:28d1f895c6fe 283 /**
mbed_official 340:28d1f895c6fe 284 * @}
mbed_official 340:28d1f895c6fe 285 */
mbed_official 340:28d1f895c6fe 286
mbed_official 630:825f75ca301e 287 /** @defgroup FLASHEx_Exported_Functions_Group2 Extended Peripheral Control functions
mbed_official 630:825f75ca301e 288 * @brief Peripheral Control functions
mbed_official 340:28d1f895c6fe 289 *
mbed_official 340:28d1f895c6fe 290 @verbatim
mbed_official 340:28d1f895c6fe 291 ===============================================================================
mbed_official 340:28d1f895c6fe 292 ##### Peripheral Control functions #####
mbed_official 340:28d1f895c6fe 293 ===============================================================================
mbed_official 340:28d1f895c6fe 294 [..]
mbed_official 340:28d1f895c6fe 295 This subsection provides a set of functions allowing to control the FLASH
mbed_official 340:28d1f895c6fe 296 memory operations.
mbed_official 340:28d1f895c6fe 297
mbed_official 340:28d1f895c6fe 298 @endverbatim
mbed_official 340:28d1f895c6fe 299 * @{
mbed_official 340:28d1f895c6fe 300 */
mbed_official 630:825f75ca301e 301
mbed_official 340:28d1f895c6fe 302 /**
mbed_official 340:28d1f895c6fe 303 * @brief Erases the FLASH option bytes.
mbed_official 630:825f75ca301e 304 * @note This functions erases all option bytes except the Read protection (RDP).
mbed_official 340:28d1f895c6fe 305 * The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 306 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 630:825f75ca301e 307 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 308 * (system reset will occur)
mbed_official 340:28d1f895c6fe 309 * @retval HAL status
mbed_official 340:28d1f895c6fe 310 */
mbed_official 340:28d1f895c6fe 311
mbed_official 340:28d1f895c6fe 312 HAL_StatusTypeDef HAL_FLASHEx_OBErase(void)
mbed_official 340:28d1f895c6fe 313 {
mbed_official 340:28d1f895c6fe 314 uint8_t rdptmp = OB_RDP_LEVEL_0;
mbed_official 340:28d1f895c6fe 315 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 316
mbed_official 340:28d1f895c6fe 317 /* Get the actual read protection Option Byte value */
mbed_official 630:825f75ca301e 318 rdptmp = FLASH_OB_GetRDP();
mbed_official 340:28d1f895c6fe 319
mbed_official 340:28d1f895c6fe 320 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 321 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 322
mbed_official 441:d2c15dda23c1 323 if(status == HAL_OK)
mbed_official 441:d2c15dda23c1 324 {
mbed_official 441:d2c15dda23c1 325 /* Clean the error context */
mbed_official 630:825f75ca301e 326 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 340:28d1f895c6fe 327
mbed_official 340:28d1f895c6fe 328 /* If the previous operation is completed, proceed to erase the option bytes */
mbed_official 340:28d1f895c6fe 329 SET_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 340:28d1f895c6fe 330 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 340:28d1f895c6fe 331
mbed_official 340:28d1f895c6fe 332 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 333 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 334
mbed_official 340:28d1f895c6fe 335 /* If the erase operation is completed, disable the OPTER Bit */
mbed_official 340:28d1f895c6fe 336 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 340:28d1f895c6fe 337
mbed_official 340:28d1f895c6fe 338 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 339 {
mbed_official 340:28d1f895c6fe 340 /* Restore the last read protection Option Byte value */
mbed_official 630:825f75ca301e 341 status = FLASH_OB_RDP_LevelConfig(rdptmp);
mbed_official 340:28d1f895c6fe 342 }
mbed_official 340:28d1f895c6fe 343 }
mbed_official 340:28d1f895c6fe 344
mbed_official 340:28d1f895c6fe 345 /* Return the erase status */
mbed_official 340:28d1f895c6fe 346 return status;
mbed_official 340:28d1f895c6fe 347 }
mbed_official 340:28d1f895c6fe 348
mbed_official 340:28d1f895c6fe 349 /**
mbed_official 340:28d1f895c6fe 350 * @brief Program option bytes
mbed_official 340:28d1f895c6fe 351 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 352 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 630:825f75ca301e 353 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 354 * (system reset will occur)
mbed_official 340:28d1f895c6fe 355 *
mbed_official 340:28d1f895c6fe 356 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 340:28d1f895c6fe 357 * contains the configuration information for the programming.
mbed_official 630:825f75ca301e 358 *
mbed_official 340:28d1f895c6fe 359 * @retval HAL_StatusTypeDef HAL Status
mbed_official 340:28d1f895c6fe 360 */
mbed_official 340:28d1f895c6fe 361 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 340:28d1f895c6fe 362 {
mbed_official 340:28d1f895c6fe 363 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 630:825f75ca301e 364
mbed_official 340:28d1f895c6fe 365 /* Check the parameters */
mbed_official 340:28d1f895c6fe 366 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
mbed_official 340:28d1f895c6fe 367
mbed_official 340:28d1f895c6fe 368 /* Write protection configuration */
mbed_official 340:28d1f895c6fe 369 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
mbed_official 340:28d1f895c6fe 370 {
mbed_official 340:28d1f895c6fe 371 assert_param(IS_WRPSTATE(pOBInit->WRPState));
mbed_official 630:825f75ca301e 372 if (pOBInit->WRPState == OB_WRPSTATE_ENABLE)
mbed_official 340:28d1f895c6fe 373 {
mbed_official 340:28d1f895c6fe 374 /* Enable of Write protection on the selected page */
mbed_official 340:28d1f895c6fe 375 status = FLASH_OB_EnableWRP(pOBInit->WRPPage);
mbed_official 340:28d1f895c6fe 376 }
mbed_official 340:28d1f895c6fe 377 else
mbed_official 340:28d1f895c6fe 378 {
mbed_official 340:28d1f895c6fe 379 /* Disable of Write protection on the selected page */
mbed_official 340:28d1f895c6fe 380 status = FLASH_OB_DisableWRP(pOBInit->WRPPage);
mbed_official 340:28d1f895c6fe 381 }
mbed_official 340:28d1f895c6fe 382 }
mbed_official 340:28d1f895c6fe 383
mbed_official 340:28d1f895c6fe 384 /* Read protection configuration */
mbed_official 340:28d1f895c6fe 385 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
mbed_official 340:28d1f895c6fe 386 {
mbed_official 340:28d1f895c6fe 387 status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
mbed_official 340:28d1f895c6fe 388 }
mbed_official 340:28d1f895c6fe 389
mbed_official 340:28d1f895c6fe 390 /* USER configuration */
mbed_official 340:28d1f895c6fe 391 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
mbed_official 340:28d1f895c6fe 392 {
mbed_official 340:28d1f895c6fe 393 status = FLASH_OB_UserConfig(pOBInit->USERConfig);
mbed_official 340:28d1f895c6fe 394 }
mbed_official 340:28d1f895c6fe 395
mbed_official 340:28d1f895c6fe 396 /* DATA configuration*/
mbed_official 340:28d1f895c6fe 397 if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA)
mbed_official 340:28d1f895c6fe 398 {
mbed_official 340:28d1f895c6fe 399 status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData);
mbed_official 340:28d1f895c6fe 400 }
mbed_official 340:28d1f895c6fe 401
mbed_official 340:28d1f895c6fe 402 return status;
mbed_official 340:28d1f895c6fe 403 }
mbed_official 340:28d1f895c6fe 404
mbed_official 340:28d1f895c6fe 405 /**
mbed_official 340:28d1f895c6fe 406 * @brief Get the Option byte configuration
mbed_official 340:28d1f895c6fe 407 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 340:28d1f895c6fe 408 * contains the configuration information for the programming.
mbed_official 630:825f75ca301e 409 *
mbed_official 340:28d1f895c6fe 410 * @retval None
mbed_official 340:28d1f895c6fe 411 */
mbed_official 340:28d1f895c6fe 412 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 340:28d1f895c6fe 413 {
mbed_official 340:28d1f895c6fe 414 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER;
mbed_official 340:28d1f895c6fe 415
mbed_official 340:28d1f895c6fe 416 /*Get WRP*/
mbed_official 340:28d1f895c6fe 417 pOBInit->WRPPage = FLASH_OB_GetWRP();
mbed_official 340:28d1f895c6fe 418
mbed_official 340:28d1f895c6fe 419 /*Get RDP Level*/
mbed_official 340:28d1f895c6fe 420 pOBInit->RDPLevel = FLASH_OB_GetRDP();
mbed_official 340:28d1f895c6fe 421
mbed_official 340:28d1f895c6fe 422 /*Get USER*/
mbed_official 340:28d1f895c6fe 423 pOBInit->USERConfig = FLASH_OB_GetUser();
mbed_official 340:28d1f895c6fe 424 }
mbed_official 340:28d1f895c6fe 425
mbed_official 340:28d1f895c6fe 426 /**
mbed_official 340:28d1f895c6fe 427 * @}
mbed_official 340:28d1f895c6fe 428 */
mbed_official 340:28d1f895c6fe 429
mbed_official 340:28d1f895c6fe 430 /**
mbed_official 340:28d1f895c6fe 431 * @}
mbed_official 340:28d1f895c6fe 432 */
mbed_official 340:28d1f895c6fe 433
mbed_official 630:825f75ca301e 434 /** @addtogroup FLASHEx_Private_Functions
mbed_official 630:825f75ca301e 435 * @{
mbed_official 630:825f75ca301e 436 */
mbed_official 340:28d1f895c6fe 437
mbed_official 340:28d1f895c6fe 438 /**
mbed_official 630:825f75ca301e 439 * @brief Full erase of FLASH memory Bank
mbed_official 630:825f75ca301e 440 *
mbed_official 630:825f75ca301e 441 * @retval HAL Status
mbed_official 340:28d1f895c6fe 442 */
mbed_official 340:28d1f895c6fe 443 static void FLASH_MassErase(void)
mbed_official 340:28d1f895c6fe 444 {
mbed_official 441:d2c15dda23c1 445 /* Clean the error context */
mbed_official 630:825f75ca301e 446 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 447
mbed_official 630:825f75ca301e 448 /* Only bank1 will be erased*/
mbed_official 630:825f75ca301e 449 SET_BIT(FLASH->CR, FLASH_CR_MER);
mbed_official 630:825f75ca301e 450 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 340:28d1f895c6fe 451 }
mbed_official 340:28d1f895c6fe 452
mbed_official 340:28d1f895c6fe 453 /**
mbed_official 340:28d1f895c6fe 454 * @brief Enable the write protection of the desired pages
mbed_official 630:825f75ca301e 455 * @note An option byte erase is done automatically in this function.
mbed_official 340:28d1f895c6fe 456 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 630:825f75ca301e 457 * it is not possible to program or erase the flash page i if
mbed_official 340:28d1f895c6fe 458 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 340:28d1f895c6fe 459 *
mbed_official 340:28d1f895c6fe 460 * @param WriteProtectPage: specifies the page(s) to be write protected.
mbed_official 340:28d1f895c6fe 461 * The value of this parameter depend on device used within the same series
mbed_official 340:28d1f895c6fe 462 * @retval HAL status
mbed_official 340:28d1f895c6fe 463 */
mbed_official 340:28d1f895c6fe 464 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage)
mbed_official 340:28d1f895c6fe 465 {
mbed_official 340:28d1f895c6fe 466 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 467 uint16_t WRP0_Data = 0xFFFF;
mbed_official 630:825f75ca301e 468 #if defined(OB_WRP1_WRP1)
mbed_official 340:28d1f895c6fe 469 uint16_t WRP1_Data = 0xFFFF;
mbed_official 630:825f75ca301e 470 #endif /* OB_WRP1_WRP1 */
mbed_official 630:825f75ca301e 471 #if defined(OB_WRP2_WRP2)
mbed_official 630:825f75ca301e 472 uint16_t WRP2_Data = 0xFFFF;
mbed_official 630:825f75ca301e 473 #endif /* OB_WRP2_WRP2 */
mbed_official 630:825f75ca301e 474 #if defined(OB_WRP3_WRP3)
mbed_official 630:825f75ca301e 475 uint16_t WRP3_Data = 0xFFFF;
mbed_official 630:825f75ca301e 476 #endif /* OB_WRP3_WRP3 */
mbed_official 340:28d1f895c6fe 477
mbed_official 340:28d1f895c6fe 478 /* Check the parameters */
mbed_official 340:28d1f895c6fe 479 assert_param(IS_OB_WRP(WriteProtectPage));
mbed_official 340:28d1f895c6fe 480
mbed_official 630:825f75ca301e 481 /* Get current write protected pages and the new pages to be protected ******/
mbed_official 630:825f75ca301e 482 WriteProtectPage = (uint32_t)(~((~FLASH_OB_GetWRP()) | WriteProtectPage));
mbed_official 630:825f75ca301e 483
mbed_official 630:825f75ca301e 484 #if defined(OB_WRP_PAGES0TO31MASK)
mbed_official 340:28d1f895c6fe 485 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 630:825f75ca301e 486 #elif defined(OB_WRP_PAGES0TO15MASK)
mbed_official 340:28d1f895c6fe 487 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 630:825f75ca301e 488 #endif /* OB_WRP_PAGES0TO31MASK */
mbed_official 630:825f75ca301e 489
mbed_official 630:825f75ca301e 490 #if defined(OB_WRP_PAGES32TO63MASK)
mbed_official 630:825f75ca301e 491 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 630:825f75ca301e 492 #elif defined(OB_WRP_PAGES16TO31MASK)
mbed_official 340:28d1f895c6fe 493 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 630:825f75ca301e 494 #endif /* OB_WRP_PAGES32TO63MASK */
mbed_official 630:825f75ca301e 495
mbed_official 630:825f75ca301e 496 #if defined(OB_WRP_PAGES32TO47MASK)
mbed_official 340:28d1f895c6fe 497 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 630:825f75ca301e 498 #endif /* OB_WRP_PAGES32TO47MASK */
mbed_official 630:825f75ca301e 499
mbed_official 630:825f75ca301e 500 #if defined(OB_WRP_PAGES48TO63MASK)
mbed_official 340:28d1f895c6fe 501 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO63MASK) >> 24);
mbed_official 630:825f75ca301e 502 #elif defined(OB_WRP_PAGES48TO127MASK)
mbed_official 340:28d1f895c6fe 503 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 630:825f75ca301e 504 #endif /* OB_WRP_PAGES48TO63MASK */
mbed_official 630:825f75ca301e 505
mbed_official 340:28d1f895c6fe 506 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 507 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 508
mbed_official 441:d2c15dda23c1 509 if(status == HAL_OK)
mbed_official 630:825f75ca301e 510 {
mbed_official 441:d2c15dda23c1 511 /* Clean the error context */
mbed_official 630:825f75ca301e 512 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 340:28d1f895c6fe 513
mbed_official 630:825f75ca301e 514 /* To be able to write again option byte, need to perform a option byte erase */
mbed_official 630:825f75ca301e 515 status = HAL_FLASHEx_OBErase();
mbed_official 630:825f75ca301e 516 if (status == HAL_OK)
mbed_official 340:28d1f895c6fe 517 {
mbed_official 630:825f75ca301e 518 /* Enable write protection */
mbed_official 630:825f75ca301e 519 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 630:825f75ca301e 520
mbed_official 630:825f75ca301e 521 #if defined(OB_WRP0_WRP0)
mbed_official 630:825f75ca301e 522 if(WRP0_Data != 0xFF)
mbed_official 630:825f75ca301e 523 {
mbed_official 630:825f75ca301e 524 OB->WRP0 &= WRP0_Data;
mbed_official 630:825f75ca301e 525
mbed_official 630:825f75ca301e 526 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 527 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 528 }
mbed_official 630:825f75ca301e 529 #endif /* OB_WRP0_WRP0 */
mbed_official 630:825f75ca301e 530
mbed_official 630:825f75ca301e 531 #if defined(OB_WRP1_WRP1)
mbed_official 630:825f75ca301e 532 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 630:825f75ca301e 533 {
mbed_official 630:825f75ca301e 534 OB->WRP1 &= WRP1_Data;
mbed_official 630:825f75ca301e 535
mbed_official 630:825f75ca301e 536 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 537 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 538 }
mbed_official 630:825f75ca301e 539 #endif /* OB_WRP1_WRP1 */
mbed_official 340:28d1f895c6fe 540
mbed_official 630:825f75ca301e 541 #if defined(OB_WRP2_WRP2)
mbed_official 630:825f75ca301e 542 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 630:825f75ca301e 543 {
mbed_official 630:825f75ca301e 544 OB->WRP2 &= WRP2_Data;
mbed_official 630:825f75ca301e 545
mbed_official 630:825f75ca301e 546 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 547 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 548 }
mbed_official 630:825f75ca301e 549 #endif /* OB_WRP2_WRP2 */
mbed_official 630:825f75ca301e 550
mbed_official 630:825f75ca301e 551 #if defined(OB_WRP3_WRP3)
mbed_official 630:825f75ca301e 552 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 630:825f75ca301e 553 {
mbed_official 630:825f75ca301e 554 OB->WRP3 &= WRP3_Data;
mbed_official 630:825f75ca301e 555
mbed_official 630:825f75ca301e 556 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 557 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 558 }
mbed_official 630:825f75ca301e 559 #endif /* OB_WRP3_WRP3 */
mbed_official 630:825f75ca301e 560
mbed_official 630:825f75ca301e 561 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 630:825f75ca301e 562 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 563 }
mbed_official 340:28d1f895c6fe 564 }
mbed_official 340:28d1f895c6fe 565
mbed_official 340:28d1f895c6fe 566 return status;
mbed_official 340:28d1f895c6fe 567 }
mbed_official 340:28d1f895c6fe 568
mbed_official 340:28d1f895c6fe 569 /**
mbed_official 340:28d1f895c6fe 570 * @brief Disable the write protection of the desired pages
mbed_official 630:825f75ca301e 571 * @note An option byte erase is done automatically in this function.
mbed_official 340:28d1f895c6fe 572 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 630:825f75ca301e 573 * it is not possible to program or erase the flash page i if
mbed_official 340:28d1f895c6fe 574 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 340:28d1f895c6fe 575 *
mbed_official 340:28d1f895c6fe 576 * @param WriteProtectPage: specifies the page(s) to be write unprotected.
mbed_official 340:28d1f895c6fe 577 * The value of this parameter depend on device used within the same series
mbed_official 340:28d1f895c6fe 578 * @retval HAL status
mbed_official 340:28d1f895c6fe 579 */
mbed_official 340:28d1f895c6fe 580 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage)
mbed_official 340:28d1f895c6fe 581 {
mbed_official 340:28d1f895c6fe 582 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 583 uint16_t WRP0_Data = 0xFFFF;
mbed_official 630:825f75ca301e 584 #if defined(OB_WRP1_WRP1)
mbed_official 340:28d1f895c6fe 585 uint16_t WRP1_Data = 0xFFFF;
mbed_official 630:825f75ca301e 586 #endif /* OB_WRP1_WRP1 */
mbed_official 630:825f75ca301e 587 #if defined(OB_WRP2_WRP2)
mbed_official 630:825f75ca301e 588 uint16_t WRP2_Data = 0xFFFF;
mbed_official 630:825f75ca301e 589 #endif /* OB_WRP2_WRP2 */
mbed_official 630:825f75ca301e 590 #if defined(OB_WRP3_WRP3)
mbed_official 630:825f75ca301e 591 uint16_t WRP3_Data = 0xFFFF;
mbed_official 630:825f75ca301e 592 #endif /* OB_WRP3_WRP3 */
mbed_official 340:28d1f895c6fe 593
mbed_official 340:28d1f895c6fe 594 /* Check the parameters */
mbed_official 340:28d1f895c6fe 595 assert_param(IS_OB_WRP(WriteProtectPage));
mbed_official 340:28d1f895c6fe 596
mbed_official 630:825f75ca301e 597 /* Get current write protected pages and the new pages to be unprotected ******/
mbed_official 630:825f75ca301e 598 WriteProtectPage = (FLASH_OB_GetWRP() | WriteProtectPage);
mbed_official 630:825f75ca301e 599
mbed_official 630:825f75ca301e 600 #if defined(OB_WRP_PAGES0TO31MASK)
mbed_official 340:28d1f895c6fe 601 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 630:825f75ca301e 602 #elif defined(OB_WRP_PAGES0TO15MASK)
mbed_official 630:825f75ca301e 603 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 630:825f75ca301e 604 #endif /* OB_WRP_PAGES0TO31MASK */
mbed_official 630:825f75ca301e 605
mbed_official 630:825f75ca301e 606 #if defined(OB_WRP_PAGES32TO63MASK)
mbed_official 340:28d1f895c6fe 607 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 630:825f75ca301e 608 #elif defined(OB_WRP_PAGES16TO31MASK)
mbed_official 340:28d1f895c6fe 609 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 630:825f75ca301e 610 #endif /* OB_WRP_PAGES32TO63MASK */
mbed_official 630:825f75ca301e 611
mbed_official 630:825f75ca301e 612 #if defined(OB_WRP_PAGES32TO47MASK)
mbed_official 340:28d1f895c6fe 613 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 630:825f75ca301e 614 #endif /* OB_WRP_PAGES32TO47MASK */
mbed_official 630:825f75ca301e 615
mbed_official 630:825f75ca301e 616 #if defined(OB_WRP_PAGES48TO63MASK)
mbed_official 340:28d1f895c6fe 617 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO63MASK) >> 24);
mbed_official 630:825f75ca301e 618 #elif defined(OB_WRP_PAGES48TO127MASK)
mbed_official 340:28d1f895c6fe 619 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 630:825f75ca301e 620 #endif /* OB_WRP_PAGES48TO63MASK */
mbed_official 630:825f75ca301e 621
mbed_official 340:28d1f895c6fe 622 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 623 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 624
mbed_official 340:28d1f895c6fe 625 if(status == HAL_OK)
mbed_official 630:825f75ca301e 626 {
mbed_official 441:d2c15dda23c1 627 /* Clean the error context */
mbed_official 630:825f75ca301e 628 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 340:28d1f895c6fe 629
mbed_official 630:825f75ca301e 630 /* To be able to write again option byte, need to perform a option byte erase */
mbed_official 630:825f75ca301e 631 status = HAL_FLASHEx_OBErase();
mbed_official 630:825f75ca301e 632 if (status == HAL_OK)
mbed_official 340:28d1f895c6fe 633 {
mbed_official 630:825f75ca301e 634 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 630:825f75ca301e 635
mbed_official 630:825f75ca301e 636 #if defined(OB_WRP0_WRP0)
mbed_official 630:825f75ca301e 637 if(WRP0_Data != 0xFF)
mbed_official 630:825f75ca301e 638 {
mbed_official 630:825f75ca301e 639 OB->WRP0 |= WRP0_Data;
mbed_official 630:825f75ca301e 640
mbed_official 630:825f75ca301e 641 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 642 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 643 }
mbed_official 630:825f75ca301e 644 #endif /* OB_WRP0_WRP0 */
mbed_official 630:825f75ca301e 645
mbed_official 630:825f75ca301e 646 #if defined(OB_WRP1_WRP1)
mbed_official 630:825f75ca301e 647 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 630:825f75ca301e 648 {
mbed_official 630:825f75ca301e 649 OB->WRP1 |= WRP1_Data;
mbed_official 630:825f75ca301e 650
mbed_official 630:825f75ca301e 651 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 652 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 653 }
mbed_official 630:825f75ca301e 654 #endif /* OB_WRP1_WRP1 */
mbed_official 340:28d1f895c6fe 655
mbed_official 630:825f75ca301e 656 #if defined(OB_WRP2_WRP2)
mbed_official 630:825f75ca301e 657 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 630:825f75ca301e 658 {
mbed_official 630:825f75ca301e 659 OB->WRP2 |= WRP2_Data;
mbed_official 630:825f75ca301e 660
mbed_official 630:825f75ca301e 661 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 662 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 663 }
mbed_official 630:825f75ca301e 664 #endif /* OB_WRP2_WRP2 */
mbed_official 630:825f75ca301e 665
mbed_official 630:825f75ca301e 666 #if defined(OB_WRP3_WRP3)
mbed_official 630:825f75ca301e 667 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 630:825f75ca301e 668 {
mbed_official 630:825f75ca301e 669 OB->WRP3 |= WRP3_Data;
mbed_official 630:825f75ca301e 670
mbed_official 630:825f75ca301e 671 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 672 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 673 }
mbed_official 630:825f75ca301e 674 #endif /* OB_WRP3_WRP3 */
mbed_official 630:825f75ca301e 675
mbed_official 630:825f75ca301e 676 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 630:825f75ca301e 677 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 678 }
mbed_official 630:825f75ca301e 679 }
mbed_official 340:28d1f895c6fe 680 return status;
mbed_official 340:28d1f895c6fe 681 }
mbed_official 340:28d1f895c6fe 682
mbed_official 340:28d1f895c6fe 683 /**
mbed_official 340:28d1f895c6fe 684 * @brief Set the read protection level.
mbed_official 340:28d1f895c6fe 685 * @param ReadProtectLevel: specifies the read protection level.
mbed_official 340:28d1f895c6fe 686 * This parameter can be one of the following values:
mbed_official 340:28d1f895c6fe 687 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 340:28d1f895c6fe 688 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 340:28d1f895c6fe 689 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 340:28d1f895c6fe 690 * @note Warning: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0
mbed_official 340:28d1f895c6fe 691 * @retval HAL status
mbed_official 340:28d1f895c6fe 692 */
mbed_official 340:28d1f895c6fe 693 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel)
mbed_official 340:28d1f895c6fe 694 {
mbed_official 340:28d1f895c6fe 695 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 696
mbed_official 340:28d1f895c6fe 697 /* Check the parameters */
mbed_official 340:28d1f895c6fe 698 assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel));
mbed_official 630:825f75ca301e 699
mbed_official 340:28d1f895c6fe 700 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 701 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 702
mbed_official 340:28d1f895c6fe 703 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 704 {
mbed_official 441:d2c15dda23c1 705 /* Clean the error context */
mbed_official 630:825f75ca301e 706 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 630:825f75ca301e 707
mbed_official 630:825f75ca301e 708 /* If the previous operation is completed, proceed to erase the option bytes */
mbed_official 630:825f75ca301e 709 SET_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 630:825f75ca301e 710 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 340:28d1f895c6fe 711
mbed_official 340:28d1f895c6fe 712 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 713 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 714
mbed_official 630:825f75ca301e 715 /* If the erase operation is completed, disable the OPTER Bit */
mbed_official 630:825f75ca301e 716 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 340:28d1f895c6fe 717
mbed_official 630:825f75ca301e 718 if(status == HAL_OK)
mbed_official 630:825f75ca301e 719 {
mbed_official 630:825f75ca301e 720 /* Enable the Option Bytes Programming operation */
mbed_official 630:825f75ca301e 721 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 630:825f75ca301e 722
mbed_official 630:825f75ca301e 723 WRITE_REG(OB->RDP, ReadProtectLevel);
mbed_official 630:825f75ca301e 724
mbed_official 630:825f75ca301e 725 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 726 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 727
mbed_official 340:28d1f895c6fe 728 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 729 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 730 }
mbed_official 630:825f75ca301e 731 }
mbed_official 340:28d1f895c6fe 732
mbed_official 340:28d1f895c6fe 733 return status;
mbed_official 340:28d1f895c6fe 734 }
mbed_official 340:28d1f895c6fe 735
mbed_official 340:28d1f895c6fe 736 /**
mbed_official 340:28d1f895c6fe 737 * @brief Program the FLASH User Option Byte.
mbed_official 340:28d1f895c6fe 738 * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 630:825f75ca301e 739 * @param UserConfig: The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), nBOOT1(Bit4),
mbed_official 340:28d1f895c6fe 740 * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6).
mbed_official 630:825f75ca301e 741 * For few devices, following option bytes are available: nBOOT0(Bit3) & BOOT_SEL(Bit7).
mbed_official 340:28d1f895c6fe 742 * @retval HAL status
mbed_official 340:28d1f895c6fe 743 */
mbed_official 340:28d1f895c6fe 744 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig)
mbed_official 340:28d1f895c6fe 745 {
mbed_official 340:28d1f895c6fe 746 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 747
mbed_official 340:28d1f895c6fe 748 /* Check the parameters */
mbed_official 630:825f75ca301e 749 assert_param(IS_OB_IWDG_SOURCE((UserConfig&OB_IWDG_SW)));
mbed_official 340:28d1f895c6fe 750 assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST)));
mbed_official 340:28d1f895c6fe 751 assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST)));
mbed_official 340:28d1f895c6fe 752 assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET)));
mbed_official 340:28d1f895c6fe 753 assert_param(IS_OB_VDDA_ANALOG((UserConfig&OB_VDDA_ANALOG_ON)));
mbed_official 340:28d1f895c6fe 754 assert_param(IS_OB_SRAM_PARITY((UserConfig&OB_RAM_PARITY_CHECK_RESET)));
mbed_official 630:825f75ca301e 755 #if defined(FLASH_OBR_BOOT_SEL)
mbed_official 340:28d1f895c6fe 756 assert_param(IS_OB_BOOT_SEL((UserConfig&OB_BOOT_SEL_SET)));
mbed_official 340:28d1f895c6fe 757 assert_param(IS_OB_BOOT0((UserConfig&OB_BOOT0_SET)));
mbed_official 630:825f75ca301e 758 #endif /* FLASH_OBR_BOOT_SEL */
mbed_official 340:28d1f895c6fe 759
mbed_official 340:28d1f895c6fe 760 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 761 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 762
mbed_official 340:28d1f895c6fe 763 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 764 {
mbed_official 441:d2c15dda23c1 765 /* Clean the error context */
mbed_official 630:825f75ca301e 766 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 630:825f75ca301e 767
mbed_official 340:28d1f895c6fe 768 /* Enable the Option Bytes Programming operation */
mbed_official 340:28d1f895c6fe 769 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 630:825f75ca301e 770
mbed_official 630:825f75ca301e 771 #if defined(FLASH_OBR_BOOT_SEL)
mbed_official 340:28d1f895c6fe 772 OB->USER = UserConfig;
mbed_official 340:28d1f895c6fe 773 #else
mbed_official 340:28d1f895c6fe 774 OB->USER = (UserConfig | 0x88);
mbed_official 630:825f75ca301e 775 #endif /* FLASH_OBR_BOOT_SEL */
mbed_official 630:825f75ca301e 776
mbed_official 340:28d1f895c6fe 777 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 778 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 779
mbed_official 340:28d1f895c6fe 780 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 781 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 782 }
mbed_official 340:28d1f895c6fe 783
mbed_official 340:28d1f895c6fe 784 return status;
mbed_official 340:28d1f895c6fe 785 }
mbed_official 340:28d1f895c6fe 786
mbed_official 340:28d1f895c6fe 787 /**
mbed_official 340:28d1f895c6fe 788 * @brief Programs a half word at a specified Option Byte Data address.
mbed_official 340:28d1f895c6fe 789 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 790 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 340:28d1f895c6fe 791 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 792 * (system reset will occur)
mbed_official 340:28d1f895c6fe 793 * Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 340:28d1f895c6fe 794 * @param Address: specifies the address to be programmed.
mbed_official 340:28d1f895c6fe 795 * This parameter can be 0x1FFFF804 or 0x1FFFF806.
mbed_official 340:28d1f895c6fe 796 * @param Data: specifies the data to be programmed.
mbed_official 340:28d1f895c6fe 797 * @retval HAL status
mbed_official 340:28d1f895c6fe 798 */
mbed_official 340:28d1f895c6fe 799 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data)
mbed_official 340:28d1f895c6fe 800 {
mbed_official 340:28d1f895c6fe 801 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 630:825f75ca301e 802
mbed_official 340:28d1f895c6fe 803 /* Check the parameters */
mbed_official 340:28d1f895c6fe 804 assert_param(IS_OB_DATA_ADDRESS(Address));
mbed_official 630:825f75ca301e 805
mbed_official 340:28d1f895c6fe 806 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 807 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 630:825f75ca301e 808
mbed_official 340:28d1f895c6fe 809 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 810 {
mbed_official 441:d2c15dda23c1 811 /* Clean the error context */
mbed_official 630:825f75ca301e 812 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 813
mbed_official 340:28d1f895c6fe 814 /* Enables the Option Bytes Programming operation */
mbed_official 340:28d1f895c6fe 815 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 816 *(__IO uint16_t*)Address = Data;
mbed_official 340:28d1f895c6fe 817
mbed_official 340:28d1f895c6fe 818 /* Wait for last operation to be completed */
mbed_official 630:825f75ca301e 819 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 820
mbed_official 630:825f75ca301e 821 /* If the program operation is completed, disable the OPTPG Bit */
mbed_official 630:825f75ca301e 822 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 630:825f75ca301e 823 }
mbed_official 340:28d1f895c6fe 824 /* Return the Option Byte Data Program Status */
mbed_official 340:28d1f895c6fe 825 return status;
mbed_official 340:28d1f895c6fe 826 }
mbed_official 340:28d1f895c6fe 827
mbed_official 340:28d1f895c6fe 828 /**
mbed_official 340:28d1f895c6fe 829 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 340:28d1f895c6fe 830 * @retval The FLASH Write Protection Option Bytes value
mbed_official 340:28d1f895c6fe 831 */
mbed_official 340:28d1f895c6fe 832 static uint32_t FLASH_OB_GetWRP(void)
mbed_official 340:28d1f895c6fe 833 {
mbed_official 340:28d1f895c6fe 834 /* Return the FLASH write protection Register value */
mbed_official 340:28d1f895c6fe 835 return (uint32_t)(READ_REG(FLASH->WRPR));
mbed_official 340:28d1f895c6fe 836 }
mbed_official 340:28d1f895c6fe 837
mbed_official 340:28d1f895c6fe 838 /**
mbed_official 340:28d1f895c6fe 839 * @brief Returns the FLASH Read Protection level.
mbed_official 340:28d1f895c6fe 840 * @retval FLASH ReadOut Protection Status:
mbed_official 630:825f75ca301e 841 * This parameter can be one of the following values:
mbed_official 630:825f75ca301e 842 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 630:825f75ca301e 843 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 630:825f75ca301e 844 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 340:28d1f895c6fe 845 */
mbed_official 630:825f75ca301e 846 static uint8_t FLASH_OB_GetRDP(void)
mbed_official 340:28d1f895c6fe 847 {
mbed_official 630:825f75ca301e 848 uint8_t readstatus = OB_RDP_LEVEL_0;
mbed_official 340:28d1f895c6fe 849
mbed_official 630:825f75ca301e 850 if (HAL_IS_BIT_SET(FLASH->OBR, FLASH_OBR_RDPRT1))
mbed_official 630:825f75ca301e 851 {
mbed_official 630:825f75ca301e 852 readstatus = OB_RDP_LEVEL_1;
mbed_official 630:825f75ca301e 853 }
mbed_official 630:825f75ca301e 854 else if (HAL_IS_BIT_SET(FLASH->OBR, FLASH_OBR_RDPRT2))
mbed_official 340:28d1f895c6fe 855 {
mbed_official 630:825f75ca301e 856 readstatus = OB_RDP_LEVEL_2;
mbed_official 630:825f75ca301e 857 }
mbed_official 630:825f75ca301e 858 else
mbed_official 630:825f75ca301e 859 {
mbed_official 630:825f75ca301e 860 readstatus = OB_RDP_LEVEL_0;
mbed_official 340:28d1f895c6fe 861 }
mbed_official 340:28d1f895c6fe 862
mbed_official 340:28d1f895c6fe 863 return readstatus;
mbed_official 340:28d1f895c6fe 864 }
mbed_official 340:28d1f895c6fe 865
mbed_official 340:28d1f895c6fe 866 /**
mbed_official 340:28d1f895c6fe 867 * @brief Return the FLASH User Option Byte value.
mbed_official 630:825f75ca301e 868 * @retval The FLASH User Option Bytes values: FLASH_OBR_IWDG_SW(Bit0), FLASH_OBR_nRST_STOP(Bit1),
mbed_official 630:825f75ca301e 869 * FLASH_OBR_nRST_STDBY(Bit2), FLASH_OBR_nBOOT1(Bit4),
mbed_official 630:825f75ca301e 870 * FLASH_OBR_VDDA_MONITOR(Bit5), FLASH_OBR_RAM_PARITY_CHECK(Bit6) and FLASH_OBR_BOOT_SEL(Bit7) (*).
mbed_official 630:825f75ca301e 871 * @note (*) not present on all the devices.
mbed_official 340:28d1f895c6fe 872 */
mbed_official 340:28d1f895c6fe 873 static uint8_t FLASH_OB_GetUser(void)
mbed_official 340:28d1f895c6fe 874 {
mbed_official 340:28d1f895c6fe 875 /* Return the User Option Byte */
mbed_official 630:825f75ca301e 876 return (uint8_t)((READ_REG(FLASH->OBR) & FLASH_OBR_USER) >> FLASH_POSITION_IWDGSW_BIT);
mbed_official 340:28d1f895c6fe 877 }
mbed_official 340:28d1f895c6fe 878
mbed_official 340:28d1f895c6fe 879 /**
mbed_official 340:28d1f895c6fe 880 * @}
mbed_official 340:28d1f895c6fe 881 */
mbed_official 340:28d1f895c6fe 882
mbed_official 340:28d1f895c6fe 883 /**
mbed_official 340:28d1f895c6fe 884 * @}
mbed_official 340:28d1f895c6fe 885 */
mbed_official 340:28d1f895c6fe 886
mbed_official 630:825f75ca301e 887 /** @addtogroup FLASH
mbed_official 630:825f75ca301e 888 * @{
mbed_official 630:825f75ca301e 889 */
mbed_official 630:825f75ca301e 890
mbed_official 630:825f75ca301e 891
mbed_official 630:825f75ca301e 892 /** @addtogroup FLASH_Private_Functions
mbed_official 630:825f75ca301e 893 * @{
mbed_official 630:825f75ca301e 894 */
mbed_official 630:825f75ca301e 895
mbed_official 630:825f75ca301e 896 /**
mbed_official 630:825f75ca301e 897 * @brief Erase the specified FLASH memory page
mbed_official 630:825f75ca301e 898 * @param PageAddress: FLASH page to erase
mbed_official 630:825f75ca301e 899 * The value of this parameter depend on device used within the same series
mbed_official 630:825f75ca301e 900 *
mbed_official 630:825f75ca301e 901 * @retval None
mbed_official 630:825f75ca301e 902 */
mbed_official 630:825f75ca301e 903 void FLASH_PageErase(uint32_t PageAddress)
mbed_official 630:825f75ca301e 904 {
mbed_official 630:825f75ca301e 905 /* Clean the error context */
mbed_official 630:825f75ca301e 906 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 630:825f75ca301e 907
mbed_official 630:825f75ca301e 908 /* Proceed to erase the page */
mbed_official 630:825f75ca301e 909 SET_BIT(FLASH->CR, FLASH_CR_PER);
mbed_official 630:825f75ca301e 910 WRITE_REG(FLASH->AR, PageAddress);
mbed_official 630:825f75ca301e 911 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 630:825f75ca301e 912 }
mbed_official 630:825f75ca301e 913
mbed_official 630:825f75ca301e 914 /**
mbed_official 630:825f75ca301e 915 * @}
mbed_official 630:825f75ca301e 916 */
mbed_official 630:825f75ca301e 917
mbed_official 630:825f75ca301e 918 /**
mbed_official 630:825f75ca301e 919 * @}
mbed_official 630:825f75ca301e 920 */
mbed_official 630:825f75ca301e 921
mbed_official 630:825f75ca301e 922 /**
mbed_official 630:825f75ca301e 923 * @}
mbed_official 630:825f75ca301e 924 */
mbed_official 630:825f75ca301e 925
mbed_official 630:825f75ca301e 926 #endif /* HAL_FLASH_MODULE_ENABLED */
mbed_official 630:825f75ca301e 927 /**
mbed_official 630:825f75ca301e 928 * @}
mbed_official 630:825f75ca301e 929 */
mbed_official 630:825f75ca301e 930
mbed_official 340:28d1f895c6fe 931 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/