mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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