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:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
441:d2c15dda23c1
Child:
630:825f75ca301e
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

Full URL: https://github.com/mbedmicro/mbed/commit/d5b4d2ab9c47edb4dc5776e7177b0c2263459081/

Initial version of drivers for SAMR21

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 441:d2c15dda23c1 5 * @version V1.2.0
mbed_official 441:d2c15dda23c1 6 * @date 11-December-2014
mbed_official 340:28d1f895c6fe 7 * @brief Extended FLASH HAL module driver.
mbed_official 340:28d1f895c6fe 8 * This file provides firmware functions to manage the following
mbed_official 340:28d1f895c6fe 9 * functionalities of the FLASH peripheral:
mbed_official 340:28d1f895c6fe 10 * + Extended Initialization/de-initialization functions
mbed_official 340:28d1f895c6fe 11 * + Extended I/O operation functions
mbed_official 340:28d1f895c6fe 12 * + Extended Peripheral Control functions
mbed_official 340:28d1f895c6fe 13 * + Extended Peripheral State 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 340:28d1f895c6fe 25 (+) Set/Reset the write protection
mbed_official 340:28d1f895c6fe 26 (+) Program the user Option Bytes
mbed_official 340:28d1f895c6fe 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 340:28d1f895c6fe 33 * <h2><center>&copy; COPYRIGHT(c) 2014 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
mbed_official 340:28d1f895c6fe 67 /** @defgroup FLASHEx FLASHEx Extended HAL module driver
mbed_official 340:28d1f895c6fe 68 * @brief FLASH Extended HAL module driver
mbed_official 340:28d1f895c6fe 69 * @{
mbed_official 340:28d1f895c6fe 70 */
mbed_official 340:28d1f895c6fe 71
mbed_official 340:28d1f895c6fe 72 #ifdef HAL_FLASH_MODULE_ENABLED
mbed_official 340:28d1f895c6fe 73
mbed_official 340:28d1f895c6fe 74 /* Private typedef -----------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 75 /* Private define ------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 76
mbed_official 340:28d1f895c6fe 77 /** @addtogroup FLASHEx_Private_Constants FLASHEx Private Constants
mbed_official 340:28d1f895c6fe 78 * @{
mbed_official 340:28d1f895c6fe 79 */
mbed_official 340:28d1f895c6fe 80 #define HAL_FLASH_TIMEOUT_VALUE ((uint32_t)50000)/* 50 s */
mbed_official 340:28d1f895c6fe 81
mbed_official 340:28d1f895c6fe 82 /**
mbed_official 340:28d1f895c6fe 83 * @}
mbed_official 340:28d1f895c6fe 84 */
mbed_official 340:28d1f895c6fe 85
mbed_official 340:28d1f895c6fe 86 /* Private macro -------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 87 /* Private variables ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 88 /** @addtogroup FLASHEx_Private_Variables FLASHEx Private Variables
mbed_official 340:28d1f895c6fe 89 * @{
mbed_official 340:28d1f895c6fe 90 */
mbed_official 340:28d1f895c6fe 91
mbed_official 340:28d1f895c6fe 92 /* Variables used for Erase pages under interruption*/
mbed_official 340:28d1f895c6fe 93 extern FLASH_ProcessTypeDef pFlash;
mbed_official 340:28d1f895c6fe 94
mbed_official 340:28d1f895c6fe 95 /**
mbed_official 340:28d1f895c6fe 96 * @}
mbed_official 340:28d1f895c6fe 97 */
mbed_official 340:28d1f895c6fe 98
mbed_official 340:28d1f895c6fe 99 /* Private function prototypes -----------------------------------------------*/
mbed_official 340:28d1f895c6fe 100 /** @addtogroup FLASHEx_Private_Functions FLASHEx Private Functions
mbed_official 340:28d1f895c6fe 101 * @{
mbed_official 340:28d1f895c6fe 102 */
mbed_official 340:28d1f895c6fe 103
mbed_official 340:28d1f895c6fe 104 /* Erase operations */
mbed_official 340:28d1f895c6fe 105 extern void FLASH_PageErase(uint32_t PageAddress);
mbed_official 340:28d1f895c6fe 106 static void FLASH_MassErase(void);
mbed_official 340:28d1f895c6fe 107
mbed_official 340:28d1f895c6fe 108 /* Option bytes control */
mbed_official 340:28d1f895c6fe 109 static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage);
mbed_official 340:28d1f895c6fe 110 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage);
mbed_official 340:28d1f895c6fe 111 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel);
mbed_official 340:28d1f895c6fe 112 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig);
mbed_official 340:28d1f895c6fe 113 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data);
mbed_official 340:28d1f895c6fe 114 static uint32_t FLASH_OB_GetWRP(void);
mbed_official 340:28d1f895c6fe 115 static FlagStatus FLASH_OB_GetRDP(void);
mbed_official 340:28d1f895c6fe 116 static uint8_t FLASH_OB_GetUser(void);
mbed_official 340:28d1f895c6fe 117
mbed_official 340:28d1f895c6fe 118 /**
mbed_official 340:28d1f895c6fe 119 * @}
mbed_official 340:28d1f895c6fe 120 */
mbed_official 340:28d1f895c6fe 121
mbed_official 340:28d1f895c6fe 122 /** @defgroup FLASHEx_Extern_Functions FLASHEx Extern Functions
mbed_official 340:28d1f895c6fe 123 * @{
mbed_official 340:28d1f895c6fe 124 */
mbed_official 340:28d1f895c6fe 125 /* Private functions ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 126 extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
mbed_official 340:28d1f895c6fe 127
mbed_official 340:28d1f895c6fe 128 /**
mbed_official 340:28d1f895c6fe 129 * @}
mbed_official 340:28d1f895c6fe 130 */
mbed_official 340:28d1f895c6fe 131
mbed_official 340:28d1f895c6fe 132 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
mbed_official 340:28d1f895c6fe 133 * @{
mbed_official 340:28d1f895c6fe 134 */
mbed_official 340:28d1f895c6fe 135
mbed_official 340:28d1f895c6fe 136 /** @defgroup FLASHEx_Exported_Functions_Group2 Extended I/O operation functions
mbed_official 340:28d1f895c6fe 137 * @brief Extended I/O operation functions
mbed_official 340:28d1f895c6fe 138 *
mbed_official 340:28d1f895c6fe 139 @verbatim
mbed_official 340:28d1f895c6fe 140 ===============================================================================
mbed_official 340:28d1f895c6fe 141 ##### IO operation functions #####
mbed_official 340:28d1f895c6fe 142 ===============================================================================
mbed_official 340:28d1f895c6fe 143
mbed_official 340:28d1f895c6fe 144 @endverbatim
mbed_official 340:28d1f895c6fe 145 * @{
mbed_official 340:28d1f895c6fe 146 */
mbed_official 340:28d1f895c6fe 147 /**
mbed_official 340:28d1f895c6fe 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 340:28d1f895c6fe 153 *
mbed_official 340:28d1f895c6fe 154 * @param[out] PageError: pointer to variable that
mbed_official 340:28d1f895c6fe 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 340:28d1f895c6fe 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 340:28d1f895c6fe 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 340:28d1f895c6fe 169 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
mbed_official 340:28d1f895c6fe 170
mbed_official 340:28d1f895c6fe 171 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 172 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 173
mbed_official 340:28d1f895c6fe 174 if (status == HAL_OK)
mbed_official 340:28d1f895c6fe 175 {
mbed_official 340:28d1f895c6fe 176 if (pEraseInit->TypeErase == TYPEERASE_MASSERASE)
mbed_official 340:28d1f895c6fe 177 {
mbed_official 340:28d1f895c6fe 178 /*Mass erase to be done*/
mbed_official 340:28d1f895c6fe 179 FLASH_MassErase();
mbed_official 340:28d1f895c6fe 180
mbed_official 340:28d1f895c6fe 181 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 182 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 183
mbed_official 340:28d1f895c6fe 184 /* If the erase operation is completed, disable the MER Bit */
mbed_official 340:28d1f895c6fe 185 CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
mbed_official 340:28d1f895c6fe 186 }
mbed_official 340:28d1f895c6fe 187 else
mbed_official 340:28d1f895c6fe 188 {
mbed_official 340:28d1f895c6fe 189 /* Check the parameters */
mbed_official 340:28d1f895c6fe 190 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
mbed_official 340:28d1f895c6fe 191 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
mbed_official 340:28d1f895c6fe 192
mbed_official 340:28d1f895c6fe 193 /*Initialization of PageError variable*/
mbed_official 340:28d1f895c6fe 194 *PageError = 0xFFFFFFFF;
mbed_official 340:28d1f895c6fe 195
mbed_official 340:28d1f895c6fe 196 /* Erase by page by page to be done*/
mbed_official 340:28d1f895c6fe 197 for(address = pEraseInit->PageAddress;
mbed_official 340:28d1f895c6fe 198 address < (pEraseInit->PageAddress + (pEraseInit->NbPages)*FLASH_PAGE_SIZE);
mbed_official 340:28d1f895c6fe 199 address += FLASH_PAGE_SIZE)
mbed_official 340:28d1f895c6fe 200 {
mbed_official 340:28d1f895c6fe 201 FLASH_PageErase(address);
mbed_official 340:28d1f895c6fe 202
mbed_official 340:28d1f895c6fe 203 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 204 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 441:d2c15dda23c1 205
mbed_official 340:28d1f895c6fe 206 /* If the erase operation is completed, disable the PER Bit */
mbed_official 340:28d1f895c6fe 207 CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
mbed_official 340:28d1f895c6fe 208
mbed_official 340:28d1f895c6fe 209 if (status != HAL_OK)
mbed_official 340:28d1f895c6fe 210 {
mbed_official 340:28d1f895c6fe 211 /* In case of error, stop erase procedure and return the faulty address */
mbed_official 340:28d1f895c6fe 212 *PageError = address;
mbed_official 340:28d1f895c6fe 213 break;
mbed_official 340:28d1f895c6fe 214 }
mbed_official 340:28d1f895c6fe 215 }
mbed_official 340:28d1f895c6fe 216 }
mbed_official 340:28d1f895c6fe 217 }
mbed_official 340:28d1f895c6fe 218
mbed_official 340:28d1f895c6fe 219 /* Process Unlocked */
mbed_official 340:28d1f895c6fe 220 __HAL_UNLOCK(&pFlash);
mbed_official 340:28d1f895c6fe 221
mbed_official 340:28d1f895c6fe 222 return status;
mbed_official 340:28d1f895c6fe 223 }
mbed_official 340:28d1f895c6fe 224
mbed_official 340:28d1f895c6fe 225 /**
mbed_official 340:28d1f895c6fe 226 * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled
mbed_official 340:28d1f895c6fe 227 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 228 * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
mbed_official 340:28d1f895c6fe 229 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 340:28d1f895c6fe 230 * contains the configuration information for the erasing.
mbed_official 340:28d1f895c6fe 231 *
mbed_official 340:28d1f895c6fe 232 * @retval HAL_StatusTypeDef HAL Status
mbed_official 340:28d1f895c6fe 233 */
mbed_official 340:28d1f895c6fe 234 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
mbed_official 340:28d1f895c6fe 235 {
mbed_official 340:28d1f895c6fe 236 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 237
mbed_official 340:28d1f895c6fe 238 /* Process Locked */
mbed_official 340:28d1f895c6fe 239 __HAL_LOCK(&pFlash);
mbed_official 340:28d1f895c6fe 240
mbed_official 441:d2c15dda23c1 241 /* If procedure already ongoing, reject the next one */
mbed_official 441:d2c15dda23c1 242 if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
mbed_official 441:d2c15dda23c1 243 {
mbed_official 441:d2c15dda23c1 244 return HAL_ERROR;
mbed_official 441:d2c15dda23c1 245 }
mbed_official 441:d2c15dda23c1 246
mbed_official 340:28d1f895c6fe 247 /* Check the parameters */
mbed_official 340:28d1f895c6fe 248 assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
mbed_official 340:28d1f895c6fe 249
mbed_official 340:28d1f895c6fe 250 /* Enable End of FLASH Operation and Error source interrupts */
mbed_official 340:28d1f895c6fe 251 __HAL_FLASH_ENABLE_IT((FLASH_IT_EOP | FLASH_IT_ERR));
mbed_official 340:28d1f895c6fe 252
mbed_official 340:28d1f895c6fe 253 if (pEraseInit->TypeErase == TYPEERASE_MASSERASE)
mbed_official 340:28d1f895c6fe 254 {
mbed_official 340:28d1f895c6fe 255 /*Mass erase to be done*/
mbed_official 340:28d1f895c6fe 256 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE;
mbed_official 340:28d1f895c6fe 257 FLASH_MassErase();
mbed_official 340:28d1f895c6fe 258 }
mbed_official 340:28d1f895c6fe 259 else
mbed_official 340:28d1f895c6fe 260 {
mbed_official 340:28d1f895c6fe 261 /* Erase by page to be done*/
mbed_official 340:28d1f895c6fe 262
mbed_official 340:28d1f895c6fe 263 /* Check the parameters */
mbed_official 340:28d1f895c6fe 264 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
mbed_official 340:28d1f895c6fe 265 assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
mbed_official 340:28d1f895c6fe 266
mbed_official 340:28d1f895c6fe 267 pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE;
mbed_official 340:28d1f895c6fe 268 pFlash.DataRemaining = pEraseInit->NbPages;
mbed_official 340:28d1f895c6fe 269 pFlash.Address = pEraseInit->PageAddress;
mbed_official 340:28d1f895c6fe 270
mbed_official 340:28d1f895c6fe 271 /*Erase 1st page and wait for IT*/
mbed_official 340:28d1f895c6fe 272 FLASH_PageErase(pEraseInit->PageAddress);
mbed_official 340:28d1f895c6fe 273 }
mbed_official 340:28d1f895c6fe 274
mbed_official 340:28d1f895c6fe 275 return status;
mbed_official 340:28d1f895c6fe 276 }
mbed_official 340:28d1f895c6fe 277
mbed_official 340:28d1f895c6fe 278 /**
mbed_official 340:28d1f895c6fe 279 * @}
mbed_official 340:28d1f895c6fe 280 */
mbed_official 340:28d1f895c6fe 281
mbed_official 340:28d1f895c6fe 282 /** @defgroup FLASHEx_Exported_Functions_Group3 Extended Peripheral Control functions
mbed_official 340:28d1f895c6fe 283 * @brief Extended Peripheral Control functions
mbed_official 340:28d1f895c6fe 284 *
mbed_official 340:28d1f895c6fe 285 @verbatim
mbed_official 340:28d1f895c6fe 286 ===============================================================================
mbed_official 340:28d1f895c6fe 287 ##### Peripheral Control functions #####
mbed_official 340:28d1f895c6fe 288 ===============================================================================
mbed_official 340:28d1f895c6fe 289 [..]
mbed_official 340:28d1f895c6fe 290 This subsection provides a set of functions allowing to control the FLASH
mbed_official 340:28d1f895c6fe 291 memory operations.
mbed_official 340:28d1f895c6fe 292
mbed_official 340:28d1f895c6fe 293 @endverbatim
mbed_official 340:28d1f895c6fe 294 * @{
mbed_official 340:28d1f895c6fe 295 */
mbed_official 340:28d1f895c6fe 296 /**
mbed_official 340:28d1f895c6fe 297 * @brief Erases the FLASH option bytes.
mbed_official 340:28d1f895c6fe 298 * @note This functions erases all option bytes except the Read protection (RDP).
mbed_official 340:28d1f895c6fe 299 * The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 300 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 340:28d1f895c6fe 301 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 302 * (system reset will occur)
mbed_official 340:28d1f895c6fe 303 * @retval HAL status
mbed_official 340:28d1f895c6fe 304 */
mbed_official 340:28d1f895c6fe 305
mbed_official 340:28d1f895c6fe 306 HAL_StatusTypeDef HAL_FLASHEx_OBErase(void)
mbed_official 340:28d1f895c6fe 307 {
mbed_official 340:28d1f895c6fe 308 uint8_t rdptmp = OB_RDP_LEVEL_0;
mbed_official 340:28d1f895c6fe 309 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 310 FLASH_OBProgramInitTypeDef optionsbytes;
mbed_official 340:28d1f895c6fe 311
mbed_official 340:28d1f895c6fe 312 /* Get the actual read protection Option Byte value */
mbed_official 340:28d1f895c6fe 313 HAL_FLASHEx_OBGetConfig(&optionsbytes);
mbed_official 340:28d1f895c6fe 314 if(optionsbytes.RDPLevel != RESET)
mbed_official 340:28d1f895c6fe 315 {
mbed_official 340:28d1f895c6fe 316 rdptmp = OB_RDP_LEVEL_1;
mbed_official 340:28d1f895c6fe 317 }
mbed_official 340:28d1f895c6fe 318
mbed_official 340:28d1f895c6fe 319 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 320 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 321
mbed_official 441:d2c15dda23c1 322 if(status == HAL_OK)
mbed_official 441:d2c15dda23c1 323 {
mbed_official 441:d2c15dda23c1 324 /* Clean the error context */
mbed_official 441:d2c15dda23c1 325 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 340:28d1f895c6fe 326
mbed_official 340:28d1f895c6fe 327 /* If the previous operation is completed, proceed to erase the option bytes */
mbed_official 340:28d1f895c6fe 328 SET_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 340:28d1f895c6fe 329 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 340:28d1f895c6fe 330
mbed_official 340:28d1f895c6fe 331 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 332 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 333
mbed_official 340:28d1f895c6fe 334 /* If the erase operation is completed, disable the OPTER Bit */
mbed_official 340:28d1f895c6fe 335 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER);
mbed_official 340:28d1f895c6fe 336
mbed_official 340:28d1f895c6fe 337 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 338 {
mbed_official 340:28d1f895c6fe 339 /* Restore the last read protection Option Byte value */
mbed_official 340:28d1f895c6fe 340 optionsbytes.OptionType = OPTIONBYTE_RDP;
mbed_official 340:28d1f895c6fe 341 optionsbytes.RDPLevel = rdptmp;
mbed_official 340:28d1f895c6fe 342 status = HAL_FLASHEx_OBProgram(&optionsbytes);
mbed_official 340:28d1f895c6fe 343 }
mbed_official 340:28d1f895c6fe 344 }
mbed_official 340:28d1f895c6fe 345
mbed_official 340:28d1f895c6fe 346 /* Return the erase status */
mbed_official 340:28d1f895c6fe 347 return status;
mbed_official 340:28d1f895c6fe 348 }
mbed_official 340:28d1f895c6fe 349
mbed_official 340:28d1f895c6fe 350 /**
mbed_official 340:28d1f895c6fe 351 * @brief Program option bytes
mbed_official 340:28d1f895c6fe 352 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 353 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 340:28d1f895c6fe 354 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 355 * (system reset will occur)
mbed_official 340:28d1f895c6fe 356 *
mbed_official 340:28d1f895c6fe 357 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 340:28d1f895c6fe 358 * contains the configuration information for the programming.
mbed_official 340:28d1f895c6fe 359 *
mbed_official 340:28d1f895c6fe 360 * @retval HAL_StatusTypeDef HAL Status
mbed_official 340:28d1f895c6fe 361 */
mbed_official 340:28d1f895c6fe 362 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 340:28d1f895c6fe 363 {
mbed_official 340:28d1f895c6fe 364 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 365
mbed_official 340:28d1f895c6fe 366 /* Check the parameters */
mbed_official 340:28d1f895c6fe 367 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
mbed_official 340:28d1f895c6fe 368
mbed_official 340:28d1f895c6fe 369 /* Write protection configuration */
mbed_official 340:28d1f895c6fe 370 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
mbed_official 340:28d1f895c6fe 371 {
mbed_official 340:28d1f895c6fe 372 assert_param(IS_WRPSTATE(pOBInit->WRPState));
mbed_official 340:28d1f895c6fe 373 if (pOBInit->WRPState == WRPSTATE_ENABLE)
mbed_official 340:28d1f895c6fe 374 {
mbed_official 340:28d1f895c6fe 375 /* Enable of Write protection on the selected page */
mbed_official 340:28d1f895c6fe 376 status = FLASH_OB_EnableWRP(pOBInit->WRPPage);
mbed_official 340:28d1f895c6fe 377 }
mbed_official 340:28d1f895c6fe 378 else
mbed_official 340:28d1f895c6fe 379 {
mbed_official 340:28d1f895c6fe 380 /* Disable of Write protection on the selected page */
mbed_official 340:28d1f895c6fe 381 status = FLASH_OB_DisableWRP(pOBInit->WRPPage);
mbed_official 340:28d1f895c6fe 382 }
mbed_official 340:28d1f895c6fe 383 }
mbed_official 340:28d1f895c6fe 384
mbed_official 340:28d1f895c6fe 385 /* Read protection configuration */
mbed_official 340:28d1f895c6fe 386 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
mbed_official 340:28d1f895c6fe 387 {
mbed_official 340:28d1f895c6fe 388 status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel);
mbed_official 340:28d1f895c6fe 389 }
mbed_official 340:28d1f895c6fe 390
mbed_official 340:28d1f895c6fe 391 /* USER configuration */
mbed_official 340:28d1f895c6fe 392 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
mbed_official 340:28d1f895c6fe 393 {
mbed_official 340:28d1f895c6fe 394 status = FLASH_OB_UserConfig(pOBInit->USERConfig);
mbed_official 340:28d1f895c6fe 395 }
mbed_official 340:28d1f895c6fe 396
mbed_official 340:28d1f895c6fe 397 /* DATA configuration*/
mbed_official 340:28d1f895c6fe 398 if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA)
mbed_official 340:28d1f895c6fe 399 {
mbed_official 340:28d1f895c6fe 400 status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData);
mbed_official 340:28d1f895c6fe 401 }
mbed_official 340:28d1f895c6fe 402
mbed_official 340:28d1f895c6fe 403 return status;
mbed_official 340:28d1f895c6fe 404 }
mbed_official 340:28d1f895c6fe 405
mbed_official 340:28d1f895c6fe 406 /**
mbed_official 340:28d1f895c6fe 407 * @brief Get the Option byte configuration
mbed_official 340:28d1f895c6fe 408 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 340:28d1f895c6fe 409 * contains the configuration information for the programming.
mbed_official 340:28d1f895c6fe 410 *
mbed_official 340:28d1f895c6fe 411 * @retval None
mbed_official 340:28d1f895c6fe 412 */
mbed_official 340:28d1f895c6fe 413 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 340:28d1f895c6fe 414 {
mbed_official 340:28d1f895c6fe 415 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER;
mbed_official 340:28d1f895c6fe 416
mbed_official 340:28d1f895c6fe 417 /*Get WRP*/
mbed_official 340:28d1f895c6fe 418 pOBInit->WRPPage = FLASH_OB_GetWRP();
mbed_official 340:28d1f895c6fe 419
mbed_official 340:28d1f895c6fe 420 /*Get RDP Level*/
mbed_official 340:28d1f895c6fe 421 pOBInit->RDPLevel = FLASH_OB_GetRDP();
mbed_official 340:28d1f895c6fe 422
mbed_official 340:28d1f895c6fe 423 /*Get USER*/
mbed_official 340:28d1f895c6fe 424 pOBInit->USERConfig = FLASH_OB_GetUser();
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 340:28d1f895c6fe 434
mbed_official 340:28d1f895c6fe 435 /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
mbed_official 340:28d1f895c6fe 436 * @{
mbed_official 340:28d1f895c6fe 437 */
mbed_official 340:28d1f895c6fe 438
mbed_official 340:28d1f895c6fe 439 /**
mbed_official 340:28d1f895c6fe 440 * @brief Mass erase of FLASH memory
mbed_official 340:28d1f895c6fe 441 * @retval None
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
mbed_official 441:d2c15dda23c1 446 /* Clean the error context */
mbed_official 441:d2c15dda23c1 447 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 448
mbed_official 340:28d1f895c6fe 449 /* Proceed to erase all sectors */
mbed_official 340:28d1f895c6fe 450 SET_BIT(FLASH->CR, FLASH_CR_MER);
mbed_official 340:28d1f895c6fe 451 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 340:28d1f895c6fe 452 }
mbed_official 340:28d1f895c6fe 453
mbed_official 340:28d1f895c6fe 454 /**
mbed_official 340:28d1f895c6fe 455 * @brief Enable the write protection of the desired pages
mbed_official 340:28d1f895c6fe 456 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 340:28d1f895c6fe 457 * it is not possible to program or erase the flash page i if CortexM4
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 441:d2c15dda23c1 467 #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) || defined(STM32F070x6) || \
mbed_official 340:28d1f895c6fe 468 defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 469 uint16_t WRP0_Data = 0xFFFF;
mbed_official 340:28d1f895c6fe 470 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 471 uint16_t WRP1_Data = 0xFFFF;
mbed_official 340:28d1f895c6fe 472 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx */
mbed_official 441:d2c15dda23c1 473 #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */
mbed_official 340:28d1f895c6fe 474
mbed_official 441:d2c15dda23c1 475 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 476 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 477 uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
mbed_official 441:d2c15dda23c1 478 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F070xB || STM32F030xC */
mbed_official 340:28d1f895c6fe 479
mbed_official 340:28d1f895c6fe 480 /* Check the parameters */
mbed_official 340:28d1f895c6fe 481 assert_param(IS_OB_WRP(WriteProtectPage));
mbed_official 340:28d1f895c6fe 482
mbed_official 340:28d1f895c6fe 483 WriteProtectPage = (uint32_t)(~WriteProtectPage);
mbed_official 441:d2c15dda23c1 484 #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) || defined(STM32F070x6) || \
mbed_official 340:28d1f895c6fe 485 defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 486 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 340:28d1f895c6fe 487 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 488 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 340:28d1f895c6fe 489 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx */
mbed_official 441:d2c15dda23c1 490 #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */
mbed_official 340:28d1f895c6fe 491
mbed_official 441:d2c15dda23c1 492 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 493 defined(STM32F091xC) || defined(STM32F098xx)|| defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 494 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 340:28d1f895c6fe 495 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 340:28d1f895c6fe 496 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 340:28d1f895c6fe 497 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx)
mbed_official 340:28d1f895c6fe 498 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO63MASK) >> 24);
mbed_official 340:28d1f895c6fe 499 #endif /* STM32F071xB || STM32F072xB || STM32F078xx */
mbed_official 340:28d1f895c6fe 500 #if defined(STM32F091xC) || defined(STM32F098xx)
mbed_official 340:28d1f895c6fe 501 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 340:28d1f895c6fe 502 #endif /* STM32F091xC || STM32F098xx */
mbed_official 441:d2c15dda23c1 503 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F070xB || STM32F030xC */
mbed_official 340:28d1f895c6fe 504
mbed_official 340:28d1f895c6fe 505 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 506 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 507
mbed_official 441:d2c15dda23c1 508 if(status == HAL_OK)
mbed_official 441:d2c15dda23c1 509 {
mbed_official 441:d2c15dda23c1 510 /* Clean the error context */
mbed_official 441:d2c15dda23c1 511 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 340:28d1f895c6fe 512
mbed_official 340:28d1f895c6fe 513 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 514
mbed_official 340:28d1f895c6fe 515 if(WRP0_Data != 0xFF)
mbed_official 340:28d1f895c6fe 516 {
mbed_official 340:28d1f895c6fe 517 OB->WRP0 &= WRP0_Data;
mbed_official 340:28d1f895c6fe 518
mbed_official 340:28d1f895c6fe 519 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 520 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 521 }
mbed_official 340:28d1f895c6fe 522
mbed_official 340:28d1f895c6fe 523 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx) || \
mbed_official 441:d2c15dda23c1 524 defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 525 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 526 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 340:28d1f895c6fe 527 {
mbed_official 340:28d1f895c6fe 528 OB->WRP1 &= WRP1_Data;
mbed_official 340:28d1f895c6fe 529
mbed_official 340:28d1f895c6fe 530 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 531 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 532 }
mbed_official 441:d2c15dda23c1 533 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx || STM32F071xB || STM32F070xB ||
mbed_official 441:d2c15dda23c1 534 STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */
mbed_official 340:28d1f895c6fe 535
mbed_official 441:d2c15dda23c1 536 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx)|| defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 537 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 538 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 340:28d1f895c6fe 539 {
mbed_official 340:28d1f895c6fe 540 OB->WRP2 &= WRP2_Data;
mbed_official 340:28d1f895c6fe 541
mbed_official 340:28d1f895c6fe 542 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 543 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 544 }
mbed_official 340:28d1f895c6fe 545
mbed_official 340:28d1f895c6fe 546 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 340:28d1f895c6fe 547 {
mbed_official 340:28d1f895c6fe 548 OB->WRP3 &= WRP3_Data;
mbed_official 340:28d1f895c6fe 549
mbed_official 340:28d1f895c6fe 550 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 551 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 552 }
mbed_official 441:d2c15dda23c1 553 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F070xB || STM32F030xC*/
mbed_official 340:28d1f895c6fe 554
mbed_official 340:28d1f895c6fe 555 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 556 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 557 }
mbed_official 340:28d1f895c6fe 558
mbed_official 340:28d1f895c6fe 559 return status;
mbed_official 340:28d1f895c6fe 560 }
mbed_official 340:28d1f895c6fe 561
mbed_official 340:28d1f895c6fe 562 /**
mbed_official 340:28d1f895c6fe 563 * @brief Disable the write protection of the desired pages
mbed_official 340:28d1f895c6fe 564 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 340:28d1f895c6fe 565 * it is not possible to program or erase the flash page i if CortexM4
mbed_official 340:28d1f895c6fe 566 * debug features are connected or boot code is executed in RAM, even if nWRPi = 1
mbed_official 340:28d1f895c6fe 567 *
mbed_official 340:28d1f895c6fe 568 * @param WriteProtectPage: specifies the page(s) to be write unprotected.
mbed_official 340:28d1f895c6fe 569 * The value of this parameter depend on device used within the same series
mbed_official 340:28d1f895c6fe 570 * @retval HAL status
mbed_official 340:28d1f895c6fe 571 */
mbed_official 340:28d1f895c6fe 572 static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage)
mbed_official 340:28d1f895c6fe 573 {
mbed_official 340:28d1f895c6fe 574 HAL_StatusTypeDef status = HAL_OK;
mbed_official 441:d2c15dda23c1 575 #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) || defined(STM32F070x6) || \
mbed_official 340:28d1f895c6fe 576 defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 577 uint16_t WRP0_Data = 0xFFFF;
mbed_official 340:28d1f895c6fe 578 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 579 uint16_t WRP1_Data = 0xFFFF;
mbed_official 340:28d1f895c6fe 580 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx */
mbed_official 441:d2c15dda23c1 581 #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */
mbed_official 340:28d1f895c6fe 582
mbed_official 441:d2c15dda23c1 583 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 584 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 585 uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
mbed_official 441:d2c15dda23c1 586 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F070xB || STM32F030xC */
mbed_official 340:28d1f895c6fe 587
mbed_official 340:28d1f895c6fe 588 /* Check the parameters */
mbed_official 340:28d1f895c6fe 589 assert_param(IS_OB_WRP(WriteProtectPage));
mbed_official 340:28d1f895c6fe 590
mbed_official 441:d2c15dda23c1 591 #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) || STM32F070x6 || \
mbed_official 340:28d1f895c6fe 592 defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 593 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK);
mbed_official 340:28d1f895c6fe 594 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx)
mbed_official 340:28d1f895c6fe 595 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8);
mbed_official 340:28d1f895c6fe 596 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx */
mbed_official 441:d2c15dda23c1 597 #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */
mbed_official 340:28d1f895c6fe 598
mbed_official 441:d2c15dda23c1 599 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 600 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 601 WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK);
mbed_official 340:28d1f895c6fe 602 WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8);
mbed_official 340:28d1f895c6fe 603 WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16);
mbed_official 340:28d1f895c6fe 604 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx)
mbed_official 340:28d1f895c6fe 605 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO63MASK) >> 24);
mbed_official 340:28d1f895c6fe 606 #endif /* STM32F071xB || STM32F072xB || STM32F078xx */
mbed_official 340:28d1f895c6fe 607 #if defined(STM32F091xC) || defined(STM32F098xx)
mbed_official 340:28d1f895c6fe 608 WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24);
mbed_official 340:28d1f895c6fe 609 #endif /* STM32F091xC || STM32F098xx */
mbed_official 441:d2c15dda23c1 610 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC || STM32F070xB */
mbed_official 340:28d1f895c6fe 611
mbed_official 340:28d1f895c6fe 612 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 613 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 614
mbed_official 340:28d1f895c6fe 615 if(status == HAL_OK)
mbed_official 441:d2c15dda23c1 616 {
mbed_official 441:d2c15dda23c1 617 /* Clean the error context */
mbed_official 441:d2c15dda23c1 618 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 619
mbed_official 340:28d1f895c6fe 620 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 621
mbed_official 340:28d1f895c6fe 622 if(WRP0_Data != 0xFF)
mbed_official 340:28d1f895c6fe 623 {
mbed_official 340:28d1f895c6fe 624 OB->WRP0 |= WRP0_Data;
mbed_official 340:28d1f895c6fe 625
mbed_official 340:28d1f895c6fe 626 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 627 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 628 }
mbed_official 340:28d1f895c6fe 629
mbed_official 340:28d1f895c6fe 630 #if defined(STM32F030x8) || defined(STM32F051x8) || defined(STM32F058xx) || \
mbed_official 441:d2c15dda23c1 631 defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 632 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 633 if((status == HAL_OK) && (WRP1_Data != 0xFF))
mbed_official 340:28d1f895c6fe 634 {
mbed_official 340:28d1f895c6fe 635 OB->WRP1 |= WRP1_Data;
mbed_official 340:28d1f895c6fe 636
mbed_official 340:28d1f895c6fe 637 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 638 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 639 }
mbed_official 441:d2c15dda23c1 640 #endif /* STM32F030x8 || STM32F051x8 || STM32F058xx || STM32F071xB || STM32F070xB ||
mbed_official 441:d2c15dda23c1 641 STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */
mbed_official 340:28d1f895c6fe 642
mbed_official 441:d2c15dda23c1 643 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) || \
mbed_official 441:d2c15dda23c1 644 defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
mbed_official 340:28d1f895c6fe 645 if((status == HAL_OK) && (WRP2_Data != 0xFF))
mbed_official 340:28d1f895c6fe 646 {
mbed_official 340:28d1f895c6fe 647 OB->WRP2 |= WRP2_Data;
mbed_official 340:28d1f895c6fe 648
mbed_official 340:28d1f895c6fe 649 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 650 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 651 }
mbed_official 340:28d1f895c6fe 652
mbed_official 340:28d1f895c6fe 653 if((status == HAL_OK) && (WRP3_Data != 0xFF))
mbed_official 340:28d1f895c6fe 654 {
mbed_official 340:28d1f895c6fe 655 OB->WRP3 |= WRP3_Data;
mbed_official 340:28d1f895c6fe 656
mbed_official 340:28d1f895c6fe 657 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 658 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 659 }
mbed_official 441:d2c15dda23c1 660 #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F070xB || STM32F030xC */
mbed_official 340:28d1f895c6fe 661
mbed_official 340:28d1f895c6fe 662 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 663 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 441:d2c15dda23c1 664 }
mbed_official 340:28d1f895c6fe 665 return status;
mbed_official 340:28d1f895c6fe 666 }
mbed_official 340:28d1f895c6fe 667
mbed_official 340:28d1f895c6fe 668 /**
mbed_official 340:28d1f895c6fe 669 * @brief Set the read protection level.
mbed_official 340:28d1f895c6fe 670 * @param ReadProtectLevel: specifies the read protection level.
mbed_official 340:28d1f895c6fe 671 * This parameter can be one of the following values:
mbed_official 340:28d1f895c6fe 672 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 340:28d1f895c6fe 673 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 340:28d1f895c6fe 674 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 340:28d1f895c6fe 675 *
mbed_official 340:28d1f895c6fe 676 * @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 677 *
mbed_official 340:28d1f895c6fe 678 * @retval HAL status
mbed_official 340:28d1f895c6fe 679 */
mbed_official 340:28d1f895c6fe 680 static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel)
mbed_official 340:28d1f895c6fe 681 {
mbed_official 340:28d1f895c6fe 682 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 683
mbed_official 340:28d1f895c6fe 684 /* Check the parameters */
mbed_official 340:28d1f895c6fe 685 assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel));
mbed_official 340:28d1f895c6fe 686
mbed_official 340:28d1f895c6fe 687 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 688 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 689
mbed_official 340:28d1f895c6fe 690 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 691 {
mbed_official 441:d2c15dda23c1 692 /* Clean the error context */
mbed_official 441:d2c15dda23c1 693 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 694
mbed_official 340:28d1f895c6fe 695 /* Enable the Option Bytes Programming operation */
mbed_official 340:28d1f895c6fe 696 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 697
mbed_official 340:28d1f895c6fe 698 WRITE_REG(OB->RDP, ReadProtectLevel);
mbed_official 340:28d1f895c6fe 699
mbed_official 340:28d1f895c6fe 700 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 701 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 702
mbed_official 340:28d1f895c6fe 703 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 704 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 705 }
mbed_official 340:28d1f895c6fe 706
mbed_official 340:28d1f895c6fe 707 return status;
mbed_official 340:28d1f895c6fe 708 }
mbed_official 340:28d1f895c6fe 709
mbed_official 340:28d1f895c6fe 710 /**
mbed_official 340:28d1f895c6fe 711 * @brief Program the FLASH User Option Byte.
mbed_official 340:28d1f895c6fe 712 * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 340:28d1f895c6fe 713 * @param UserConfig: The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), BOOT1(Bit4),
mbed_official 340:28d1f895c6fe 714 * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6).
mbed_official 340:28d1f895c6fe 715 * @retval HAL status
mbed_official 340:28d1f895c6fe 716 */
mbed_official 340:28d1f895c6fe 717 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig)
mbed_official 340:28d1f895c6fe 718 {
mbed_official 340:28d1f895c6fe 719 HAL_StatusTypeDef status = HAL_OK;
mbed_official 340:28d1f895c6fe 720
mbed_official 340:28d1f895c6fe 721 /* Check the parameters */
mbed_official 340:28d1f895c6fe 722 assert_param(IS_OB_WDG_SOURCE((UserConfig&OB_WDG_SW)));
mbed_official 340:28d1f895c6fe 723 assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST)));
mbed_official 340:28d1f895c6fe 724 assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST)));
mbed_official 340:28d1f895c6fe 725 assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET)));
mbed_official 340:28d1f895c6fe 726 assert_param(IS_OB_VDDA_ANALOG((UserConfig&OB_VDDA_ANALOG_ON)));
mbed_official 340:28d1f895c6fe 727 assert_param(IS_OB_SRAM_PARITY((UserConfig&OB_RAM_PARITY_CHECK_RESET)));
mbed_official 441:d2c15dda23c1 728 #if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)|| defined(STM32F070x6)
mbed_official 340:28d1f895c6fe 729 assert_param(IS_OB_BOOT_SEL((UserConfig&OB_BOOT_SEL_SET)));
mbed_official 340:28d1f895c6fe 730 assert_param(IS_OB_BOOT0((UserConfig&OB_BOOT0_SET)));
mbed_official 441:d2c15dda23c1 731 #endif /* STM32F042x6 || STM32F048xx || STM32F091xC || STM32F098xx || STM32F030xC || STM32F070x6 */
mbed_official 340:28d1f895c6fe 732
mbed_official 340:28d1f895c6fe 733 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 734 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 735
mbed_official 340:28d1f895c6fe 736 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 737 {
mbed_official 441:d2c15dda23c1 738 /* Clean the error context */
mbed_official 441:d2c15dda23c1 739 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 740
mbed_official 340:28d1f895c6fe 741 /* Enable the Option Bytes Programming operation */
mbed_official 340:28d1f895c6fe 742 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 743
mbed_official 441:d2c15dda23c1 744 #if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)|| defined(STM32F070x6)
mbed_official 340:28d1f895c6fe 745 OB->USER = UserConfig;
mbed_official 340:28d1f895c6fe 746 #else
mbed_official 340:28d1f895c6fe 747 OB->USER = (UserConfig | 0x88);
mbed_official 441:d2c15dda23c1 748 #endif /* STM32F042x6 || STM32F048xx || STM32F091xC || STM32F098xx || STM32F030xC || STM32F070x6 */
mbed_official 340:28d1f895c6fe 749
mbed_official 340:28d1f895c6fe 750 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 751 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 752
mbed_official 340:28d1f895c6fe 753 /* if the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 754 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 755 }
mbed_official 340:28d1f895c6fe 756
mbed_official 340:28d1f895c6fe 757 return status;
mbed_official 340:28d1f895c6fe 758 }
mbed_official 340:28d1f895c6fe 759
mbed_official 340:28d1f895c6fe 760 /**
mbed_official 340:28d1f895c6fe 761 * @brief Programs a half word at a specified Option Byte Data address.
mbed_official 340:28d1f895c6fe 762 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
mbed_official 340:28d1f895c6fe 763 * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
mbed_official 340:28d1f895c6fe 764 * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
mbed_official 340:28d1f895c6fe 765 * (system reset will occur)
mbed_official 340:28d1f895c6fe 766 * Programming of the OB should be performed only after an erase (otherwise PGERR occurs)
mbed_official 340:28d1f895c6fe 767 * @param Address: specifies the address to be programmed.
mbed_official 340:28d1f895c6fe 768 * This parameter can be 0x1FFFF804 or 0x1FFFF806.
mbed_official 340:28d1f895c6fe 769 * @param Data: specifies the data to be programmed.
mbed_official 340:28d1f895c6fe 770 * @retval HAL status
mbed_official 340:28d1f895c6fe 771 */
mbed_official 340:28d1f895c6fe 772 static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data)
mbed_official 340:28d1f895c6fe 773 {
mbed_official 340:28d1f895c6fe 774 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 775
mbed_official 340:28d1f895c6fe 776 /* Check the parameters */
mbed_official 340:28d1f895c6fe 777 assert_param(IS_OB_DATA_ADDRESS(Address));
mbed_official 340:28d1f895c6fe 778
mbed_official 340:28d1f895c6fe 779 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 780 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 781
mbed_official 340:28d1f895c6fe 782 if(status == HAL_OK)
mbed_official 340:28d1f895c6fe 783 {
mbed_official 441:d2c15dda23c1 784 /* Clean the error context */
mbed_official 441:d2c15dda23c1 785 pFlash.ErrorCode = FLASH_ERROR_NONE;
mbed_official 441:d2c15dda23c1 786
mbed_official 340:28d1f895c6fe 787 /* Enables the Option Bytes Programming operation */
mbed_official 340:28d1f895c6fe 788 SET_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 789 *(__IO uint16_t*)Address = Data;
mbed_official 340:28d1f895c6fe 790
mbed_official 340:28d1f895c6fe 791 /* Wait for last operation to be completed */
mbed_official 340:28d1f895c6fe 792 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
mbed_official 340:28d1f895c6fe 793
mbed_official 340:28d1f895c6fe 794 /* If the program operation is completed, disable the OPTPG Bit */
mbed_official 340:28d1f895c6fe 795 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG);
mbed_official 340:28d1f895c6fe 796 }
mbed_official 340:28d1f895c6fe 797 /* Return the Option Byte Data Program Status */
mbed_official 340:28d1f895c6fe 798 return status;
mbed_official 340:28d1f895c6fe 799 }
mbed_official 340:28d1f895c6fe 800
mbed_official 340:28d1f895c6fe 801 /**
mbed_official 340:28d1f895c6fe 802 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 340:28d1f895c6fe 803 * @retval The FLASH Write Protection Option Bytes value
mbed_official 340:28d1f895c6fe 804 */
mbed_official 340:28d1f895c6fe 805 static uint32_t FLASH_OB_GetWRP(void)
mbed_official 340:28d1f895c6fe 806 {
mbed_official 340:28d1f895c6fe 807 /* Return the FLASH write protection Register value */
mbed_official 340:28d1f895c6fe 808 return (uint32_t)(READ_REG(FLASH->WRPR));
mbed_official 340:28d1f895c6fe 809 }
mbed_official 340:28d1f895c6fe 810
mbed_official 340:28d1f895c6fe 811 /**
mbed_official 340:28d1f895c6fe 812 * @brief Returns the FLASH Read Protection level.
mbed_official 340:28d1f895c6fe 813 * @retval FLASH ReadOut Protection Status:
mbed_official 340:28d1f895c6fe 814 * - SET, when OB_RDP_Level_1 or OB_RDP_Level_2 is set
mbed_official 340:28d1f895c6fe 815 * - RESET, when OB_RDP_Level_0 is set
mbed_official 340:28d1f895c6fe 816 */
mbed_official 340:28d1f895c6fe 817 static FlagStatus FLASH_OB_GetRDP(void)
mbed_official 340:28d1f895c6fe 818 {
mbed_official 340:28d1f895c6fe 819 FlagStatus readstatus = RESET;
mbed_official 340:28d1f895c6fe 820
mbed_official 340:28d1f895c6fe 821 if ((uint8_t)READ_BIT(FLASH->OBR, FLASH_OBR_RDPRT1) != RESET)
mbed_official 340:28d1f895c6fe 822 {
mbed_official 340:28d1f895c6fe 823 readstatus = SET;
mbed_official 340:28d1f895c6fe 824 }
mbed_official 340:28d1f895c6fe 825
mbed_official 340:28d1f895c6fe 826 return readstatus;
mbed_official 340:28d1f895c6fe 827 }
mbed_official 340:28d1f895c6fe 828
mbed_official 340:28d1f895c6fe 829 /**
mbed_official 340:28d1f895c6fe 830 * @brief Return the FLASH User Option Byte value.
mbed_official 340:28d1f895c6fe 831 * @retval The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), BOOT1(Bit4),
mbed_official 340:28d1f895c6fe 832 * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6).
mbed_official 340:28d1f895c6fe 833 */
mbed_official 340:28d1f895c6fe 834 static uint8_t FLASH_OB_GetUser(void)
mbed_official 340:28d1f895c6fe 835 {
mbed_official 340:28d1f895c6fe 836 /* Return the User Option Byte */
mbed_official 340:28d1f895c6fe 837 return (uint8_t)(READ_REG(FLASH->OBR) >> 8);
mbed_official 340:28d1f895c6fe 838 }
mbed_official 340:28d1f895c6fe 839
mbed_official 340:28d1f895c6fe 840 /**
mbed_official 340:28d1f895c6fe 841 * @}
mbed_official 340:28d1f895c6fe 842 */
mbed_official 340:28d1f895c6fe 843
mbed_official 340:28d1f895c6fe 844 #endif /* HAL_FLASH_MODULE_ENABLED */
mbed_official 340:28d1f895c6fe 845
mbed_official 340:28d1f895c6fe 846 /**
mbed_official 340:28d1f895c6fe 847 * @}
mbed_official 340:28d1f895c6fe 848 */
mbed_official 340:28d1f895c6fe 849
mbed_official 340:28d1f895c6fe 850 /**
mbed_official 340:28d1f895c6fe 851 * @}
mbed_official 340:28d1f895c6fe 852 */
mbed_official 340:28d1f895c6fe 853
mbed_official 340:28d1f895c6fe 854 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/