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:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 610:813dcc80987e 1 /**
mbed_official 610:813dcc80987e 2 ******************************************************************************
mbed_official 610:813dcc80987e 3 * @file stm32l4xx_hal_flash_ex.c
mbed_official 610:813dcc80987e 4 * @author MCD Application Team
mbed_official 610:813dcc80987e 5 * @version V1.0.0
mbed_official 610:813dcc80987e 6 * @date 26-June-2015
mbed_official 610:813dcc80987e 7 * @brief Extended FLASH HAL module driver.
mbed_official 610:813dcc80987e 8 * This file provides firmware functions to manage the following
mbed_official 610:813dcc80987e 9 * functionalities of the FLASH extended peripheral:
mbed_official 610:813dcc80987e 10 * + Extended programming operations functions
mbed_official 610:813dcc80987e 11 *
mbed_official 610:813dcc80987e 12 @verbatim
mbed_official 610:813dcc80987e 13 ==============================================================================
mbed_official 610:813dcc80987e 14 ##### Flash Extended features #####
mbed_official 610:813dcc80987e 15 ==============================================================================
mbed_official 610:813dcc80987e 16
mbed_official 610:813dcc80987e 17 [..] Comparing to other previous devices, the FLASH interface for STM32L4xx
mbed_official 610:813dcc80987e 18 devices contains the following additional features
mbed_official 610:813dcc80987e 19
mbed_official 610:813dcc80987e 20 (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write
mbed_official 610:813dcc80987e 21 capability (RWW)
mbed_official 610:813dcc80987e 22 (+) Dual bank memory organization
mbed_official 610:813dcc80987e 23 (+) PCROP protection for all banks
mbed_official 610:813dcc80987e 24
mbed_official 610:813dcc80987e 25 ##### How to use this driver #####
mbed_official 610:813dcc80987e 26 ==============================================================================
mbed_official 610:813dcc80987e 27 [..] This driver provides functions to configure and program the FLASH memory
mbed_official 610:813dcc80987e 28 of all STM32L4xx devices. It includes
mbed_official 610:813dcc80987e 29 (#) Flash Memory Erase functions:
mbed_official 610:813dcc80987e 30 (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and
mbed_official 610:813dcc80987e 31 HAL_FLASH_Lock() functions
mbed_official 610:813dcc80987e 32 (++) Erase function: Erase page, erase all sectors
mbed_official 610:813dcc80987e 33 (++) There are two modes of erase :
mbed_official 610:813dcc80987e 34 (+++) Polling Mode using HAL_FLASHEx_Erase()
mbed_official 610:813dcc80987e 35 (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()
mbed_official 610:813dcc80987e 36
mbed_official 610:813dcc80987e 37 (#) Option Bytes Programming function: Use HAL_FLASHEx_OBProgram() to :
mbed_official 610:813dcc80987e 38 (++) Set/Reset the write protection
mbed_official 610:813dcc80987e 39 (++) Set the Read protection Level
mbed_official 610:813dcc80987e 40 (++) Program the user Option Bytes
mbed_official 610:813dcc80987e 41 (++) Configure the PCROP protection
mbed_official 610:813dcc80987e 42
mbed_official 610:813dcc80987e 43 (#) Get Option Bytes Configuration function: Use HAL_FLASHEx_OBGetConfig() to :
mbed_official 610:813dcc80987e 44 (++) Get the value of a write protection area
mbed_official 610:813dcc80987e 45 (++) Know if the read protection is activated
mbed_official 610:813dcc80987e 46 (++) Get the value of the user Option Bytes
mbed_official 610:813dcc80987e 47 (++) Get the value of a PCROP area
mbed_official 610:813dcc80987e 48
mbed_official 610:813dcc80987e 49 @endverbatim
mbed_official 610:813dcc80987e 50 ******************************************************************************
mbed_official 610:813dcc80987e 51 * @attention
mbed_official 610:813dcc80987e 52 *
mbed_official 610:813dcc80987e 53 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 610:813dcc80987e 54 *
mbed_official 610:813dcc80987e 55 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 610:813dcc80987e 56 * are permitted provided that the following conditions are met:
mbed_official 610:813dcc80987e 57 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 610:813dcc80987e 58 * this list of conditions and the following disclaimer.
mbed_official 610:813dcc80987e 59 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 610:813dcc80987e 60 * this list of conditions and the following disclaimer in the documentation
mbed_official 610:813dcc80987e 61 * and/or other materials provided with the distribution.
mbed_official 610:813dcc80987e 62 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 610:813dcc80987e 63 * may be used to endorse or promote products derived from this software
mbed_official 610:813dcc80987e 64 * without specific prior written permission.
mbed_official 610:813dcc80987e 65 *
mbed_official 610:813dcc80987e 66 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 610:813dcc80987e 67 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 610:813dcc80987e 68 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 610:813dcc80987e 69 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 610:813dcc80987e 70 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 610:813dcc80987e 71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 610:813dcc80987e 72 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 610:813dcc80987e 73 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 610:813dcc80987e 74 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 610:813dcc80987e 75 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 610:813dcc80987e 76 *
mbed_official 610:813dcc80987e 77 ******************************************************************************
mbed_official 610:813dcc80987e 78 */
mbed_official 610:813dcc80987e 79
mbed_official 610:813dcc80987e 80 /* Includes ------------------------------------------------------------------*/
mbed_official 610:813dcc80987e 81 #include "stm32l4xx_hal.h"
mbed_official 610:813dcc80987e 82
mbed_official 610:813dcc80987e 83 /** @addtogroup STM32L4xx_HAL_Driver
mbed_official 610:813dcc80987e 84 * @{
mbed_official 610:813dcc80987e 85 */
mbed_official 610:813dcc80987e 86
mbed_official 610:813dcc80987e 87 /** @defgroup FLASHEx FLASHEx
mbed_official 610:813dcc80987e 88 * @brief FALSH Extended HAL module driver
mbed_official 610:813dcc80987e 89 * @{
mbed_official 610:813dcc80987e 90 */
mbed_official 610:813dcc80987e 91
mbed_official 610:813dcc80987e 92 #ifdef HAL_FLASH_MODULE_ENABLED
mbed_official 610:813dcc80987e 93
mbed_official 610:813dcc80987e 94 /* Private typedef -----------------------------------------------------------*/
mbed_official 610:813dcc80987e 95 /* Private define ------------------------------------------------------------*/
mbed_official 610:813dcc80987e 96 /* Private macro -------------------------------------------------------------*/
mbed_official 610:813dcc80987e 97 /* Private variables ---------------------------------------------------------*/
mbed_official 610:813dcc80987e 98 /** @defgroup FLASHEx_Private_Variables FLASHEx Private Variables
mbed_official 610:813dcc80987e 99 * @{
mbed_official 610:813dcc80987e 100 */
mbed_official 610:813dcc80987e 101 extern FLASH_ProcessTypeDef pFlash;
mbed_official 610:813dcc80987e 102 /**
mbed_official 610:813dcc80987e 103 * @}
mbed_official 610:813dcc80987e 104 */
mbed_official 610:813dcc80987e 105
mbed_official 610:813dcc80987e 106 /* Private function prototypes -----------------------------------------------*/
mbed_official 610:813dcc80987e 107 /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
mbed_official 610:813dcc80987e 108 * @{
mbed_official 610:813dcc80987e 109 */
mbed_official 610:813dcc80987e 110 extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
mbed_official 610:813dcc80987e 111 void FLASH_PageErase(uint32_t Page, uint32_t Banks);
mbed_official 610:813dcc80987e 112 static void FLASH_MassErase(uint32_t Banks);
mbed_official 610:813dcc80987e 113 void FLASH_FlushCaches(void);
mbed_official 610:813dcc80987e 114 static HAL_StatusTypeDef FLASH_OB_WRPConfig(uint32_t WRPArea, uint32_t WRPStartOffset, uint32_t WRDPEndOffset);
mbed_official 610:813dcc80987e 115 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint32_t RDPLevel);
mbed_official 610:813dcc80987e 116 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig);
mbed_official 610:813dcc80987e 117 static HAL_StatusTypeDef FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr);
mbed_official 610:813dcc80987e 118 static void FLASH_OB_GetWRP(uint32_t WRPArea, uint32_t * WRPStartOffset, uint32_t * WRDPEndOffset);
mbed_official 610:813dcc80987e 119 static uint32_t FLASH_OB_GetRDP(void);
mbed_official 610:813dcc80987e 120 static uint32_t FLASH_OB_GetUser(void);
mbed_official 610:813dcc80987e 121 static void FLASH_OB_GetPCROP(uint32_t * PCROPConfig, uint32_t * PCROPStartAddr, uint32_t * PCROPEndAddr);
mbed_official 610:813dcc80987e 122 /**
mbed_official 610:813dcc80987e 123 * @}
mbed_official 610:813dcc80987e 124 */
mbed_official 610:813dcc80987e 125
mbed_official 610:813dcc80987e 126 /* Exported functions -------------------------------------------------------*/
mbed_official 610:813dcc80987e 127 /** @defgroup FLASHEx_Exported_Functions FLASH Extended Exported Functions
mbed_official 610:813dcc80987e 128 * @{
mbed_official 610:813dcc80987e 129 */
mbed_official 610:813dcc80987e 130
mbed_official 610:813dcc80987e 131 /** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions
mbed_official 610:813dcc80987e 132 * @brief Extended IO operation functions
mbed_official 610:813dcc80987e 133 *
mbed_official 610:813dcc80987e 134 @verbatim
mbed_official 610:813dcc80987e 135 ===============================================================================
mbed_official 610:813dcc80987e 136 ##### Extended programming operation functions #####
mbed_official 610:813dcc80987e 137 ===============================================================================
mbed_official 610:813dcc80987e 138 [..]
mbed_official 610:813dcc80987e 139 This subsection provides a set of functions allowing to manage the Extended FLASH
mbed_official 610:813dcc80987e 140 programming operations Operations.
mbed_official 610:813dcc80987e 141
mbed_official 610:813dcc80987e 142 @endverbatim
mbed_official 610:813dcc80987e 143 * @{
mbed_official 610:813dcc80987e 144 */
mbed_official 610:813dcc80987e 145 /**
mbed_official 610:813dcc80987e 146 * @brief Perform a mass erase or erase the specified FLASH memory pages.
mbed_official 610:813dcc80987e 147 * @param[in] pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 610:813dcc80987e 148 * contains the configuration information for the erasing.
mbed_official 610:813dcc80987e 149 *
mbed_official 610:813dcc80987e 150 * @param[out] PageError : pointer to variable that contains the configuration
mbed_official 610:813dcc80987e 151 * information on faulty page in case of error (0xFFFFFFFF means that all
mbed_official 610:813dcc80987e 152 * the pages have been correctly erased)
mbed_official 610:813dcc80987e 153 *
mbed_official 610:813dcc80987e 154 * @retval HAL Status
mbed_official 610:813dcc80987e 155 */
mbed_official 610:813dcc80987e 156 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
mbed_official 610:813dcc80987e 157 {
mbed_official 610:813dcc80987e 158 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 610:813dcc80987e 159 uint32_t page_index = 0;
mbed_official 610:813dcc80987e 160
mbed_official 610:813dcc80987e 161 /* Process Locked */
mbed_official 610:813dcc80987e 162 __HAL_LOCK(&pFlash);
mbed_official 610:813dcc80987e 163
mbed_official 610:813dcc80987e 164 /* Check the parameters */
mbed_official 610:813dcc80987e 165 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 610:813dcc80987e 166
mbed_official 610:813dcc80987e 167 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 168 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 169
mbed_official 610:813dcc80987e 170 if (status == HAL_OK)
mbed_official 610:813dcc80987e 171 {
mbed_official 610:813dcc80987e 172 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 610:813dcc80987e 173
mbed_official 610:813dcc80987e 174 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 610:813dcc80987e 175 {
mbed_official 610:813dcc80987e 176 /* Mass erase to be done */
mbed_official 610:813dcc80987e 177 FLASH_MassErase(pEraseInit->Banks);
mbed_official 610:813dcc80987e 178
mbed_official 610:813dcc80987e 179 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 180 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 181
mbed_official 610:813dcc80987e 182 /* If the erase operation is completed, disable the MER1 and MER2 Bits */
mbed_official 610:813dcc80987e 183 CLEAR_BIT(FLASH->CR, (FLASH_CR_MER1 | FLASH_CR_MER2));
mbed_official 610:813dcc80987e 184 }
mbed_official 610:813dcc80987e 185 else
mbed_official 610:813dcc80987e 186 {
mbed_official 610:813dcc80987e 187 /*Initialization of PageError variable*/
mbed_official 610:813dcc80987e 188 *PageError = 0xFFFFFFFF;
mbed_official 610:813dcc80987e 189
mbed_official 610:813dcc80987e 190 for(page_index = pEraseInit->Page; page_index < (pEraseInit->Page + pEraseInit->NbPages); page_index++)
mbed_official 610:813dcc80987e 191 {
mbed_official 610:813dcc80987e 192 FLASH_PageErase(page_index, pEraseInit->Banks);
mbed_official 610:813dcc80987e 193
mbed_official 610:813dcc80987e 194 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 195 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 196
mbed_official 610:813dcc80987e 197 /* If the erase operation is completed, disable the PER Bit */
mbed_official 610:813dcc80987e 198 CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
mbed_official 610:813dcc80987e 199
mbed_official 610:813dcc80987e 200 if (status != HAL_OK)
mbed_official 610:813dcc80987e 201 {
mbed_official 610:813dcc80987e 202 /* In case of error, stop erase procedure and return the faulty address */
mbed_official 610:813dcc80987e 203 *PageError = page_index;
mbed_official 610:813dcc80987e 204 break;
mbed_official 610:813dcc80987e 205 }
mbed_official 610:813dcc80987e 206 }
mbed_official 610:813dcc80987e 207 }
mbed_official 610:813dcc80987e 208
mbed_official 610:813dcc80987e 209 /* Flush the caches to be sure of the data consistency */
mbed_official 610:813dcc80987e 210 FLASH_FlushCaches();
mbed_official 610:813dcc80987e 211 }
mbed_official 610:813dcc80987e 212
mbed_official 610:813dcc80987e 213 /* Process Unlocked */
mbed_official 610:813dcc80987e 214 __HAL_UNLOCK(&pFlash);
mbed_official 610:813dcc80987e 215
mbed_official 610:813dcc80987e 216 return status;
mbed_official 610:813dcc80987e 217 }
mbed_official 610:813dcc80987e 218
mbed_official 610:813dcc80987e 219 /**
mbed_official 610:813dcc80987e 220 * @brief Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled.
mbed_official 610:813dcc80987e 221 * @param pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that
mbed_official 610:813dcc80987e 222 * contains the configuration information for the erasing.
mbed_official 610:813dcc80987e 223 *
mbed_official 610:813dcc80987e 224 * @retval HAL Status
mbed_official 610:813dcc80987e 225 */
mbed_official 610:813dcc80987e 226 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
mbed_official 610:813dcc80987e 227 {
mbed_official 610:813dcc80987e 228 HAL_StatusTypeDef status = HAL_OK;
mbed_official 610:813dcc80987e 229
mbed_official 610:813dcc80987e 230 /* Process Locked */
mbed_official 610:813dcc80987e 231 __HAL_LOCK(&pFlash);
mbed_official 610:813dcc80987e 232
mbed_official 610:813dcc80987e 233 /* Check the parameters */
mbed_official 610:813dcc80987e 234 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
mbed_official 610:813dcc80987e 235
mbed_official 610:813dcc80987e 236 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 610:813dcc80987e 237
mbed_official 610:813dcc80987e 238 /* Enable End of Operation and Error interrupts */
mbed_official 610:813dcc80987e 239 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_OPERR);
mbed_official 610:813dcc80987e 240
mbed_official 610:813dcc80987e 241 pFlash.Bank = pEraseInit->Banks;
mbed_official 610:813dcc80987e 242
mbed_official 610:813dcc80987e 243 if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
mbed_official 610:813dcc80987e 244 {
mbed_official 610:813dcc80987e 245 /* Mass erase to be done */
mbed_official 610:813dcc80987e 246 pFlash.ProcedureOnGoing = FLASH_PROC_MASS_ERASE;
mbed_official 610:813dcc80987e 247 FLASH_MassErase(pEraseInit->Banks);
mbed_official 610:813dcc80987e 248 }
mbed_official 610:813dcc80987e 249 else
mbed_official 610:813dcc80987e 250 {
mbed_official 610:813dcc80987e 251 /* Erase by page to be done */
mbed_official 610:813dcc80987e 252 pFlash.ProcedureOnGoing = FLASH_PROC_PAGE_ERASE;
mbed_official 610:813dcc80987e 253 pFlash.NbPagesToErase = pEraseInit->NbPages;
mbed_official 610:813dcc80987e 254 pFlash.Page = pEraseInit->Page;
mbed_official 610:813dcc80987e 255
mbed_official 610:813dcc80987e 256 /*Erase 1st page and wait for IT */
mbed_official 610:813dcc80987e 257 FLASH_PageErase(pEraseInit->Page, pEraseInit->Banks);
mbed_official 610:813dcc80987e 258 }
mbed_official 610:813dcc80987e 259
mbed_official 610:813dcc80987e 260 return status;
mbed_official 610:813dcc80987e 261 }
mbed_official 610:813dcc80987e 262
mbed_official 610:813dcc80987e 263 /**
mbed_official 610:813dcc80987e 264 * @brief Program Option bytes.
mbed_official 610:813dcc80987e 265 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that
mbed_official 610:813dcc80987e 266 * contains the configuration information for the programming.
mbed_official 610:813dcc80987e 267 *
mbed_official 610:813dcc80987e 268 * @retval HAL Status
mbed_official 610:813dcc80987e 269 */
mbed_official 610:813dcc80987e 270 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 610:813dcc80987e 271 {
mbed_official 610:813dcc80987e 272 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 610:813dcc80987e 273
mbed_official 610:813dcc80987e 274 /* Process Locked */
mbed_official 610:813dcc80987e 275 __HAL_LOCK(&pFlash);
mbed_official 610:813dcc80987e 276
mbed_official 610:813dcc80987e 277 /* Check the parameters */
mbed_official 610:813dcc80987e 278 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
mbed_official 610:813dcc80987e 279
mbed_official 610:813dcc80987e 280 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
mbed_official 610:813dcc80987e 281
mbed_official 610:813dcc80987e 282 /* Write protection configuration */
mbed_official 610:813dcc80987e 283 if((pOBInit->OptionType & OPTIONBYTE_WRP) != RESET)
mbed_official 610:813dcc80987e 284 {
mbed_official 610:813dcc80987e 285 /* Configure of Write protection on the selected area */
mbed_official 610:813dcc80987e 286 status = FLASH_OB_WRPConfig(pOBInit->WRPArea, pOBInit->WRPStartOffset, pOBInit->WRPEndOffset);
mbed_official 610:813dcc80987e 287 }
mbed_official 610:813dcc80987e 288
mbed_official 610:813dcc80987e 289 /* Read protection configuration */
mbed_official 610:813dcc80987e 290 if((pOBInit->OptionType & OPTIONBYTE_RDP) != RESET)
mbed_official 610:813dcc80987e 291 {
mbed_official 610:813dcc80987e 292 /* Configure the Read protection level */
mbed_official 610:813dcc80987e 293 status = FLASH_OB_RDPConfig(pOBInit->RDPLevel);
mbed_official 610:813dcc80987e 294 }
mbed_official 610:813dcc80987e 295
mbed_official 610:813dcc80987e 296 /* User Configuration */
mbed_official 610:813dcc80987e 297 if((pOBInit->OptionType & OPTIONBYTE_USER) != RESET)
mbed_official 610:813dcc80987e 298 {
mbed_official 610:813dcc80987e 299 /* Configure the user option bytes */
mbed_official 610:813dcc80987e 300 status = FLASH_OB_UserConfig(pOBInit->USERType, pOBInit->USERConfig);
mbed_official 610:813dcc80987e 301 }
mbed_official 610:813dcc80987e 302
mbed_official 610:813dcc80987e 303 /* PCROP Configuration */
mbed_official 610:813dcc80987e 304 if((pOBInit->OptionType & OPTIONBYTE_PCROP) != RESET)
mbed_official 610:813dcc80987e 305 {
mbed_official 610:813dcc80987e 306 /* Configure the Proprietary code readout protection */
mbed_official 610:813dcc80987e 307 status = FLASH_OB_PCROPConfig(pOBInit->PCROPConfig, pOBInit->PCROPStartAddr, pOBInit->PCROPEndAddr);
mbed_official 610:813dcc80987e 308 }
mbed_official 610:813dcc80987e 309
mbed_official 610:813dcc80987e 310 /* Process Unlocked */
mbed_official 610:813dcc80987e 311 __HAL_UNLOCK(&pFlash);
mbed_official 610:813dcc80987e 312
mbed_official 610:813dcc80987e 313 return status;
mbed_official 610:813dcc80987e 314 }
mbed_official 610:813dcc80987e 315
mbed_official 610:813dcc80987e 316 /**
mbed_official 610:813dcc80987e 317 * @brief Get the Option bytes configuration.
mbed_official 610:813dcc80987e 318 * @param pOBInit: pointer to an FLASH_OBInitStruct structure that contains the
mbed_official 610:813dcc80987e 319 * configuration information. The fields pOBInit->WRPArea and
mbed_official 610:813dcc80987e 320 * pOBInit->PCROPConfig should indicate which area is requested
mbed_official 610:813dcc80987e 321 * for the WRP and PCROP
mbed_official 610:813dcc80987e 322 *
mbed_official 610:813dcc80987e 323 * @retval None
mbed_official 610:813dcc80987e 324 */
mbed_official 610:813dcc80987e 325 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
mbed_official 610:813dcc80987e 326 {
mbed_official 610:813dcc80987e 327 pOBInit->OptionType = (OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_PCROP);
mbed_official 610:813dcc80987e 328
mbed_official 610:813dcc80987e 329 /* Get write protection on the selected area */
mbed_official 610:813dcc80987e 330 FLASH_OB_GetWRP(pOBInit->WRPArea, &(pOBInit->WRPStartOffset), &(pOBInit->WRPEndOffset));
mbed_official 610:813dcc80987e 331
mbed_official 610:813dcc80987e 332 /* Get Read protection level */
mbed_official 610:813dcc80987e 333 pOBInit->RDPLevel = FLASH_OB_GetRDP();
mbed_official 610:813dcc80987e 334
mbed_official 610:813dcc80987e 335 /* Get the user option bytes */
mbed_official 610:813dcc80987e 336 pOBInit->USERConfig = FLASH_OB_GetUser();
mbed_official 610:813dcc80987e 337
mbed_official 610:813dcc80987e 338 /* Get the Proprietary code readout protection */
mbed_official 610:813dcc80987e 339 FLASH_OB_GetPCROP(&(pOBInit->PCROPConfig), &(pOBInit->PCROPStartAddr), &(pOBInit->PCROPEndAddr));
mbed_official 610:813dcc80987e 340
mbed_official 610:813dcc80987e 341 }
mbed_official 610:813dcc80987e 342
mbed_official 610:813dcc80987e 343 /**
mbed_official 610:813dcc80987e 344 * @}
mbed_official 610:813dcc80987e 345 */
mbed_official 610:813dcc80987e 346
mbed_official 610:813dcc80987e 347 /**
mbed_official 610:813dcc80987e 348 * @}
mbed_official 610:813dcc80987e 349 */
mbed_official 610:813dcc80987e 350
mbed_official 610:813dcc80987e 351 /* Private functions ---------------------------------------------------------*/
mbed_official 610:813dcc80987e 352
mbed_official 610:813dcc80987e 353 /** @addtogroup FLASHEx_Private_Functions
mbed_official 610:813dcc80987e 354 * @{
mbed_official 610:813dcc80987e 355 */
mbed_official 610:813dcc80987e 356 /**
mbed_official 610:813dcc80987e 357 * @brief Mass erase of FLASH memory.
mbed_official 610:813dcc80987e 358 * @param Banks: Banks to be erased
mbed_official 610:813dcc80987e 359 * This parameter can be one of the following values:
mbed_official 610:813dcc80987e 360 * @arg FLASH_BANK_1: Bank1 to be erased
mbed_official 610:813dcc80987e 361 * @arg FLASH_BANK_2: Bank2 to be erased
mbed_official 610:813dcc80987e 362 * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased
mbed_official 610:813dcc80987e 363 * @retval None
mbed_official 610:813dcc80987e 364 */
mbed_official 610:813dcc80987e 365 static void FLASH_MassErase(uint32_t Banks)
mbed_official 610:813dcc80987e 366 {
mbed_official 610:813dcc80987e 367 /* Check the parameters */
mbed_official 610:813dcc80987e 368 assert_param(IS_FLASH_BANK(Banks));
mbed_official 610:813dcc80987e 369
mbed_official 610:813dcc80987e 370 /* Set the Mass Erase Bit for the bank 1 if requested */
mbed_official 610:813dcc80987e 371 if((Banks & FLASH_BANK_1) != RESET)
mbed_official 610:813dcc80987e 372 {
mbed_official 610:813dcc80987e 373 SET_BIT(FLASH->CR, FLASH_CR_MER1);
mbed_official 610:813dcc80987e 374 }
mbed_official 610:813dcc80987e 375
mbed_official 610:813dcc80987e 376 /* Set the Mass Erase Bit for the bank 2 if requested */
mbed_official 610:813dcc80987e 377 if((Banks & FLASH_BANK_2) != RESET)
mbed_official 610:813dcc80987e 378 {
mbed_official 610:813dcc80987e 379 SET_BIT(FLASH->CR, FLASH_CR_MER2);
mbed_official 610:813dcc80987e 380 }
mbed_official 610:813dcc80987e 381
mbed_official 610:813dcc80987e 382 /* Proceed to erase all sectors */
mbed_official 610:813dcc80987e 383 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 610:813dcc80987e 384 }
mbed_official 610:813dcc80987e 385
mbed_official 610:813dcc80987e 386 /**
mbed_official 610:813dcc80987e 387 * @brief Erase the specified FLASH memory page.
mbed_official 610:813dcc80987e 388 * @param Page: FLASH page to erase
mbed_official 610:813dcc80987e 389 * This parameter must be a value between 0 and (max number of pages in the bank - 1)
mbed_official 610:813dcc80987e 390 * @param Banks: Bank(s) where the page will be erased
mbed_official 610:813dcc80987e 391 * This parameter can be one or a combination of the following values:
mbed_official 610:813dcc80987e 392 * @arg FLASH_BANK_1: Page in bank 1 to be erased
mbed_official 610:813dcc80987e 393 * @arg FLASH_BANK_2: Page in bank 2 to be erased
mbed_official 610:813dcc80987e 394 * @retval None
mbed_official 610:813dcc80987e 395 */
mbed_official 610:813dcc80987e 396 void FLASH_PageErase(uint32_t Page, uint32_t Banks)
mbed_official 610:813dcc80987e 397 {
mbed_official 610:813dcc80987e 398 /* Check the parameters */
mbed_official 610:813dcc80987e 399 assert_param(IS_FLASH_PAGE(Page));
mbed_official 610:813dcc80987e 400 assert_param(IS_FLASH_BANK_EXCLUSIVE(Banks));
mbed_official 610:813dcc80987e 401
mbed_official 610:813dcc80987e 402 if((Banks & FLASH_BANK_1) != RESET)
mbed_official 610:813dcc80987e 403 {
mbed_official 610:813dcc80987e 404 CLEAR_BIT(FLASH->CR, FLASH_CR_BKER);
mbed_official 610:813dcc80987e 405 }
mbed_official 610:813dcc80987e 406 else
mbed_official 610:813dcc80987e 407 {
mbed_official 610:813dcc80987e 408 SET_BIT(FLASH->CR, FLASH_CR_BKER);
mbed_official 610:813dcc80987e 409 }
mbed_official 610:813dcc80987e 410
mbed_official 610:813dcc80987e 411 /* Proceed to erase the page */
mbed_official 610:813dcc80987e 412 MODIFY_REG(FLASH->CR, FLASH_CR_PNB, (Page << 3));
mbed_official 610:813dcc80987e 413 SET_BIT(FLASH->CR, FLASH_CR_PER);
mbed_official 610:813dcc80987e 414 SET_BIT(FLASH->CR, FLASH_CR_STRT);
mbed_official 610:813dcc80987e 415 }
mbed_official 610:813dcc80987e 416
mbed_official 610:813dcc80987e 417 /**
mbed_official 610:813dcc80987e 418 * @brief Flush the instruction and data caches.
mbed_official 610:813dcc80987e 419 * @retval None
mbed_official 610:813dcc80987e 420 */
mbed_official 610:813dcc80987e 421 void FLASH_FlushCaches(void)
mbed_official 610:813dcc80987e 422 {
mbed_official 610:813dcc80987e 423 /* Flush instruction cache */
mbed_official 610:813dcc80987e 424 if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != RESET)
mbed_official 610:813dcc80987e 425 {
mbed_official 610:813dcc80987e 426 /* Disable instruction cache */
mbed_official 610:813dcc80987e 427 __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
mbed_official 610:813dcc80987e 428 /* Reset instruction cache */
mbed_official 610:813dcc80987e 429 __HAL_FLASH_INSTRUCTION_CACHE_RESET();
mbed_official 610:813dcc80987e 430 /* Enable instruction cache */
mbed_official 610:813dcc80987e 431 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
mbed_official 610:813dcc80987e 432 }
mbed_official 610:813dcc80987e 433
mbed_official 610:813dcc80987e 434 /* Flush data cache */
mbed_official 610:813dcc80987e 435 if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET)
mbed_official 610:813dcc80987e 436 {
mbed_official 610:813dcc80987e 437 /* Disable data cache */
mbed_official 610:813dcc80987e 438 __HAL_FLASH_DATA_CACHE_DISABLE();
mbed_official 610:813dcc80987e 439 /* Reset data cache */
mbed_official 610:813dcc80987e 440 __HAL_FLASH_DATA_CACHE_RESET();
mbed_official 610:813dcc80987e 441 /* Enable data cache */
mbed_official 610:813dcc80987e 442 __HAL_FLASH_DATA_CACHE_ENABLE();
mbed_official 610:813dcc80987e 443 }
mbed_official 610:813dcc80987e 444 }
mbed_official 610:813dcc80987e 445
mbed_official 610:813dcc80987e 446 /**
mbed_official 610:813dcc80987e 447 * @brief Configure the write protection of the desired pages.
mbed_official 610:813dcc80987e 448 *
mbed_official 610:813dcc80987e 449 * @note When the memory read protection level is selected (RDP level = 1),
mbed_official 610:813dcc80987e 450 * it is not possible to program or erase Flash memory if the CPU debug
mbed_official 610:813dcc80987e 451 * features are connected (JTAG or single wire) or boot code is being
mbed_official 610:813dcc80987e 452 * executed from RAM or System flash, even if WRP is not activated.
mbed_official 610:813dcc80987e 453 * @note To configure the WRP options, the option lock bit OPTLOCK must be
mbed_official 610:813dcc80987e 454 * cleared with the call of the HAL_FLASH_OB_Unlock() function.
mbed_official 610:813dcc80987e 455 * @note To validate the WRP options, the option bytes must be reloaded
mbed_official 610:813dcc80987e 456 * through the call of the HAL_FLASH_OB_Launch() function.
mbed_official 610:813dcc80987e 457 *
mbed_official 610:813dcc80987e 458 * @param WRPArea: specifies the area to be configured.
mbed_official 610:813dcc80987e 459 * This parameter can be one of the following values:
mbed_official 610:813dcc80987e 460 * @arg OB_WRPAREA_BANK1_AREAA: Flash Bank 1 Area A
mbed_official 610:813dcc80987e 461 * @arg OB_WRPAREA_BANK1_AREAB: Flash Bank 1 Area B
mbed_official 610:813dcc80987e 462 * @arg OB_WRPAREA_BANK2_AREAA: Flash Bank 2 Area A
mbed_official 610:813dcc80987e 463 * @arg OB_WRPAREA_BANK2_AREAB: Flash Bank 2 Area B
mbed_official 610:813dcc80987e 464 *
mbed_official 610:813dcc80987e 465 * @param WRPStartOffset: specifies the start page of the write protected area
mbed_official 610:813dcc80987e 466 * This parameter can be page number between 0 and (max number of pages in the bank - 1)
mbed_official 610:813dcc80987e 467 *
mbed_official 610:813dcc80987e 468 * @param WRDPEndOffset: specifies the end page of the write protected area
mbed_official 610:813dcc80987e 469 * This parameter can be page number between WRPStartOffset and (max number of pages in the bank - 1)
mbed_official 610:813dcc80987e 470 *
mbed_official 610:813dcc80987e 471 * @retval HAL Status
mbed_official 610:813dcc80987e 472 */
mbed_official 610:813dcc80987e 473 static HAL_StatusTypeDef FLASH_OB_WRPConfig(uint32_t WRPArea, uint32_t WRPStartOffset, uint32_t WRDPEndOffset)
mbed_official 610:813dcc80987e 474 {
mbed_official 610:813dcc80987e 475 HAL_StatusTypeDef status = HAL_OK;
mbed_official 610:813dcc80987e 476
mbed_official 610:813dcc80987e 477 /* Check the parameters */
mbed_official 610:813dcc80987e 478 assert_param(IS_OB_WRPAREA(WRPArea));
mbed_official 610:813dcc80987e 479 assert_param(IS_FLASH_PAGE(WRPStartOffset));
mbed_official 610:813dcc80987e 480 assert_param(IS_FLASH_PAGE(WRDPEndOffset));
mbed_official 610:813dcc80987e 481
mbed_official 610:813dcc80987e 482 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 483 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 484
mbed_official 610:813dcc80987e 485 if(status == HAL_OK)
mbed_official 610:813dcc80987e 486 {
mbed_official 610:813dcc80987e 487 /* Configure the write protected area */
mbed_official 610:813dcc80987e 488 if(WRPArea == OB_WRPAREA_BANK1_AREAA)
mbed_official 610:813dcc80987e 489 {
mbed_official 610:813dcc80987e 490 MODIFY_REG(FLASH->WRP1AR, (FLASH_WRP1AR_WRP1A_STRT | FLASH_WRP1AR_WRP1A_END),
mbed_official 610:813dcc80987e 491 (WRPStartOffset | (WRDPEndOffset << 16)));
mbed_official 610:813dcc80987e 492 }
mbed_official 610:813dcc80987e 493 else if(WRPArea == OB_WRPAREA_BANK1_AREAB)
mbed_official 610:813dcc80987e 494 {
mbed_official 610:813dcc80987e 495 MODIFY_REG(FLASH->WRP1BR, (FLASH_WRP1BR_WRP1B_STRT | FLASH_WRP1BR_WRP1B_END),
mbed_official 610:813dcc80987e 496 (WRPStartOffset | (WRDPEndOffset << 16)));
mbed_official 610:813dcc80987e 497 }
mbed_official 610:813dcc80987e 498 else if(WRPArea == OB_WRPAREA_BANK2_AREAA)
mbed_official 610:813dcc80987e 499 {
mbed_official 610:813dcc80987e 500 MODIFY_REG(FLASH->WRP2AR, (FLASH_WRP2AR_WRP2A_STRT | FLASH_WRP2AR_WRP2A_END),
mbed_official 610:813dcc80987e 501 (WRPStartOffset | (WRDPEndOffset << 16)));
mbed_official 610:813dcc80987e 502 }
mbed_official 610:813dcc80987e 503 else if(WRPArea == OB_WRPAREA_BANK2_AREAB)
mbed_official 610:813dcc80987e 504 {
mbed_official 610:813dcc80987e 505 MODIFY_REG(FLASH->WRP2BR, (FLASH_WRP2BR_WRP2B_STRT | FLASH_WRP2BR_WRP2B_END),
mbed_official 610:813dcc80987e 506 (WRPStartOffset | (WRDPEndOffset << 16)));
mbed_official 610:813dcc80987e 507 }
mbed_official 610:813dcc80987e 508
mbed_official 610:813dcc80987e 509 /* Set OPTSTRT Bit */
mbed_official 610:813dcc80987e 510 SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 511
mbed_official 610:813dcc80987e 512 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 513 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 514
mbed_official 610:813dcc80987e 515 /* If the option byte program operation is completed, disable the OPTSTRT Bit */
mbed_official 610:813dcc80987e 516 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 517 }
mbed_official 610:813dcc80987e 518
mbed_official 610:813dcc80987e 519 return status;
mbed_official 610:813dcc80987e 520 }
mbed_official 610:813dcc80987e 521
mbed_official 610:813dcc80987e 522 /**
mbed_official 610:813dcc80987e 523 * @brief Set the read protection level.
mbed_official 610:813dcc80987e 524 *
mbed_official 610:813dcc80987e 525 * @note To configure the RDP level, the option lock bit OPTLOCK must be
mbed_official 610:813dcc80987e 526 * cleared with the call of the HAL_FLASH_OB_Unlock() function.
mbed_official 610:813dcc80987e 527 * @note To validate the RDP level, the option bytes must be reloaded
mbed_official 610:813dcc80987e 528 * through the call of the HAL_FLASH_OB_Launch() function.
mbed_official 610:813dcc80987e 529 * @note !!! Warning : When enabling OB_RDP level 2 it's no more possible
mbed_official 610:813dcc80987e 530 * to go back to level 1 or 0 !!!
mbed_official 610:813dcc80987e 531 *
mbed_official 610:813dcc80987e 532 * @param RDPLevel: specifies the read protection level.
mbed_official 610:813dcc80987e 533 * This parameter can be one of the following values:
mbed_official 610:813dcc80987e 534 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 610:813dcc80987e 535 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 610:813dcc80987e 536 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 610:813dcc80987e 537 *
mbed_official 610:813dcc80987e 538 * @retval HAL status
mbed_official 610:813dcc80987e 539 */
mbed_official 610:813dcc80987e 540 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint32_t RDPLevel)
mbed_official 610:813dcc80987e 541 {
mbed_official 610:813dcc80987e 542 HAL_StatusTypeDef status = HAL_OK;
mbed_official 610:813dcc80987e 543
mbed_official 610:813dcc80987e 544 /* Check the parameters */
mbed_official 610:813dcc80987e 545 assert_param(IS_OB_RDP_LEVEL(RDPLevel));
mbed_official 610:813dcc80987e 546
mbed_official 610:813dcc80987e 547 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 548 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 549
mbed_official 610:813dcc80987e 550 if(status == HAL_OK)
mbed_official 610:813dcc80987e 551 {
mbed_official 610:813dcc80987e 552 /* Configure the RDP level in the option bytes register */
mbed_official 610:813dcc80987e 553 MODIFY_REG(FLASH->OPTR, FLASH_OPTR_RDP, RDPLevel);
mbed_official 610:813dcc80987e 554
mbed_official 610:813dcc80987e 555 /* Set OPTSTRT Bit */
mbed_official 610:813dcc80987e 556 SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 557
mbed_official 610:813dcc80987e 558 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 559 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 560
mbed_official 610:813dcc80987e 561 /* If the option byte program operation is completed, disable the OPTSTRT Bit */
mbed_official 610:813dcc80987e 562 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 563 }
mbed_official 610:813dcc80987e 564
mbed_official 610:813dcc80987e 565 return status;
mbed_official 610:813dcc80987e 566 }
mbed_official 610:813dcc80987e 567
mbed_official 610:813dcc80987e 568 /**
mbed_official 610:813dcc80987e 569 * @brief Program the FLASH User Option Byte.
mbed_official 610:813dcc80987e 570 *
mbed_official 610:813dcc80987e 571 * @note To configure the user option bytes, the option lock bit OPTLOCK must
mbed_official 610:813dcc80987e 572 * be cleared with the call of the HAL_FLASH_OB_Unlock() function.
mbed_official 610:813dcc80987e 573 * @note To validate the user option bytes, the option bytes must be reloaded
mbed_official 610:813dcc80987e 574 * through the call of the HAL_FLASH_OB_Launch() function.
mbed_official 610:813dcc80987e 575 *
mbed_official 610:813dcc80987e 576 * @param UserType: The FLASH User Option Bytes to be modified
mbed_official 610:813dcc80987e 577 * @param UserConfig: The FLASH User Option Bytes values:
mbed_official 610:813dcc80987e 578 * BOR_LEV(Bit8-10), nRST_STOP(Bit12), nRST_STDBY(Bit13), IWDG_SW(Bit16),
mbed_official 610:813dcc80987e 579 * IWDG_STOP(Bit17), IWDG_STDBY(Bit18), WWDG_SW(Bit19), BFB2(Bit20),
mbed_official 610:813dcc80987e 580 * DUALBANK(Bit21), nBOOT1(Bit23), SRAM2_PE(Bit24) and SRAM2_RST(Bit25).
mbed_official 610:813dcc80987e 581 *
mbed_official 610:813dcc80987e 582 * @retval HAL status
mbed_official 610:813dcc80987e 583 */
mbed_official 610:813dcc80987e 584 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig)
mbed_official 610:813dcc80987e 585 {
mbed_official 610:813dcc80987e 586 uint32_t optr_reg_val = 0;
mbed_official 610:813dcc80987e 587 uint32_t optr_reg_mask = 0;
mbed_official 610:813dcc80987e 588 HAL_StatusTypeDef status = HAL_OK;
mbed_official 610:813dcc80987e 589
mbed_official 610:813dcc80987e 590 /* Check the parameters */
mbed_official 610:813dcc80987e 591 assert_param(IS_OB_USER_TYPE(UserType));
mbed_official 610:813dcc80987e 592
mbed_official 610:813dcc80987e 593 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 594 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 595
mbed_official 610:813dcc80987e 596 if(status == HAL_OK)
mbed_official 610:813dcc80987e 597 {
mbed_official 610:813dcc80987e 598 if((UserType & OB_USER_BOR_LEV) != RESET)
mbed_official 610:813dcc80987e 599 {
mbed_official 610:813dcc80987e 600 /* BOR level option byte should be modified */
mbed_official 610:813dcc80987e 601 assert_param(IS_OB_USER_BOR_LEVEL(UserConfig & FLASH_OPTR_BOR_LEV));
mbed_official 610:813dcc80987e 602
mbed_official 610:813dcc80987e 603 /* Set value and mask for BOR level option byte */
mbed_official 610:813dcc80987e 604 optr_reg_val |= (UserConfig & FLASH_OPTR_BOR_LEV);
mbed_official 610:813dcc80987e 605 optr_reg_mask |= FLASH_OPTR_BOR_LEV;
mbed_official 610:813dcc80987e 606 }
mbed_official 610:813dcc80987e 607
mbed_official 610:813dcc80987e 608 if((UserType & OB_USER_nRST_STOP) != RESET)
mbed_official 610:813dcc80987e 609 {
mbed_official 610:813dcc80987e 610 /* nRST_STOP option byte should be modified */
mbed_official 610:813dcc80987e 611 assert_param(IS_OB_USER_STOP(UserConfig & FLASH_OPTR_nRST_STOP));
mbed_official 610:813dcc80987e 612
mbed_official 610:813dcc80987e 613 /* Set value and mask for nRST_STOP option byte */
mbed_official 610:813dcc80987e 614 optr_reg_val |= (UserConfig & FLASH_OPTR_nRST_STOP);
mbed_official 610:813dcc80987e 615 optr_reg_mask |= FLASH_OPTR_nRST_STOP;
mbed_official 610:813dcc80987e 616 }
mbed_official 610:813dcc80987e 617
mbed_official 610:813dcc80987e 618 if((UserType & OB_USER_nRST_STDBY) != RESET)
mbed_official 610:813dcc80987e 619 {
mbed_official 610:813dcc80987e 620 /* nRST_STDBY option byte should be modified */
mbed_official 610:813dcc80987e 621 assert_param(IS_OB_USER_STANDBY(UserConfig & FLASH_OPTR_nRST_STDBY));
mbed_official 610:813dcc80987e 622
mbed_official 610:813dcc80987e 623 /* Set value and mask for nRST_STDBY option byte */
mbed_official 610:813dcc80987e 624 optr_reg_val |= (UserConfig & FLASH_OPTR_nRST_STDBY);
mbed_official 610:813dcc80987e 625 optr_reg_mask |= FLASH_OPTR_nRST_STDBY;
mbed_official 610:813dcc80987e 626 }
mbed_official 610:813dcc80987e 627
mbed_official 610:813dcc80987e 628 if((UserType & OB_USER_IWDG_SW) != RESET)
mbed_official 610:813dcc80987e 629 {
mbed_official 610:813dcc80987e 630 /* IWDG_SW option byte should be modified */
mbed_official 610:813dcc80987e 631 assert_param(IS_OB_USER_IWDG(UserConfig & FLASH_OPTR_IWDG_SW));
mbed_official 610:813dcc80987e 632
mbed_official 610:813dcc80987e 633 /* Set value and mask for IWDG_SW option byte */
mbed_official 610:813dcc80987e 634 optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_SW);
mbed_official 610:813dcc80987e 635 optr_reg_mask |= FLASH_OPTR_IWDG_SW;
mbed_official 610:813dcc80987e 636 }
mbed_official 610:813dcc80987e 637
mbed_official 610:813dcc80987e 638 if((UserType & OB_USER_IWDG_STOP) != RESET)
mbed_official 610:813dcc80987e 639 {
mbed_official 610:813dcc80987e 640 /* IWDG_STOP option byte should be modified */
mbed_official 610:813dcc80987e 641 assert_param(IS_OB_USER_IWDG_STOP(UserConfig & FLASH_OPTR_IWDG_STOP));
mbed_official 610:813dcc80987e 642
mbed_official 610:813dcc80987e 643 /* Set value and mask for IWDG_STOP option byte */
mbed_official 610:813dcc80987e 644 optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_STOP);
mbed_official 610:813dcc80987e 645 optr_reg_mask |= FLASH_OPTR_IWDG_STOP;
mbed_official 610:813dcc80987e 646 }
mbed_official 610:813dcc80987e 647
mbed_official 610:813dcc80987e 648 if((UserType & OB_USER_IWDG_STDBY) != RESET)
mbed_official 610:813dcc80987e 649 {
mbed_official 610:813dcc80987e 650 /* IWDG_STDBY option byte should be modified */
mbed_official 610:813dcc80987e 651 assert_param(IS_OB_USER_IWDG_STDBY(UserConfig & FLASH_OPTR_IWDG_STDBY));
mbed_official 610:813dcc80987e 652
mbed_official 610:813dcc80987e 653 /* Set value and mask for IWDG_STDBY option byte */
mbed_official 610:813dcc80987e 654 optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_STDBY);
mbed_official 610:813dcc80987e 655 optr_reg_mask |= FLASH_OPTR_IWDG_STDBY;
mbed_official 610:813dcc80987e 656 }
mbed_official 610:813dcc80987e 657
mbed_official 610:813dcc80987e 658 if((UserType & OB_USER_WWDG_SW) != RESET)
mbed_official 610:813dcc80987e 659 {
mbed_official 610:813dcc80987e 660 /* WWDG_SW option byte should be modified */
mbed_official 610:813dcc80987e 661 assert_param(IS_OB_USER_WWDG(UserConfig & FLASH_OPTR_WWDG_SW));
mbed_official 610:813dcc80987e 662
mbed_official 610:813dcc80987e 663 /* Set value and mask for WWDG_SW option byte */
mbed_official 610:813dcc80987e 664 optr_reg_val |= (UserConfig & FLASH_OPTR_WWDG_SW);
mbed_official 610:813dcc80987e 665 optr_reg_mask |= FLASH_OPTR_WWDG_SW;
mbed_official 610:813dcc80987e 666 }
mbed_official 610:813dcc80987e 667
mbed_official 610:813dcc80987e 668 if((UserType & OB_USER_BFB2) != RESET)
mbed_official 610:813dcc80987e 669 {
mbed_official 610:813dcc80987e 670 /* BFB2 option byte should be modified */
mbed_official 610:813dcc80987e 671 assert_param(IS_OB_USER_BFB2(UserConfig & FLASH_OPTR_BFB2));
mbed_official 610:813dcc80987e 672
mbed_official 610:813dcc80987e 673 /* Set value and mask for BFB2 option byte */
mbed_official 610:813dcc80987e 674 optr_reg_val |= (UserConfig & FLASH_OPTR_BFB2);
mbed_official 610:813dcc80987e 675 optr_reg_mask |= FLASH_OPTR_BFB2;
mbed_official 610:813dcc80987e 676 }
mbed_official 610:813dcc80987e 677
mbed_official 610:813dcc80987e 678 if((UserType & OB_USER_DUALBANK) != RESET)
mbed_official 610:813dcc80987e 679 {
mbed_official 610:813dcc80987e 680 /* DUALBANK option byte should be modified */
mbed_official 610:813dcc80987e 681 assert_param(IS_OB_USER_DUALBANK(UserConfig & FLASH_OPTR_DUALBANK));
mbed_official 610:813dcc80987e 682
mbed_official 610:813dcc80987e 683 /* Set value and mask for DUALBANK option byte */
mbed_official 610:813dcc80987e 684 optr_reg_val |= (UserConfig & FLASH_OPTR_DUALBANK);
mbed_official 610:813dcc80987e 685 optr_reg_mask |= FLASH_OPTR_DUALBANK;
mbed_official 610:813dcc80987e 686 }
mbed_official 610:813dcc80987e 687
mbed_official 610:813dcc80987e 688 if((UserType & OB_USER_nBOOT1) != RESET)
mbed_official 610:813dcc80987e 689 {
mbed_official 610:813dcc80987e 690 /* nBOOT1 option byte should be modified */
mbed_official 610:813dcc80987e 691 assert_param(IS_OB_USER_BOOT1(UserConfig & FLASH_OPTR_nBOOT1));
mbed_official 610:813dcc80987e 692
mbed_official 610:813dcc80987e 693 /* Set value and mask for nBOOT1 option byte */
mbed_official 610:813dcc80987e 694 optr_reg_val |= (UserConfig & FLASH_OPTR_nBOOT1);
mbed_official 610:813dcc80987e 695 optr_reg_mask |= FLASH_OPTR_nBOOT1;
mbed_official 610:813dcc80987e 696 }
mbed_official 610:813dcc80987e 697
mbed_official 610:813dcc80987e 698 if((UserType & OB_USER_SRAM2_PE) != RESET)
mbed_official 610:813dcc80987e 699 {
mbed_official 610:813dcc80987e 700 /* SRAM2_PE option byte should be modified */
mbed_official 610:813dcc80987e 701 assert_param(IS_OB_USER_SRAM2_PARITY(UserConfig & FLASH_OPTR_SRAM2_PE));
mbed_official 610:813dcc80987e 702
mbed_official 610:813dcc80987e 703 /* Set value and mask for SRAM2_PE option byte */
mbed_official 610:813dcc80987e 704 optr_reg_val |= (UserConfig & FLASH_OPTR_SRAM2_PE);
mbed_official 610:813dcc80987e 705 optr_reg_mask |= FLASH_OPTR_SRAM2_PE;
mbed_official 610:813dcc80987e 706 }
mbed_official 610:813dcc80987e 707
mbed_official 610:813dcc80987e 708 if((UserType & OB_USER_SRAM2_RST) != RESET)
mbed_official 610:813dcc80987e 709 {
mbed_official 610:813dcc80987e 710 /* SRAM2_RST option byte should be modified */
mbed_official 610:813dcc80987e 711 assert_param(IS_OB_USER_SRAM2_RST(UserConfig & FLASH_OPTR_SRAM2_RST));
mbed_official 610:813dcc80987e 712
mbed_official 610:813dcc80987e 713 /* Set value and mask for SRAM2_RST option byte */
mbed_official 610:813dcc80987e 714 optr_reg_val |= (UserConfig & FLASH_OPTR_SRAM2_RST);
mbed_official 610:813dcc80987e 715 optr_reg_mask |= FLASH_OPTR_SRAM2_RST;
mbed_official 610:813dcc80987e 716 }
mbed_official 610:813dcc80987e 717
mbed_official 610:813dcc80987e 718 /* Configure the option bytes register */
mbed_official 610:813dcc80987e 719 MODIFY_REG(FLASH->OPTR, optr_reg_mask, optr_reg_val);
mbed_official 610:813dcc80987e 720
mbed_official 610:813dcc80987e 721 /* Set OPTSTRT Bit */
mbed_official 610:813dcc80987e 722 SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 723
mbed_official 610:813dcc80987e 724 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 725 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 726
mbed_official 610:813dcc80987e 727 /* If the option byte program operation is completed, disable the OPTSTRT Bit */
mbed_official 610:813dcc80987e 728 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 729 }
mbed_official 610:813dcc80987e 730
mbed_official 610:813dcc80987e 731 return status;
mbed_official 610:813dcc80987e 732 }
mbed_official 610:813dcc80987e 733
mbed_official 610:813dcc80987e 734 /**
mbed_official 610:813dcc80987e 735 * @brief Configure the Proprietary code readout protection of the desired addresses.
mbed_official 610:813dcc80987e 736 *
mbed_official 610:813dcc80987e 737 * @note To configure the PCROP options, the option lock bit OPTLOCK must be
mbed_official 610:813dcc80987e 738 * cleared with the call of the HAL_FLASH_OB_Unlock() function.
mbed_official 610:813dcc80987e 739 * @note To validate the PCROP options, the option bytes must be reloaded
mbed_official 610:813dcc80987e 740 * through the call of the HAL_FLASH_OB_Launch() function.
mbed_official 610:813dcc80987e 741 *
mbed_official 610:813dcc80987e 742 * @param PCROPConfig: specifies the configuration (Bank to be configured and PCROP_RDP option).
mbed_official 610:813dcc80987e 743 * This parameter must be a combination of FLASH_BANK_1 or FLASH_BANK_2
mbed_official 610:813dcc80987e 744 * with OB_PCROP_RDP_NOT_ERASE or OB_PCROP_RDP_ERASE
mbed_official 610:813dcc80987e 745 *
mbed_official 610:813dcc80987e 746 * @param PCROPStartAddr: specifies the start address of the Proprietary code readout protection
mbed_official 610:813dcc80987e 747 * This parameter can be an address between begin and end of the bank
mbed_official 610:813dcc80987e 748 *
mbed_official 610:813dcc80987e 749 * @param PCROPEndAddr: specifies the end address of the Proprietary code readout protection
mbed_official 610:813dcc80987e 750 * This parameter can be an address between PCROPStartAddr and end of the bank
mbed_official 610:813dcc80987e 751 *
mbed_official 610:813dcc80987e 752 * @retval HAL Status
mbed_official 610:813dcc80987e 753 */
mbed_official 610:813dcc80987e 754 static HAL_StatusTypeDef FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr)
mbed_official 610:813dcc80987e 755 {
mbed_official 610:813dcc80987e 756 HAL_StatusTypeDef status = HAL_OK;
mbed_official 610:813dcc80987e 757 uint32_t reg_value = 0;
mbed_official 610:813dcc80987e 758 uint32_t bank1_addr, bank2_addr;
mbed_official 610:813dcc80987e 759
mbed_official 610:813dcc80987e 760 /* Check the parameters */
mbed_official 610:813dcc80987e 761 assert_param(IS_FLASH_BANK_EXCLUSIVE(PCROPConfig & FLASH_BANK_BOTH));
mbed_official 610:813dcc80987e 762 assert_param(IS_OB_PCROP_RDP(PCROPConfig & FLASH_PCROP1ER_PCROP_RDP));
mbed_official 610:813dcc80987e 763 assert_param(IS_FLASH_MAIN_MEM_ADDRESS(PCROPStartAddr));
mbed_official 610:813dcc80987e 764 assert_param(IS_FLASH_MAIN_MEM_ADDRESS(PCROPEndAddr));
mbed_official 610:813dcc80987e 765
mbed_official 610:813dcc80987e 766 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 767 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 768
mbed_official 610:813dcc80987e 769 if(status == HAL_OK)
mbed_official 610:813dcc80987e 770 {
mbed_official 610:813dcc80987e 771 /* Get the information about the bank swapping */
mbed_official 610:813dcc80987e 772 if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0)
mbed_official 610:813dcc80987e 773 {
mbed_official 610:813dcc80987e 774 bank1_addr = FLASH_BASE;
mbed_official 610:813dcc80987e 775 bank2_addr = FLASH_BASE + FLASH_BANK_SIZE;
mbed_official 610:813dcc80987e 776 }
mbed_official 610:813dcc80987e 777 else
mbed_official 610:813dcc80987e 778 {
mbed_official 610:813dcc80987e 779 bank1_addr = FLASH_BASE + FLASH_BANK_SIZE;
mbed_official 610:813dcc80987e 780 bank2_addr = FLASH_BASE;
mbed_official 610:813dcc80987e 781 }
mbed_official 610:813dcc80987e 782
mbed_official 610:813dcc80987e 783 /* Configure the Proprietary code readout protection */
mbed_official 610:813dcc80987e 784 if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_1)
mbed_official 610:813dcc80987e 785 {
mbed_official 610:813dcc80987e 786 reg_value = ((PCROPStartAddr - bank1_addr) >> 3);
mbed_official 610:813dcc80987e 787 MODIFY_REG(FLASH->PCROP1SR, FLASH_PCROP1SR_PCROP1_STRT, reg_value);
mbed_official 610:813dcc80987e 788
mbed_official 610:813dcc80987e 789 reg_value = ((PCROPEndAddr - bank1_addr) >> 3);
mbed_official 610:813dcc80987e 790 MODIFY_REG(FLASH->PCROP1ER, FLASH_PCROP1ER_PCROP1_END, reg_value);
mbed_official 610:813dcc80987e 791 }
mbed_official 610:813dcc80987e 792 else if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_2)
mbed_official 610:813dcc80987e 793 {
mbed_official 610:813dcc80987e 794 reg_value = ((PCROPStartAddr - bank2_addr) >> 3);
mbed_official 610:813dcc80987e 795 MODIFY_REG(FLASH->PCROP2SR, FLASH_PCROP2SR_PCROP2_STRT, reg_value);
mbed_official 610:813dcc80987e 796
mbed_official 610:813dcc80987e 797 reg_value = ((PCROPEndAddr - bank2_addr) >> 3);
mbed_official 610:813dcc80987e 798 MODIFY_REG(FLASH->PCROP2ER, FLASH_PCROP2ER_PCROP2_END, reg_value);
mbed_official 610:813dcc80987e 799 }
mbed_official 610:813dcc80987e 800
mbed_official 610:813dcc80987e 801 MODIFY_REG(FLASH->PCROP1ER, FLASH_PCROP1ER_PCROP_RDP, (PCROPConfig & FLASH_PCROP1ER_PCROP_RDP));
mbed_official 610:813dcc80987e 802
mbed_official 610:813dcc80987e 803 /* Set OPTSTRT Bit */
mbed_official 610:813dcc80987e 804 SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 805
mbed_official 610:813dcc80987e 806 /* Wait for last operation to be completed */
mbed_official 610:813dcc80987e 807 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
mbed_official 610:813dcc80987e 808
mbed_official 610:813dcc80987e 809 /* If the option byte program operation is completed, disable the OPTSTRT Bit */
mbed_official 610:813dcc80987e 810 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
mbed_official 610:813dcc80987e 811 }
mbed_official 610:813dcc80987e 812
mbed_official 610:813dcc80987e 813 return status;
mbed_official 610:813dcc80987e 814 }
mbed_official 610:813dcc80987e 815
mbed_official 610:813dcc80987e 816 /**
mbed_official 610:813dcc80987e 817 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 610:813dcc80987e 818 *
mbed_official 610:813dcc80987e 819 * @param[in] WRPArea: specifies the area to be returned.
mbed_official 610:813dcc80987e 820 * This parameter can be one of the following values:
mbed_official 610:813dcc80987e 821 * @arg OB_WRPAREA_BANK1_AREAA: Flash Bank 1 Area A
mbed_official 610:813dcc80987e 822 * @arg OB_WRPAREA_BANK1_AREAB: Flash Bank 1 Area B
mbed_official 610:813dcc80987e 823 * @arg OB_WRPAREA_BANK2_AREAA: Flash Bank 2 Area A
mbed_official 610:813dcc80987e 824 * @arg OB_WRPAREA_BANK2_AREAB: Flash Bank 2 Area B
mbed_official 610:813dcc80987e 825 *
mbed_official 610:813dcc80987e 826 * @param[out] WRPStartOffset: specifies the address where to copied the start page
mbed_official 610:813dcc80987e 827 * of the write protected area
mbed_official 610:813dcc80987e 828 *
mbed_official 610:813dcc80987e 829 * @param[out] WRDPEndOffset: specifies the address where to copied the end page of
mbed_official 610:813dcc80987e 830 * the write protected area
mbed_official 610:813dcc80987e 831 *
mbed_official 610:813dcc80987e 832 * @retval None
mbed_official 610:813dcc80987e 833 */
mbed_official 610:813dcc80987e 834 static void FLASH_OB_GetWRP(uint32_t WRPArea, uint32_t * WRPStartOffset, uint32_t * WRDPEndOffset)
mbed_official 610:813dcc80987e 835 {
mbed_official 610:813dcc80987e 836 /* Check the parameters */
mbed_official 610:813dcc80987e 837 assert_param(IS_OB_WRPAREA(WRPArea));
mbed_official 610:813dcc80987e 838
mbed_official 610:813dcc80987e 839 /* Get the configuration of the write protected area */
mbed_official 610:813dcc80987e 840 if(WRPArea == OB_WRPAREA_BANK1_AREAA)
mbed_official 610:813dcc80987e 841 {
mbed_official 610:813dcc80987e 842 *WRPStartOffset = READ_BIT(FLASH->WRP1AR, FLASH_WRP1AR_WRP1A_STRT);
mbed_official 610:813dcc80987e 843 *WRDPEndOffset = (READ_BIT(FLASH->WRP1AR, FLASH_WRP1AR_WRP1A_END) >> 16);
mbed_official 610:813dcc80987e 844 }
mbed_official 610:813dcc80987e 845 else if(WRPArea == OB_WRPAREA_BANK1_AREAB)
mbed_official 610:813dcc80987e 846 {
mbed_official 610:813dcc80987e 847 *WRPStartOffset = READ_BIT(FLASH->WRP1BR, FLASH_WRP1BR_WRP1B_STRT);
mbed_official 610:813dcc80987e 848 *WRDPEndOffset = (READ_BIT(FLASH->WRP1BR, FLASH_WRP1BR_WRP1B_END) >> 16);
mbed_official 610:813dcc80987e 849 }
mbed_official 610:813dcc80987e 850 else if(WRPArea == OB_WRPAREA_BANK2_AREAA)
mbed_official 610:813dcc80987e 851 {
mbed_official 610:813dcc80987e 852 *WRPStartOffset = READ_BIT(FLASH->WRP2AR, FLASH_WRP2AR_WRP2A_STRT);
mbed_official 610:813dcc80987e 853 *WRDPEndOffset = (READ_BIT(FLASH->WRP2AR, FLASH_WRP2AR_WRP2A_END) >> 16);
mbed_official 610:813dcc80987e 854 }
mbed_official 610:813dcc80987e 855 else if(WRPArea == OB_WRPAREA_BANK2_AREAB)
mbed_official 610:813dcc80987e 856 {
mbed_official 610:813dcc80987e 857 *WRPStartOffset = READ_BIT(FLASH->WRP2BR, FLASH_WRP2BR_WRP2B_STRT);
mbed_official 610:813dcc80987e 858 *WRDPEndOffset = (READ_BIT(FLASH->WRP2BR, FLASH_WRP2BR_WRP2B_END) >> 16);
mbed_official 610:813dcc80987e 859 }
mbed_official 610:813dcc80987e 860 }
mbed_official 610:813dcc80987e 861
mbed_official 610:813dcc80987e 862 /**
mbed_official 610:813dcc80987e 863 * @brief Return the FLASH Read Protection level.
mbed_official 610:813dcc80987e 864 * @retval FLASH ReadOut Protection Status:
mbed_official 610:813dcc80987e 865 * This return value can be one of the following values:
mbed_official 610:813dcc80987e 866 * @arg OB_RDP_LEVEL_0: No protection
mbed_official 610:813dcc80987e 867 * @arg OB_RDP_LEVEL_1: Read protection of the memory
mbed_official 610:813dcc80987e 868 * @arg OB_RDP_LEVEL_2: Full chip protection
mbed_official 610:813dcc80987e 869 */
mbed_official 610:813dcc80987e 870 static uint32_t FLASH_OB_GetRDP(void)
mbed_official 610:813dcc80987e 871 {
mbed_official 610:813dcc80987e 872 if ((READ_BIT(FLASH->OPTR, FLASH_OPTR_RDP) != OB_RDP_LEVEL_0) &&
mbed_official 610:813dcc80987e 873 (READ_BIT(FLASH->OPTR, FLASH_OPTR_RDP) != OB_RDP_LEVEL_2))
mbed_official 610:813dcc80987e 874 {
mbed_official 610:813dcc80987e 875 return (OB_RDP_LEVEL_1);
mbed_official 610:813dcc80987e 876 }
mbed_official 610:813dcc80987e 877 else
mbed_official 610:813dcc80987e 878 {
mbed_official 610:813dcc80987e 879 return (READ_BIT(FLASH->OPTR, FLASH_OPTR_RDP));
mbed_official 610:813dcc80987e 880 }
mbed_official 610:813dcc80987e 881 }
mbed_official 610:813dcc80987e 882
mbed_official 610:813dcc80987e 883 /**
mbed_official 610:813dcc80987e 884 * @brief Return the FLASH User Option Byte value.
mbed_official 610:813dcc80987e 885 * @retval The FLASH User Option Bytes values:
mbed_official 610:813dcc80987e 886 * BOR_LEV(Bit8-10), nRST_STOP(Bit12), nRST_STDBY(Bit13), IWDG_SW(Bit16),
mbed_official 610:813dcc80987e 887 * IWDG_STOP(Bit17), IWDG_STDBY(Bit18), WWDG_SW(Bit19), BFB2(Bit20),
mbed_official 610:813dcc80987e 888 * DUALBANK(Bit21), nBOOT1(Bit23), SRAM2_PE(Bit24) and SRAM2_RST(Bit25).
mbed_official 610:813dcc80987e 889 */
mbed_official 610:813dcc80987e 890 static uint32_t FLASH_OB_GetUser(void)
mbed_official 610:813dcc80987e 891 {
mbed_official 610:813dcc80987e 892 uint32_t user_config = READ_REG(FLASH->OPTR);
mbed_official 610:813dcc80987e 893 CLEAR_BIT(user_config, FLASH_OPTR_RDP);
mbed_official 610:813dcc80987e 894
mbed_official 610:813dcc80987e 895 return user_config;
mbed_official 610:813dcc80987e 896 }
mbed_official 610:813dcc80987e 897
mbed_official 610:813dcc80987e 898 /**
mbed_official 610:813dcc80987e 899 * @brief Return the FLASH Write Protection Option Bytes value.
mbed_official 610:813dcc80987e 900 *
mbed_official 610:813dcc80987e 901 * @param PCROPConfig [inout]: specifies the configuration (Bank to be configured and PCROP_RDP option).
mbed_official 610:813dcc80987e 902 * This parameter must be a combination of FLASH_BANK_1 or FLASH_BANK_2
mbed_official 610:813dcc80987e 903 * with OB_PCROP_RDP_NOT_ERASE or OB_PCROP_RDP_ERASE
mbed_official 610:813dcc80987e 904 *
mbed_official 610:813dcc80987e 905 * @param PCROPStartAddr [out]: specifies the address where to copied the start address
mbed_official 610:813dcc80987e 906 * of the Proprietary code readout protection
mbed_official 610:813dcc80987e 907 *
mbed_official 610:813dcc80987e 908 * @param PCROPEndAddr [out]: specifies the address where to copied the end address of
mbed_official 610:813dcc80987e 909 * the Proprietary code readout protection
mbed_official 610:813dcc80987e 910 *
mbed_official 610:813dcc80987e 911 * @retval None
mbed_official 610:813dcc80987e 912 */
mbed_official 610:813dcc80987e 913 static void FLASH_OB_GetPCROP(uint32_t * PCROPConfig, uint32_t * PCROPStartAddr, uint32_t * PCROPEndAddr)
mbed_official 610:813dcc80987e 914 {
mbed_official 610:813dcc80987e 915 uint32_t reg_value = 0;
mbed_official 610:813dcc80987e 916 uint32_t bank1_addr, bank2_addr;
mbed_official 610:813dcc80987e 917
mbed_official 610:813dcc80987e 918 /* Check the parameters */
mbed_official 610:813dcc80987e 919 assert_param(IS_FLASH_BANK_EXCLUSIVE((*PCROPConfig) & FLASH_BANK_BOTH));
mbed_official 610:813dcc80987e 920
mbed_official 610:813dcc80987e 921 /* Get the information about the bank swapping */
mbed_official 610:813dcc80987e 922 if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0)
mbed_official 610:813dcc80987e 923 {
mbed_official 610:813dcc80987e 924 bank1_addr = FLASH_BASE;
mbed_official 610:813dcc80987e 925 bank2_addr = FLASH_BASE + FLASH_BANK_SIZE;
mbed_official 610:813dcc80987e 926 }
mbed_official 610:813dcc80987e 927 else
mbed_official 610:813dcc80987e 928 {
mbed_official 610:813dcc80987e 929 bank1_addr = FLASH_BASE + FLASH_BANK_SIZE;
mbed_official 610:813dcc80987e 930 bank2_addr = FLASH_BASE;
mbed_official 610:813dcc80987e 931 }
mbed_official 610:813dcc80987e 932
mbed_official 610:813dcc80987e 933 if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_1)
mbed_official 610:813dcc80987e 934 {
mbed_official 610:813dcc80987e 935 reg_value = (READ_REG(FLASH->PCROP1SR) & FLASH_PCROP1SR_PCROP1_STRT);
mbed_official 610:813dcc80987e 936 *PCROPStartAddr = (reg_value << 3) + bank1_addr;
mbed_official 610:813dcc80987e 937
mbed_official 610:813dcc80987e 938 reg_value = (READ_REG(FLASH->PCROP1ER) & FLASH_PCROP1ER_PCROP1_END);
mbed_official 610:813dcc80987e 939 *PCROPEndAddr = (reg_value << 3) + bank1_addr;
mbed_official 610:813dcc80987e 940 }
mbed_official 610:813dcc80987e 941 else if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_2)
mbed_official 610:813dcc80987e 942 {
mbed_official 610:813dcc80987e 943 reg_value = (READ_REG(FLASH->PCROP2SR) & FLASH_PCROP2SR_PCROP2_STRT);
mbed_official 610:813dcc80987e 944 *PCROPStartAddr = (reg_value << 3) + bank2_addr;
mbed_official 610:813dcc80987e 945
mbed_official 610:813dcc80987e 946 reg_value = (READ_REG(FLASH->PCROP2ER) & FLASH_PCROP2ER_PCROP2_END);
mbed_official 610:813dcc80987e 947 *PCROPEndAddr = (reg_value << 3) + bank2_addr;
mbed_official 610:813dcc80987e 948 }
mbed_official 610:813dcc80987e 949
mbed_official 610:813dcc80987e 950 *PCROPConfig |= (READ_REG(FLASH->PCROP1ER) & FLASH_PCROP1ER_PCROP_RDP);
mbed_official 610:813dcc80987e 951 }
mbed_official 610:813dcc80987e 952 /**
mbed_official 610:813dcc80987e 953 * @}
mbed_official 610:813dcc80987e 954 */
mbed_official 610:813dcc80987e 955
mbed_official 610:813dcc80987e 956 /**
mbed_official 610:813dcc80987e 957 * @}
mbed_official 610:813dcc80987e 958 */
mbed_official 610:813dcc80987e 959
mbed_official 610:813dcc80987e 960 #endif /* HAL_FLASH_MODULE_ENABLED */
mbed_official 610:813dcc80987e 961
mbed_official 610:813dcc80987e 962 /**
mbed_official 610:813dcc80987e 963 * @}
mbed_official 610:813dcc80987e 964 */
mbed_official 610:813dcc80987e 965
mbed_official 610:813dcc80987e 966 /**
mbed_official 610:813dcc80987e 967 * @}
mbed_official 610:813dcc80987e 968 */
mbed_official 610:813dcc80987e 969
mbed_official 610:813dcc80987e 970 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/