mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Sep 28 14:00:11 2015 +0100
Revision:
632:7687fb9c4f91
Parent:
385:be64abf45658
Child:
634:ac7d6880524d
Synchronized with git revision f7ce4ed029cc611121464252ff28d5e8beb895b0

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

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 632:7687fb9c4f91 5 * @version V1.1.1
mbed_official 632:7687fb9c4f91 6 * @date 19-June-2015
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 632:7687fb9c4f91 34 * <h2><center>&copy; COPYRIGHT(c) 2015 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****/