mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Sep 28 20:15:09 2015 +0100
Revision:
634:ac7d6880524d
Parent:
632:7687fb9c4f91
Synchronized with git revision 9b7d23d47153c298a6d24de9a415202705889d11

Full URL: https://github.com/mbedmicro/mbed/commit/9b7d23d47153c298a6d24de9a415202705889d11/

Revert "[NUCLEO_F303K8] add support of the STM32F303K8"

Who changed what in which revision?

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