mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32l0xx_hal_flash_ex.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
Anna Bridge 186:707f6e361f3e 5 * @brief Extended FLASH HAL module driver.
Anna Bridge 186:707f6e361f3e 6 *
<> 144:ef7eb2e8f9f7 7 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 8 * functionalities of the internal FLASH memory:
<> 144:ef7eb2e8f9f7 9 * + FLASH Interface configuration
<> 144:ef7eb2e8f9f7 10 * + FLASH Memory Erasing
<> 144:ef7eb2e8f9f7 11 * + DATA EEPROM Programming/Erasing
<> 144:ef7eb2e8f9f7 12 * + Option Bytes Programming
<> 144:ef7eb2e8f9f7 13 * + Interrupts management
Anna Bridge 186:707f6e361f3e 14 *
Anna Bridge 186:707f6e361f3e 15 @verbatim
<> 144:ef7eb2e8f9f7 16 ==============================================================================
<> 144:ef7eb2e8f9f7 17 ##### Flash peripheral Extended features #####
<> 144:ef7eb2e8f9f7 18 ==============================================================================
<> 144:ef7eb2e8f9f7 19
<> 144:ef7eb2e8f9f7 20 [..] Comparing to other products, the FLASH interface for STM32L0xx
<> 144:ef7eb2e8f9f7 21 devices contains the following additional features
<> 144:ef7eb2e8f9f7 22 (+) Erase functions
<> 144:ef7eb2e8f9f7 23 (+) DATA_EEPROM memory management
<> 144:ef7eb2e8f9f7 24 (+) BOOT option bit configuration
<> 144:ef7eb2e8f9f7 25 (+) PCROP protection for all sectors
<> 144:ef7eb2e8f9f7 26
<> 144:ef7eb2e8f9f7 27 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 28 ==============================================================================
<> 144:ef7eb2e8f9f7 29 [..] This driver provides functions to configure and program the FLASH memory
Anna Bridge 186:707f6e361f3e 30 of all STM32L0xx. It includes:
<> 144:ef7eb2e8f9f7 31 (+) Full DATA_EEPROM erase and program management
<> 144:ef7eb2e8f9f7 32 (+) Boot activation
Anna Bridge 186:707f6e361f3e 33 (+) PCROP protection configuration and control for all pages
<> 144:ef7eb2e8f9f7 34
<> 144:ef7eb2e8f9f7 35 @endverbatim
<> 144:ef7eb2e8f9f7 36 ******************************************************************************
<> 144:ef7eb2e8f9f7 37 * @attention
<> 144:ef7eb2e8f9f7 38 *
<> 144:ef7eb2e8f9f7 39 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 40 *
<> 144:ef7eb2e8f9f7 41 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 42 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 43 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 44 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 45 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 46 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 47 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 48 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 49 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 50 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 51 *
<> 144:ef7eb2e8f9f7 52 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 53 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 55 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 58 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 59 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 60 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 61 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 62 *
Anna Bridge 186:707f6e361f3e 63 ******************************************************************************
<> 144:ef7eb2e8f9f7 64 */
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 67 #include "stm32l0xx_hal.h"
<> 144:ef7eb2e8f9f7 68
<> 144:ef7eb2e8f9f7 69 /** @addtogroup STM32L0xx_HAL_Driver
<> 144:ef7eb2e8f9f7 70 * @{
<> 144:ef7eb2e8f9f7 71 */
<> 144:ef7eb2e8f9f7 72 #ifdef HAL_FLASH_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 73
Anna Bridge 186:707f6e361f3e 74 /** @addtogroup FLASH
Anna Bridge 186:707f6e361f3e 75 * @{
Anna Bridge 186:707f6e361f3e 76 */
Anna Bridge 186:707f6e361f3e 77 /** @addtogroup FLASH_Private_Variables
Anna Bridge 186:707f6e361f3e 78 * @{
Anna Bridge 186:707f6e361f3e 79 */
Anna Bridge 186:707f6e361f3e 80 /* Variables used for Erase pages under interruption*/
Anna Bridge 186:707f6e361f3e 81 extern FLASH_ProcessTypeDef pFlash;
Anna Bridge 186:707f6e361f3e 82 /**
Anna Bridge 186:707f6e361f3e 83 * @}
Anna Bridge 186:707f6e361f3e 84 */
Anna Bridge 186:707f6e361f3e 85
Anna Bridge 186:707f6e361f3e 86 /**
Anna Bridge 186:707f6e361f3e 87 * @}
Anna Bridge 186:707f6e361f3e 88 */
Anna Bridge 186:707f6e361f3e 89
Anna Bridge 186:707f6e361f3e 90 /** @defgroup FLASHEx FLASHEx
<> 144:ef7eb2e8f9f7 91 * @brief FLASH HAL Extension module driver
<> 144:ef7eb2e8f9f7 92 * @{
<> 144:ef7eb2e8f9f7 93 */
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 96 /* Private define ------------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 97 /** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants
Anna Bridge 186:707f6e361f3e 98 * @{
Anna Bridge 186:707f6e361f3e 99 */
<> 144:ef7eb2e8f9f7 100 /**
<> 144:ef7eb2e8f9f7 101 * @}
<> 144:ef7eb2e8f9f7 102 */
Anna Bridge 186:707f6e361f3e 103
Anna Bridge 186:707f6e361f3e 104 /* Private macro -------------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 105 /** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros
Anna Bridge 186:707f6e361f3e 106 * @{
Anna Bridge 186:707f6e361f3e 107 */
Anna Bridge 186:707f6e361f3e 108 /**
Anna Bridge 186:707f6e361f3e 109 * @}
Anna Bridge 186:707f6e361f3e 110 */
Anna Bridge 186:707f6e361f3e 111
Anna Bridge 186:707f6e361f3e 112 /* Private variables ---------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 113 /* Private function prototypes -----------------------------------------------*/
Anna Bridge 186:707f6e361f3e 114 /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions
Anna Bridge 186:707f6e361f3e 115 * @{
Anna Bridge 186:707f6e361f3e 116 */
Anna Bridge 186:707f6e361f3e 117 void FLASH_PageErase(uint32_t PageAddress);
Anna Bridge 186:707f6e361f3e 118 #if defined(FLASH_OPTR_BFB2)
Anna Bridge 186:707f6e361f3e 119 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t OB_BOOT);
Anna Bridge 186:707f6e361f3e 120 #endif /* FLASH_OPTR_BFB2 */
Anna Bridge 186:707f6e361f3e 121 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint8_t OB_RDP);
Anna Bridge 186:707f6e361f3e 122 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY);
Anna Bridge 186:707f6e361f3e 123 static HAL_StatusTypeDef FLASH_OB_BORConfig(uint8_t OB_BOR);
Anna Bridge 186:707f6e361f3e 124 static uint8_t FLASH_OB_GetRDP(void);
Anna Bridge 186:707f6e361f3e 125 static uint8_t FLASH_OB_GetUser(void);
Anna Bridge 186:707f6e361f3e 126 static uint8_t FLASH_OB_GetBOR(void);
Anna Bridge 186:707f6e361f3e 127 static uint8_t FLASH_OB_GetBOOTBit1(void);
Anna Bridge 186:707f6e361f3e 128 static HAL_StatusTypeDef FLASH_OB_BOOTBit1Config(uint8_t OB_BootBit1);
Anna Bridge 186:707f6e361f3e 129 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
Anna Bridge 186:707f6e361f3e 130 static HAL_StatusTypeDef FLASH_OB_ProtectedSectorsConfig(uint32_t Sector, uint32_t Sector2, uint32_t NewState);
Anna Bridge 186:707f6e361f3e 131 #else
Anna Bridge 186:707f6e361f3e 132 static HAL_StatusTypeDef FLASH_OB_ProtectedSectorsConfig(uint32_t Sector, uint32_t NewState);
Anna Bridge 186:707f6e361f3e 133 #endif
Anna Bridge 186:707f6e361f3e 134 static uint32_t FLASH_OB_GetWRP(void);
Anna Bridge 186:707f6e361f3e 135 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
Anna Bridge 186:707f6e361f3e 136 static uint32_t FLASH_OB_GetWRP2(void);
Anna Bridge 186:707f6e361f3e 137 #endif
Anna Bridge 186:707f6e361f3e 138
Anna Bridge 186:707f6e361f3e 139 /**
Anna Bridge 186:707f6e361f3e 140 * @}
Anna Bridge 186:707f6e361f3e 141 */
Anna Bridge 186:707f6e361f3e 142
<> 144:ef7eb2e8f9f7 143 /* Exported functions ---------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 144 /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions
<> 144:ef7eb2e8f9f7 145 * @{
<> 144:ef7eb2e8f9f7 146 */
<> 144:ef7eb2e8f9f7 147
Anna Bridge 186:707f6e361f3e 148 /** @defgroup FLASHEx_Exported_Functions_Group1 FLASHEx Memory Erasing functions
<> 144:ef7eb2e8f9f7 149 * @brief FLASH Memory Erasing functions
<> 144:ef7eb2e8f9f7 150 *
<> 144:ef7eb2e8f9f7 151 @verbatim
<> 144:ef7eb2e8f9f7 152 ==============================================================================
<> 144:ef7eb2e8f9f7 153 ##### FLASH Erasing Programming functions #####
<> 144:ef7eb2e8f9f7 154 ==============================================================================
<> 144:ef7eb2e8f9f7 155
<> 144:ef7eb2e8f9f7 156 [..] The FLASH Memory Erasing functions, includes the following functions:
Anna Bridge 186:707f6e361f3e 157 (+) @ref HAL_FLASHEx_Erase: return only when erase has been done
Anna Bridge 186:707f6e361f3e 158 (+) @ref HAL_FLASHEx_Erase_IT: end of erase is done when @ref HAL_FLASH_EndOfOperationCallback
Anna Bridge 186:707f6e361f3e 159 is called with parameter 0xFFFFFFFF
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 [..] Any operation of erase should follow these steps:
Anna Bridge 186:707f6e361f3e 162 (#) Call the @ref HAL_FLASH_Unlock() function to enable the flash control register and
<> 144:ef7eb2e8f9f7 163 program memory access.
<> 144:ef7eb2e8f9f7 164 (#) Call the desired function to erase page.
Anna Bridge 186:707f6e361f3e 165 (#) Call the @ref HAL_FLASH_Lock() to disable the flash program memory access
<> 144:ef7eb2e8f9f7 166 (recommended to protect the FLASH memory against possible unwanted operation).
<> 144:ef7eb2e8f9f7 167
<> 144:ef7eb2e8f9f7 168 @endverbatim
<> 144:ef7eb2e8f9f7 169 * @{
<> 144:ef7eb2e8f9f7 170 */
Anna Bridge 186:707f6e361f3e 171
<> 144:ef7eb2e8f9f7 172 /**
<> 144:ef7eb2e8f9f7 173 * @brief Erase the specified FLASH memory Pages
Anna Bridge 186:707f6e361f3e 174 * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function
<> 144:ef7eb2e8f9f7 175 * must be called before.
Anna Bridge 186:707f6e361f3e 176 * Call the @ref HAL_FLASH_Lock() to disable the flash memory access
<> 144:ef7eb2e8f9f7 177 * (recommended to protect the FLASH memory against possible unwanted operation)
Anna Bridge 186:707f6e361f3e 178 * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that
<> 144:ef7eb2e8f9f7 179 * contains the configuration information for the erasing.
<> 144:ef7eb2e8f9f7 180 *
Anna Bridge 186:707f6e361f3e 181 * @param[out] PageError pointer to variable that
Anna Bridge 186:707f6e361f3e 182 * contains the configuration information on faulty page in case of error
Anna Bridge 186:707f6e361f3e 183 * (0xFFFFFFFF means that all the pages have been correctly erased)
<> 144:ef7eb2e8f9f7 184 *
<> 144:ef7eb2e8f9f7 185 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 186 */
<> 144:ef7eb2e8f9f7 187 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
<> 144:ef7eb2e8f9f7 188 {
<> 144:ef7eb2e8f9f7 189 HAL_StatusTypeDef status = HAL_ERROR;
Anna Bridge 186:707f6e361f3e 190 uint32_t address = 0U;
<> 144:ef7eb2e8f9f7 191
<> 144:ef7eb2e8f9f7 192 /* Process Locked */
Anna Bridge 186:707f6e361f3e 193 __HAL_LOCK(&pFlash);
<> 144:ef7eb2e8f9f7 194
<> 144:ef7eb2e8f9f7 195 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 196 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 197
<> 144:ef7eb2e8f9f7 198 if (status == HAL_OK)
<> 144:ef7eb2e8f9f7 199 {
<> 144:ef7eb2e8f9f7 200 /*Initialization of PageError variable*/
<> 151:5eaa88a5bcc7 201 *PageError = 0xFFFFFFFFU;
Anna Bridge 186:707f6e361f3e 202
<> 144:ef7eb2e8f9f7 203 /* Check the parameters */
<> 144:ef7eb2e8f9f7 204 assert_param(IS_NBPAGES(pEraseInit->NbPages));
<> 144:ef7eb2e8f9f7 205 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
<> 144:ef7eb2e8f9f7 206 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
Anna Bridge 186:707f6e361f3e 207 assert_param(IS_FLASH_PROGRAM_ADDRESS((pEraseInit->PageAddress & ~(FLASH_PAGE_SIZE - 1U)) + pEraseInit->NbPages * FLASH_PAGE_SIZE - 1U));
<> 144:ef7eb2e8f9f7 208
Anna Bridge 186:707f6e361f3e 209 /* Erase page by page to be done*/
Anna Bridge 186:707f6e361f3e 210 for(address = pEraseInit->PageAddress;
Anna Bridge 186:707f6e361f3e 211 address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress);
Anna Bridge 186:707f6e361f3e 212 address += FLASH_PAGE_SIZE)
Anna Bridge 186:707f6e361f3e 213 {
Anna Bridge 186:707f6e361f3e 214 FLASH_PageErase(address);
<> 144:ef7eb2e8f9f7 215
<> 144:ef7eb2e8f9f7 216 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 217 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 218
<> 144:ef7eb2e8f9f7 219 /* If the erase operation is completed, disable the ERASE Bit */
<> 144:ef7eb2e8f9f7 220 CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
<> 144:ef7eb2e8f9f7 221 CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
<> 144:ef7eb2e8f9f7 222
<> 144:ef7eb2e8f9f7 223 if (status != HAL_OK)
<> 144:ef7eb2e8f9f7 224 {
Anna Bridge 186:707f6e361f3e 225 /* In case of error, stop erase procedure and return the faulty address */
Anna Bridge 186:707f6e361f3e 226 *PageError = address;
<> 144:ef7eb2e8f9f7 227 break;
<> 144:ef7eb2e8f9f7 228 }
<> 144:ef7eb2e8f9f7 229 }
<> 144:ef7eb2e8f9f7 230 }
<> 144:ef7eb2e8f9f7 231
<> 144:ef7eb2e8f9f7 232 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 233 __HAL_UNLOCK(&pFlash);
<> 144:ef7eb2e8f9f7 234
<> 144:ef7eb2e8f9f7 235 return status;
<> 144:ef7eb2e8f9f7 236 }
<> 144:ef7eb2e8f9f7 237
<> 144:ef7eb2e8f9f7 238 /**
<> 144:ef7eb2e8f9f7 239 * @brief Perform a page erase of the specified FLASH memory pages with interrupt enabled
Anna Bridge 186:707f6e361f3e 240 * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function
<> 144:ef7eb2e8f9f7 241 * must be called before.
Anna Bridge 186:707f6e361f3e 242 * Call the @ref HAL_FLASH_Lock() to disable the flash memory access
Anna Bridge 186:707f6e361f3e 243 * (recommended to protect the FLASH memory against possible unwanted operation)
Anna Bridge 186:707f6e361f3e 244 * End of erase is done when @ref HAL_FLASH_EndOfOperationCallback is called with parameter
Anna Bridge 186:707f6e361f3e 245 * 0xFFFFFFFF
Anna Bridge 186:707f6e361f3e 246 * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that
<> 144:ef7eb2e8f9f7 247 * contains the configuration information for the erasing.
<> 144:ef7eb2e8f9f7 248 *
<> 144:ef7eb2e8f9f7 249 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 250 */
<> 144:ef7eb2e8f9f7 251 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
<> 144:ef7eb2e8f9f7 252 {
Anna Bridge 186:707f6e361f3e 253 HAL_StatusTypeDef status = HAL_ERROR;
Anna Bridge 186:707f6e361f3e 254
Anna Bridge 186:707f6e361f3e 255 /* If procedure already ongoing, reject the next one */
Anna Bridge 186:707f6e361f3e 256 if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
Anna Bridge 186:707f6e361f3e 257 {
Anna Bridge 186:707f6e361f3e 258 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 259 }
Anna Bridge 186:707f6e361f3e 260
Anna Bridge 186:707f6e361f3e 261 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 262 assert_param(IS_NBPAGES(pEraseInit->NbPages));
Anna Bridge 186:707f6e361f3e 263 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
Anna Bridge 186:707f6e361f3e 264 assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
Anna Bridge 186:707f6e361f3e 265 assert_param(IS_FLASH_PROGRAM_ADDRESS((pEraseInit->PageAddress & ~(FLASH_PAGE_SIZE - 1)) + pEraseInit->NbPages * FLASH_PAGE_SIZE - 1));
<> 144:ef7eb2e8f9f7 266
<> 144:ef7eb2e8f9f7 267 /* Process Locked */
Anna Bridge 186:707f6e361f3e 268 __HAL_LOCK(&pFlash);
<> 144:ef7eb2e8f9f7 269
<> 144:ef7eb2e8f9f7 270 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 271 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 272
<> 144:ef7eb2e8f9f7 273 if (status == HAL_OK)
<> 144:ef7eb2e8f9f7 274 {
Anna Bridge 186:707f6e361f3e 275 /* Enable End of FLASH Operation and Error source interrupts */
Anna Bridge 186:707f6e361f3e 276 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
<> 144:ef7eb2e8f9f7 277
Anna Bridge 186:707f6e361f3e 278 pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE;
Anna Bridge 186:707f6e361f3e 279 pFlash.NbPagesToErase = pEraseInit->NbPages;
Anna Bridge 186:707f6e361f3e 280 pFlash.Page = pEraseInit->PageAddress;
Anna Bridge 186:707f6e361f3e 281
Anna Bridge 186:707f6e361f3e 282 /*Erase 1st page and wait for IT*/
Anna Bridge 186:707f6e361f3e 283 FLASH_PageErase(pEraseInit->PageAddress);
<> 144:ef7eb2e8f9f7 284 }
Anna Bridge 186:707f6e361f3e 285 else
Anna Bridge 186:707f6e361f3e 286 {
Anna Bridge 186:707f6e361f3e 287 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 288 __HAL_UNLOCK(&pFlash);
Anna Bridge 186:707f6e361f3e 289 }
Anna Bridge 186:707f6e361f3e 290
<> 144:ef7eb2e8f9f7 291 return status;
<> 144:ef7eb2e8f9f7 292 }
<> 144:ef7eb2e8f9f7 293
<> 144:ef7eb2e8f9f7 294 /**
<> 144:ef7eb2e8f9f7 295 * @}
<> 144:ef7eb2e8f9f7 296 */
<> 144:ef7eb2e8f9f7 297
Anna Bridge 186:707f6e361f3e 298 /** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions
Anna Bridge 186:707f6e361f3e 299 * @brief Option Bytes Programming functions
<> 144:ef7eb2e8f9f7 300 *
<> 144:ef7eb2e8f9f7 301 @verbatim
<> 144:ef7eb2e8f9f7 302 ==============================================================================
<> 144:ef7eb2e8f9f7 303 ##### Option Bytes Programming functions #####
<> 144:ef7eb2e8f9f7 304 ==============================================================================
<> 144:ef7eb2e8f9f7 305
<> 144:ef7eb2e8f9f7 306 [..] Any operation of erase or program should follow these steps:
Anna Bridge 186:707f6e361f3e 307 (#) Call the @ref HAL_FLASH_OB_Unlock() function to enable the Flash option control
<> 144:ef7eb2e8f9f7 308 register access.
<> 144:ef7eb2e8f9f7 309 (#) Call following function to program the desired option bytes.
Anna Bridge 186:707f6e361f3e 310 (++) @ref HAL_FLASHEx_OBProgram:
<> 144:ef7eb2e8f9f7 311 - To Enable/Disable the desired sector write protection.
<> 144:ef7eb2e8f9f7 312 - To set the desired read Protection Level.
<> 144:ef7eb2e8f9f7 313 - To configure the user option Bytes: IWDG, STOP and the Standby.
<> 144:ef7eb2e8f9f7 314 - To Set the BOR level.
<> 144:ef7eb2e8f9f7 315 (#) Once all needed option bytes to be programmed are correctly written, call the
Anna Bridge 186:707f6e361f3e 316 @ref HAL_FLASH_OB_Launch(void) function to launch the Option Bytes programming process.
Anna Bridge 186:707f6e361f3e 317 (#) Call the @ref HAL_FLASH_OB_Lock() to disable the Flash option control register access (recommended
<> 144:ef7eb2e8f9f7 318 to protect the option Bytes against possible unwanted operations).
<> 144:ef7eb2e8f9f7 319
Anna Bridge 186:707f6e361f3e 320 [..] Proprietary code Read Out Protection (PcROP):
<> 144:ef7eb2e8f9f7 321 (#) The PcROP sector is selected by using the same option bytes as the Write
<> 144:ef7eb2e8f9f7 322 protection (nWRPi bits). As a result, these 2 options are exclusive each other.
<> 144:ef7eb2e8f9f7 323 (#) In order to activate the PcROP (change the function of the nWRPi option bits),
<> 144:ef7eb2e8f9f7 324 the WPRMOD option bit must be activated.
<> 144:ef7eb2e8f9f7 325 (#) The active value of nWRPi bits is inverted when PCROP mode is active, this
<> 144:ef7eb2e8f9f7 326 means: if WPRMOD = 1 and nWRPi = 1 (default value), then the user sector "i"
<> 144:ef7eb2e8f9f7 327 is read/write protected.
<> 144:ef7eb2e8f9f7 328 (#) To activate PCROP mode for Flash sector(s), you need to call the following function:
Anna Bridge 186:707f6e361f3e 329 (++) @ref HAL_FLASHEx_AdvOBProgram in selecting sectors to be read/write protected
Anna Bridge 186:707f6e361f3e 330 (++) @ref HAL_FLASHEx_OB_SelectPCROP to enable the read/write protection
Anna Bridge 186:707f6e361f3e 331
<> 144:ef7eb2e8f9f7 332 @endverbatim
<> 144:ef7eb2e8f9f7 333 * @{
<> 144:ef7eb2e8f9f7 334 */
<> 144:ef7eb2e8f9f7 335
<> 144:ef7eb2e8f9f7 336 /**
<> 144:ef7eb2e8f9f7 337 * @brief Program option bytes
Anna Bridge 186:707f6e361f3e 338 * @param pOBInit pointer to an FLASH_OBInitStruct structure that
<> 144:ef7eb2e8f9f7 339 * contains the configuration information for the programming.
<> 144:ef7eb2e8f9f7 340 *
<> 144:ef7eb2e8f9f7 341 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 342 */
<> 144:ef7eb2e8f9f7 343 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
<> 144:ef7eb2e8f9f7 344 {
<> 144:ef7eb2e8f9f7 345 HAL_StatusTypeDef status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 346
<> 144:ef7eb2e8f9f7 347 /* Process Locked */
Anna Bridge 186:707f6e361f3e 348 __HAL_LOCK(&pFlash);
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350 /* Check the parameters */
<> 144:ef7eb2e8f9f7 351 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
<> 144:ef7eb2e8f9f7 352
Anna Bridge 186:707f6e361f3e 353 /*Write protection configuration*/
<> 144:ef7eb2e8f9f7 354 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
<> 144:ef7eb2e8f9f7 355 {
<> 144:ef7eb2e8f9f7 356 assert_param(IS_WRPSTATE(pOBInit->WRPState));
<> 144:ef7eb2e8f9f7 357 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 358 status = FLASH_OB_ProtectedSectorsConfig(pOBInit->WRPSector, pOBInit->WRPSector2, pOBInit->WRPState);
<> 144:ef7eb2e8f9f7 359 #else
<> 144:ef7eb2e8f9f7 360 status = FLASH_OB_ProtectedSectorsConfig(pOBInit->WRPSector, pOBInit->WRPState);
Anna Bridge 186:707f6e361f3e 361 #endif
<> 144:ef7eb2e8f9f7 362 if (status != HAL_OK)
<> 144:ef7eb2e8f9f7 363 {
<> 144:ef7eb2e8f9f7 364 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 365 __HAL_UNLOCK(&pFlash);
<> 144:ef7eb2e8f9f7 366 return status;
<> 144:ef7eb2e8f9f7 367 }
<> 144:ef7eb2e8f9f7 368 }
Anna Bridge 186:707f6e361f3e 369
Anna Bridge 186:707f6e361f3e 370 /* Read protection configuration*/
<> 144:ef7eb2e8f9f7 371 if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP)
<> 144:ef7eb2e8f9f7 372 {
<> 144:ef7eb2e8f9f7 373 status = FLASH_OB_RDPConfig(pOBInit->RDPLevel);
<> 144:ef7eb2e8f9f7 374 if (status != HAL_OK)
<> 144:ef7eb2e8f9f7 375 {
<> 144:ef7eb2e8f9f7 376 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 377 __HAL_UNLOCK(&pFlash);
<> 144:ef7eb2e8f9f7 378 return status;
<> 144:ef7eb2e8f9f7 379 }
<> 144:ef7eb2e8f9f7 380 }
Anna Bridge 186:707f6e361f3e 381
Anna Bridge 186:707f6e361f3e 382 /* USER configuration*/
<> 144:ef7eb2e8f9f7 383 if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER)
<> 144:ef7eb2e8f9f7 384 {
<> 144:ef7eb2e8f9f7 385 status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW,
<> 144:ef7eb2e8f9f7 386 pOBInit->USERConfig & OB_STOP_NORST,
<> 144:ef7eb2e8f9f7 387 pOBInit->USERConfig & OB_STDBY_NORST);
<> 144:ef7eb2e8f9f7 388 if (status != HAL_OK)
<> 144:ef7eb2e8f9f7 389 {
<> 144:ef7eb2e8f9f7 390 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 391 __HAL_UNLOCK(&pFlash);
<> 144:ef7eb2e8f9f7 392 return status;
<> 144:ef7eb2e8f9f7 393 }
<> 144:ef7eb2e8f9f7 394 }
<> 144:ef7eb2e8f9f7 395
Anna Bridge 186:707f6e361f3e 396 /* BOR Level configuration*/
<> 144:ef7eb2e8f9f7 397 if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
<> 144:ef7eb2e8f9f7 398 {
<> 144:ef7eb2e8f9f7 399 status = FLASH_OB_BORConfig(pOBInit->BORLevel);
Anna Bridge 186:707f6e361f3e 400 if (status != HAL_OK)
Anna Bridge 186:707f6e361f3e 401 {
Anna Bridge 186:707f6e361f3e 402 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 403 __HAL_UNLOCK(&pFlash);
Anna Bridge 186:707f6e361f3e 404 return status;
Anna Bridge 186:707f6e361f3e 405 }
Anna Bridge 186:707f6e361f3e 406 }
<> 144:ef7eb2e8f9f7 407
<> 144:ef7eb2e8f9f7 408 /* Program BOOT Bit1 config option byte */
<> 144:ef7eb2e8f9f7 409 if ((pOBInit->OptionType & OPTIONBYTE_BOOT_BIT1) == OPTIONBYTE_BOOT_BIT1)
<> 144:ef7eb2e8f9f7 410 {
<> 144:ef7eb2e8f9f7 411 status = FLASH_OB_BOOTBit1Config(pOBInit->BOOTBit1Config);
<> 144:ef7eb2e8f9f7 412 }
Anna Bridge 186:707f6e361f3e 413 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 414 __HAL_UNLOCK(&pFlash);
<> 144:ef7eb2e8f9f7 415
<> 144:ef7eb2e8f9f7 416 return status;
<> 144:ef7eb2e8f9f7 417 }
<> 144:ef7eb2e8f9f7 418
<> 144:ef7eb2e8f9f7 419 /**
<> 144:ef7eb2e8f9f7 420 * @brief Get the Option byte configuration
Anna Bridge 186:707f6e361f3e 421 * @param pOBInit pointer to an FLASH_OBInitStruct structure that
<> 144:ef7eb2e8f9f7 422 * contains the configuration information for the programming.
<> 144:ef7eb2e8f9f7 423 *
<> 144:ef7eb2e8f9f7 424 * @retval None
<> 144:ef7eb2e8f9f7 425 */
<> 144:ef7eb2e8f9f7 426 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
<> 144:ef7eb2e8f9f7 427 {
<> 144:ef7eb2e8f9f7 428 pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR;
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 /* Get WRP sector */
<> 144:ef7eb2e8f9f7 431 pOBInit->WRPSector = FLASH_OB_GetWRP();
<> 144:ef7eb2e8f9f7 432
<> 144:ef7eb2e8f9f7 433 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 434 pOBInit->WRPSector2 = FLASH_OB_GetWRP2();
<> 144:ef7eb2e8f9f7 435 #endif
<> 144:ef7eb2e8f9f7 436
Anna Bridge 186:707f6e361f3e 437 /*Get RDP Level*/
Anna Bridge 186:707f6e361f3e 438 pOBInit->RDPLevel = FLASH_OB_GetRDP();
<> 144:ef7eb2e8f9f7 439
Anna Bridge 186:707f6e361f3e 440 /*Get USER*/
<> 144:ef7eb2e8f9f7 441 pOBInit->USERConfig = FLASH_OB_GetUser();
<> 144:ef7eb2e8f9f7 442
Anna Bridge 186:707f6e361f3e 443 /*Get BOR Level*/
Anna Bridge 186:707f6e361f3e 444 pOBInit->BORLevel = FLASH_OB_GetBOR();
Anna Bridge 186:707f6e361f3e 445
<> 144:ef7eb2e8f9f7 446 /* Get BOOT bit 1 config OB */
<> 144:ef7eb2e8f9f7 447 pOBInit->BOOTBit1Config = FLASH_OB_GetBOOTBit1();
<> 144:ef7eb2e8f9f7 448 }
<> 144:ef7eb2e8f9f7 449
Anna Bridge 186:707f6e361f3e 450 #if defined(FLASH_OPTR_WPRMOD) || defined(FLASH_OPTR_BFB2)
Anna Bridge 186:707f6e361f3e 451
<> 144:ef7eb2e8f9f7 452 /**
<> 144:ef7eb2e8f9f7 453 * @brief Program option bytes
Anna Bridge 186:707f6e361f3e 454 * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that
<> 144:ef7eb2e8f9f7 455 * contains the configuration information for the programming.
<> 144:ef7eb2e8f9f7 456 *
<> 144:ef7eb2e8f9f7 457 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 458 */
<> 144:ef7eb2e8f9f7 459 HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
<> 144:ef7eb2e8f9f7 460 {
<> 144:ef7eb2e8f9f7 461 HAL_StatusTypeDef status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 462
<> 144:ef7eb2e8f9f7 463 /* Check the parameters */
<> 144:ef7eb2e8f9f7 464 assert_param(IS_OBEX(pAdvOBInit->OptionType));
<> 144:ef7eb2e8f9f7 465
Anna Bridge 186:707f6e361f3e 466 #if defined(FLASH_OPTR_WPRMOD)
Anna Bridge 186:707f6e361f3e 467
Anna Bridge 186:707f6e361f3e 468 /* Program PCROP option byte*/
<> 144:ef7eb2e8f9f7 469 if ((pAdvOBInit->OptionType & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP)
<> 144:ef7eb2e8f9f7 470 {
<> 144:ef7eb2e8f9f7 471 /* Check the parameters */
<> 144:ef7eb2e8f9f7 472 assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState));
<> 144:ef7eb2e8f9f7 473 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 474 status = FLASH_OB_ProtectedSectorsConfig(pAdvOBInit->PCROPSector, pAdvOBInit->PCROPSector2, pAdvOBInit->PCROPState);
<> 144:ef7eb2e8f9f7 475 #else
<> 144:ef7eb2e8f9f7 476 status = FLASH_OB_ProtectedSectorsConfig(pAdvOBInit->PCROPSector, pAdvOBInit->PCROPState);
<> 144:ef7eb2e8f9f7 477 #endif
<> 144:ef7eb2e8f9f7 478 }
Anna Bridge 186:707f6e361f3e 479
Anna Bridge 186:707f6e361f3e 480 #endif /* FLASH_OPTR_WPRMOD */
Anna Bridge 186:707f6e361f3e 481
Anna Bridge 186:707f6e361f3e 482 #if defined(FLASH_OPTR_BFB2)
Anna Bridge 186:707f6e361f3e 483
Anna Bridge 186:707f6e361f3e 484 /* Program BOOT config option byte */
<> 144:ef7eb2e8f9f7 485 if ((pAdvOBInit->OptionType & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG)
<> 144:ef7eb2e8f9f7 486 {
Anna Bridge 186:707f6e361f3e 487 status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig);
<> 144:ef7eb2e8f9f7 488 }
Anna Bridge 186:707f6e361f3e 489
Anna Bridge 186:707f6e361f3e 490 #endif /* FLASH_OPTR_BFB2 */
<> 144:ef7eb2e8f9f7 491
<> 144:ef7eb2e8f9f7 492 return status;
<> 144:ef7eb2e8f9f7 493 }
<> 144:ef7eb2e8f9f7 494
<> 144:ef7eb2e8f9f7 495 /**
Anna Bridge 186:707f6e361f3e 496 * @brief Get the OBEX byte configuration
Anna Bridge 186:707f6e361f3e 497 * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that
<> 144:ef7eb2e8f9f7 498 * contains the configuration information for the programming.
<> 144:ef7eb2e8f9f7 499 *
<> 144:ef7eb2e8f9f7 500 * @retval None
<> 144:ef7eb2e8f9f7 501 */
<> 144:ef7eb2e8f9f7 502 void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit)
<> 144:ef7eb2e8f9f7 503 {
Anna Bridge 186:707f6e361f3e 504 pAdvOBInit->OptionType = 0;
Anna Bridge 186:707f6e361f3e 505
Anna Bridge 186:707f6e361f3e 506 #if defined(FLASH_OPTR_WPRMOD)
Anna Bridge 186:707f6e361f3e 507
Anna Bridge 186:707f6e361f3e 508 pAdvOBInit->OptionType |= OPTIONBYTE_PCROP;
Anna Bridge 186:707f6e361f3e 509
Anna Bridge 186:707f6e361f3e 510
<> 144:ef7eb2e8f9f7 511 /* Get PCROP state */
Anna Bridge 186:707f6e361f3e 512 pAdvOBInit->PCROPState = (FLASH->OPTR & FLASH_OPTR_WPRMOD) >> FLASH_OPTR_WPRMOD_Pos;
<> 144:ef7eb2e8f9f7 513 /* Get PCROP protected sector */
<> 144:ef7eb2e8f9f7 514 pAdvOBInit->PCROPSector = FLASH->WRPR;
<> 144:ef7eb2e8f9f7 515
<> 144:ef7eb2e8f9f7 516 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 517 /* Get PCROP protected sector */
<> 144:ef7eb2e8f9f7 518 pAdvOBInit->PCROPSector2 = FLASH->WRPR2;
Anna Bridge 186:707f6e361f3e 519 #endif
Anna Bridge 186:707f6e361f3e 520 #endif /* FLASH_OPTR_WPRMOD */
<> 144:ef7eb2e8f9f7 521
Anna Bridge 186:707f6e361f3e 522 #if defined(FLASH_OPTR_BFB2)
Anna Bridge 186:707f6e361f3e 523
Anna Bridge 186:707f6e361f3e 524 pAdvOBInit->OptionType |= OPTIONBYTE_BOOTCONFIG;
Anna Bridge 186:707f6e361f3e 525
Anna Bridge 186:707f6e361f3e 526 /* Get Boot config OB */
Anna Bridge 186:707f6e361f3e 527 pAdvOBInit->BootConfig = (FLASH->OPTR & FLASH_OPTR_BFB2) >> 16U;
Anna Bridge 186:707f6e361f3e 528
Anna Bridge 186:707f6e361f3e 529 #endif /* FLASH_OPTR_BFB2 */
<> 144:ef7eb2e8f9f7 530 }
<> 144:ef7eb2e8f9f7 531
Anna Bridge 186:707f6e361f3e 532 #endif /* FLASH_OPTR_WPRMOD || FLASH_OPTR_BFB2 */
Anna Bridge 186:707f6e361f3e 533
Anna Bridge 186:707f6e361f3e 534 #if defined(FLASH_OPTR_WPRMOD)
Anna Bridge 186:707f6e361f3e 535
<> 144:ef7eb2e8f9f7 536 /**
<> 144:ef7eb2e8f9f7 537 * @brief Select the Protection Mode (WPRMOD).
<> 144:ef7eb2e8f9f7 538 * @note Once WPRMOD bit is active, unprotection of a protected sector is not possible
<> 144:ef7eb2e8f9f7 539 * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
<> 144:ef7eb2e8f9f7 540 * @retval HAL status
<> 144:ef7eb2e8f9f7 541 */
<> 144:ef7eb2e8f9f7 542 HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void)
<> 144:ef7eb2e8f9f7 543 {
Anna Bridge 186:707f6e361f3e 544 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 545 uint16_t tmp1 = 0;
Anna Bridge 186:707f6e361f3e 546 uint32_t tmp2 = 0;
Anna Bridge 186:707f6e361f3e 547 uint8_t optiontmp = 0;
Anna Bridge 186:707f6e361f3e 548 uint16_t optiontmp2 = 0;
Anna Bridge 186:707f6e361f3e 549
Anna Bridge 186:707f6e361f3e 550 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 551
Anna Bridge 186:707f6e361f3e 552 /* Mask RDP Byte */
Anna Bridge 186:707f6e361f3e 553 optiontmp = (uint8_t)(*(__IO uint8_t *)(OB_BASE));
Anna Bridge 186:707f6e361f3e 554
Anna Bridge 186:707f6e361f3e 555 /* Update Option Byte */
Anna Bridge 186:707f6e361f3e 556 optiontmp2 = (uint16_t)(OB_PCROP_SELECTED | optiontmp);
Anna Bridge 186:707f6e361f3e 557
Anna Bridge 186:707f6e361f3e 558 /* calculate the option byte to write */
Anna Bridge 186:707f6e361f3e 559 tmp1 = (uint16_t)(~(optiontmp2 ));
Anna Bridge 186:707f6e361f3e 560 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16U)) | ((uint32_t)optiontmp2));
Anna Bridge 186:707f6e361f3e 561
Anna Bridge 186:707f6e361f3e 562 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 563 {
Anna Bridge 186:707f6e361f3e 564 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 565 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 566
Anna Bridge 186:707f6e361f3e 567 /* program PCRop */
Anna Bridge 186:707f6e361f3e 568 OB->RDP = tmp2;
Anna Bridge 186:707f6e361f3e 569
Anna Bridge 186:707f6e361f3e 570 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 571 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 572 }
Anna Bridge 186:707f6e361f3e 573
Anna Bridge 186:707f6e361f3e 574 /* Return the Read protection operation Status */
Anna Bridge 186:707f6e361f3e 575 return status;
<> 144:ef7eb2e8f9f7 576 }
<> 144:ef7eb2e8f9f7 577
<> 144:ef7eb2e8f9f7 578 /**
<> 144:ef7eb2e8f9f7 579 * @brief Deselect the Protection Mode (WPRMOD).
<> 144:ef7eb2e8f9f7 580 * @note Once WPRMOD bit is active, unprotection of a protected sector is not possible
<> 144:ef7eb2e8f9f7 581 * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag
<> 144:ef7eb2e8f9f7 582 * @retval HAL status
<> 144:ef7eb2e8f9f7 583 */
<> 144:ef7eb2e8f9f7 584 HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void)
<> 144:ef7eb2e8f9f7 585 {
Anna Bridge 186:707f6e361f3e 586 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 587 uint16_t tmp1 = 0;
Anna Bridge 186:707f6e361f3e 588 uint32_t tmp2 = 0;
Anna Bridge 186:707f6e361f3e 589 uint8_t optiontmp = 0;
Anna Bridge 186:707f6e361f3e 590 uint16_t optiontmp2 = 0;
Anna Bridge 186:707f6e361f3e 591
Anna Bridge 186:707f6e361f3e 592 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 593
Anna Bridge 186:707f6e361f3e 594 /* Mask RDP Byte */
Anna Bridge 186:707f6e361f3e 595 optiontmp = (uint8_t)(*(__IO uint8_t *)(OB_BASE));
Anna Bridge 186:707f6e361f3e 596
Anna Bridge 186:707f6e361f3e 597 /* Update Option Byte */
Anna Bridge 186:707f6e361f3e 598 optiontmp2 = (uint16_t)(OB_PCROP_DESELECTED | optiontmp);
Anna Bridge 186:707f6e361f3e 599
Anna Bridge 186:707f6e361f3e 600 /* calculate the option byte to write */
Anna Bridge 186:707f6e361f3e 601 tmp1 = (uint16_t)(~(optiontmp2 ));
Anna Bridge 186:707f6e361f3e 602 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16U)) | ((uint32_t)optiontmp2));
Anna Bridge 186:707f6e361f3e 603
Anna Bridge 186:707f6e361f3e 604 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 605 {
Anna Bridge 186:707f6e361f3e 606 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 607 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 608
Anna Bridge 186:707f6e361f3e 609 /* program PCRop */
Anna Bridge 186:707f6e361f3e 610 OB->RDP = tmp2;
Anna Bridge 186:707f6e361f3e 611
Anna Bridge 186:707f6e361f3e 612 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 613 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 614 }
Anna Bridge 186:707f6e361f3e 615
Anna Bridge 186:707f6e361f3e 616 /* Return the Read protection operation Status */
Anna Bridge 186:707f6e361f3e 617 return status;
<> 144:ef7eb2e8f9f7 618 }
<> 144:ef7eb2e8f9f7 619
Anna Bridge 186:707f6e361f3e 620 #endif /* FLASH_OPTR_WPRMOD */
Anna Bridge 186:707f6e361f3e 621
<> 144:ef7eb2e8f9f7 622 /**
<> 144:ef7eb2e8f9f7 623 * @}
<> 144:ef7eb2e8f9f7 624 */
Anna Bridge 186:707f6e361f3e 625
Anna Bridge 186:707f6e361f3e 626 /** @defgroup FLASHEx_Exported_Functions_Group3 DATA EEPROM Programming functions
<> 144:ef7eb2e8f9f7 627 * @brief DATA EEPROM Programming functions
<> 144:ef7eb2e8f9f7 628 *
<> 144:ef7eb2e8f9f7 629 @verbatim
<> 144:ef7eb2e8f9f7 630 ===============================================================================
<> 144:ef7eb2e8f9f7 631 ##### DATA EEPROM Programming functions #####
<> 144:ef7eb2e8f9f7 632 ===============================================================================
<> 144:ef7eb2e8f9f7 633
<> 144:ef7eb2e8f9f7 634 [..] Any operation of erase or program should follow these steps:
Anna Bridge 186:707f6e361f3e 635 (#) Call the @ref HAL_FLASHEx_DATAEEPROM_Unlock() function to enable the data EEPROM access
<> 144:ef7eb2e8f9f7 636 and Flash program erase control register access.
<> 144:ef7eb2e8f9f7 637 (#) Call the desired function to erase or program data.
Anna Bridge 186:707f6e361f3e 638 (#) Call the @ref HAL_FLASHEx_DATAEEPROM_Lock() to disable the data EEPROM access
<> 144:ef7eb2e8f9f7 639 and Flash program erase control register access(recommended
<> 144:ef7eb2e8f9f7 640 to protect the DATA_EEPROM against possible unwanted operation).
<> 144:ef7eb2e8f9f7 641
<> 144:ef7eb2e8f9f7 642 @endverbatim
<> 144:ef7eb2e8f9f7 643 * @{
<> 144:ef7eb2e8f9f7 644 */
Anna Bridge 186:707f6e361f3e 645
<> 144:ef7eb2e8f9f7 646 /**
<> 144:ef7eb2e8f9f7 647 * @brief Unlocks the data memory and FLASH_PECR register access.
<> 144:ef7eb2e8f9f7 648 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 649 */
<> 144:ef7eb2e8f9f7 650 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Unlock(void)
<> 144:ef7eb2e8f9f7 651 {
<> 144:ef7eb2e8f9f7 652 if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
<> 144:ef7eb2e8f9f7 653 {
Anna Bridge 186:707f6e361f3e 654 /* Unlocking the Data memory and FLASH_PECR register access*/
<> 144:ef7eb2e8f9f7 655 FLASH->PEKEYR = FLASH_PEKEY1;
<> 144:ef7eb2e8f9f7 656 FLASH->PEKEYR = FLASH_PEKEY2;
<> 144:ef7eb2e8f9f7 657 }
<> 144:ef7eb2e8f9f7 658 else
<> 144:ef7eb2e8f9f7 659 {
<> 144:ef7eb2e8f9f7 660 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 661 }
Anna Bridge 186:707f6e361f3e 662 return HAL_OK;
<> 144:ef7eb2e8f9f7 663 }
<> 144:ef7eb2e8f9f7 664
<> 144:ef7eb2e8f9f7 665 /**
<> 144:ef7eb2e8f9f7 666 * @brief Locks the Data memory and FLASH_PECR register access.
<> 144:ef7eb2e8f9f7 667 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 668 */
<> 144:ef7eb2e8f9f7 669 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Lock(void)
<> 144:ef7eb2e8f9f7 670 {
<> 144:ef7eb2e8f9f7 671 /* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */
Anna Bridge 186:707f6e361f3e 672 SET_BIT(FLASH->PECR, FLASH_PECR_PELOCK);
Anna Bridge 186:707f6e361f3e 673
<> 144:ef7eb2e8f9f7 674 return HAL_OK;
<> 144:ef7eb2e8f9f7 675 }
Anna Bridge 186:707f6e361f3e 676
<> 144:ef7eb2e8f9f7 677 /**
<> 144:ef7eb2e8f9f7 678 * @brief Erase a word in data memory.
Anna Bridge 186:707f6e361f3e 679 * @param Address specifies the address to be erased.
Anna Bridge 186:707f6e361f3e 680 * @note To correctly run this function, the @ref HAL_FLASHEx_DATAEEPROM_Unlock() function
<> 144:ef7eb2e8f9f7 681 * must be called before.
Anna Bridge 186:707f6e361f3e 682 * Call the @ref HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access
<> 144:ef7eb2e8f9f7 683 * and Flash program erase control register access(recommended to protect
<> 144:ef7eb2e8f9f7 684 * the DATA_EEPROM against possible unwanted operation).
Anna Bridge 186:707f6e361f3e 685 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 686 */
<> 144:ef7eb2e8f9f7 687 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address)
<> 144:ef7eb2e8f9f7 688 {
<> 144:ef7eb2e8f9f7 689 HAL_StatusTypeDef status = HAL_OK;
<> 144:ef7eb2e8f9f7 690
<> 144:ef7eb2e8f9f7 691 /* Check the parameters */
<> 144:ef7eb2e8f9f7 692 assert_param(IS_FLASH_DATA_ADDRESS(Address));
<> 144:ef7eb2e8f9f7 693
<> 144:ef7eb2e8f9f7 694 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 695 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 696
<> 144:ef7eb2e8f9f7 697 if(status == HAL_OK)
<> 144:ef7eb2e8f9f7 698 {
<> 144:ef7eb2e8f9f7 699 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 700 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 701
Anna Bridge 186:707f6e361f3e 702 /* Write 00000000h to valid address in the data memory */
<> 151:5eaa88a5bcc7 703 *(__IO uint32_t *) Address = 0x00000000U;
<> 144:ef7eb2e8f9f7 704
<> 144:ef7eb2e8f9f7 705 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 706 }
Anna Bridge 186:707f6e361f3e 707
Anna Bridge 186:707f6e361f3e 708 /* Return the erase status */
<> 144:ef7eb2e8f9f7 709 return status;
<> 144:ef7eb2e8f9f7 710 }
<> 144:ef7eb2e8f9f7 711
<> 144:ef7eb2e8f9f7 712 /**
<> 144:ef7eb2e8f9f7 713 * @brief Program word at a specified address
Anna Bridge 186:707f6e361f3e 714 * @note To correctly run this function, the @ref HAL_FLASHEx_DATAEEPROM_Unlock() function
Anna Bridge 186:707f6e361f3e 715 * must be called before.
Anna Bridge 186:707f6e361f3e 716 * Call the @ref HAL_FLASHEx_DATAEEPROM_Unlock() to he data EEPROM access
Anna Bridge 186:707f6e361f3e 717 * and Flash program erase control register access(recommended to protect
Anna Bridge 186:707f6e361f3e 718 * the DATA_EEPROM against possible unwanted operation).
Anna Bridge 186:707f6e361f3e 719 * @note The function @ref HAL_FLASHEx_DATAEEPROM_EnableFixedTimeProgram() can be called before
Anna Bridge 186:707f6e361f3e 720 * this function to configure the Fixed Time Programming.
Anna Bridge 186:707f6e361f3e 721 * @param TypeProgram Indicate the way to program at a specified address.
Anna Bridge 186:707f6e361f3e 722 * This parameter can be a value of @ref FLASHEx_Type_Program_Data
Anna Bridge 186:707f6e361f3e 723 * @param Address specifie the address to be programmed.
Anna Bridge 186:707f6e361f3e 724 * @param Data specifie the data to be programmed
<> 144:ef7eb2e8f9f7 725 *
<> 144:ef7eb2e8f9f7 726 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 727 */
<> 144:ef7eb2e8f9f7 728
Anna Bridge 186:707f6e361f3e 729 HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 730 {
<> 144:ef7eb2e8f9f7 731 HAL_StatusTypeDef status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 732
<> 144:ef7eb2e8f9f7 733 /* Process Locked */
Anna Bridge 186:707f6e361f3e 734 __HAL_LOCK(&pFlash);
<> 144:ef7eb2e8f9f7 735
<> 144:ef7eb2e8f9f7 736 /* Check the parameters */
<> 144:ef7eb2e8f9f7 737 assert_param(IS_TYPEPROGRAMDATA(TypeProgram));
<> 144:ef7eb2e8f9f7 738 assert_param(IS_FLASH_DATA_ADDRESS(Address));
Anna Bridge 186:707f6e361f3e 739
<> 144:ef7eb2e8f9f7 740 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 741 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 742
<> 144:ef7eb2e8f9f7 743 if(status == HAL_OK)
<> 144:ef7eb2e8f9f7 744 {
<> 144:ef7eb2e8f9f7 745 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 746 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 747
<> 144:ef7eb2e8f9f7 748 if(TypeProgram == FLASH_TYPEPROGRAMDATA_WORD)
<> 144:ef7eb2e8f9f7 749 {
Anna Bridge 186:707f6e361f3e 750 /* Program word (32-bit) at a specified address.*/
<> 144:ef7eb2e8f9f7 751 *(__IO uint32_t *)Address = Data;
<> 144:ef7eb2e8f9f7 752 }
<> 144:ef7eb2e8f9f7 753 else if(TypeProgram == FLASH_TYPEPROGRAMDATA_HALFWORD)
<> 144:ef7eb2e8f9f7 754 {
Anna Bridge 186:707f6e361f3e 755 /* Program halfword (16-bit) at a specified address.*/
<> 144:ef7eb2e8f9f7 756 *(__IO uint16_t *)Address = (uint16_t) Data;
<> 144:ef7eb2e8f9f7 757 }
<> 144:ef7eb2e8f9f7 758 else if(TypeProgram == FLASH_TYPEPROGRAMDATA_BYTE)
<> 144:ef7eb2e8f9f7 759 {
Anna Bridge 186:707f6e361f3e 760 /* Program byte (8-bit) at a specified address.*/
<> 144:ef7eb2e8f9f7 761 *(__IO uint8_t *)Address = (uint8_t) Data;
<> 144:ef7eb2e8f9f7 762 }
<> 144:ef7eb2e8f9f7 763 else
<> 144:ef7eb2e8f9f7 764 {
<> 144:ef7eb2e8f9f7 765 status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 766 }
<> 144:ef7eb2e8f9f7 767
Anna Bridge 186:707f6e361f3e 768 if (status != HAL_OK)
Anna Bridge 186:707f6e361f3e 769 {
Anna Bridge 186:707f6e361f3e 770 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 771 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 772 }
<> 144:ef7eb2e8f9f7 773 }
Anna Bridge 186:707f6e361f3e 774
<> 144:ef7eb2e8f9f7 775 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 776 __HAL_UNLOCK(&pFlash);
Anna Bridge 186:707f6e361f3e 777
<> 144:ef7eb2e8f9f7 778 return status;
<> 144:ef7eb2e8f9f7 779 }
<> 144:ef7eb2e8f9f7 780
<> 144:ef7eb2e8f9f7 781 /**
<> 144:ef7eb2e8f9f7 782 * @brief Enable DATA EEPROM fixed Time programming (2*Tprog).
<> 144:ef7eb2e8f9f7 783 * @retval None
<> 144:ef7eb2e8f9f7 784 */
<> 144:ef7eb2e8f9f7 785 void HAL_FLASHEx_DATAEEPROM_EnableFixedTimeProgram(void)
<> 144:ef7eb2e8f9f7 786 {
<> 144:ef7eb2e8f9f7 787 SET_BIT(FLASH->PECR, FLASH_PECR_FIX);
<> 144:ef7eb2e8f9f7 788 }
<> 144:ef7eb2e8f9f7 789
<> 144:ef7eb2e8f9f7 790 /**
<> 144:ef7eb2e8f9f7 791 * @brief Disables DATA EEPROM fixed Time programming (2*Tprog).
<> 144:ef7eb2e8f9f7 792 * @retval None
<> 144:ef7eb2e8f9f7 793 */
<> 144:ef7eb2e8f9f7 794 void HAL_FLASHEx_DATAEEPROM_DisableFixedTimeProgram(void)
<> 144:ef7eb2e8f9f7 795 {
<> 144:ef7eb2e8f9f7 796 CLEAR_BIT(FLASH->PECR, FLASH_PECR_FIX);
<> 144:ef7eb2e8f9f7 797 }
<> 144:ef7eb2e8f9f7 798
<> 144:ef7eb2e8f9f7 799 /**
<> 144:ef7eb2e8f9f7 800 * @}
<> 144:ef7eb2e8f9f7 801 */
<> 144:ef7eb2e8f9f7 802
<> 144:ef7eb2e8f9f7 803 /**
<> 144:ef7eb2e8f9f7 804 * @}
<> 144:ef7eb2e8f9f7 805 */
<> 144:ef7eb2e8f9f7 806
Anna Bridge 186:707f6e361f3e 807 /** @addtogroup FLASHEx_Private_Functions
Anna Bridge 186:707f6e361f3e 808 * @{
Anna Bridge 186:707f6e361f3e 809 */
Anna Bridge 186:707f6e361f3e 810
Anna Bridge 186:707f6e361f3e 811 /*
Anna Bridge 186:707f6e361f3e 812 ==============================================================================
Anna Bridge 186:707f6e361f3e 813 OPTIONS BYTES
Anna Bridge 186:707f6e361f3e 814 ==============================================================================
Anna Bridge 186:707f6e361f3e 815 */
Anna Bridge 186:707f6e361f3e 816 /**
Anna Bridge 186:707f6e361f3e 817 * @brief Enables or disables the read out protection.
Anna Bridge 186:707f6e361f3e 818 * @note To correctly run this function, the @ref HAL_FLASH_OB_Unlock() function
Anna Bridge 186:707f6e361f3e 819 * must be called before.
Anna Bridge 186:707f6e361f3e 820 * @param OB_RDP specifies the read protection level.
Anna Bridge 186:707f6e361f3e 821 * This parameter can be:
Anna Bridge 186:707f6e361f3e 822 * @arg @ref OB_RDP_LEVEL_0 No protection
Anna Bridge 186:707f6e361f3e 823 * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory
Anna Bridge 186:707f6e361f3e 824 * @arg @ref OB_RDP_LEVEL_2 Chip protection
Anna Bridge 186:707f6e361f3e 825 *
Anna Bridge 186:707f6e361f3e 826 * !!!Warning!!! When enabling OB_RDP_LEVEL_2 it's no more possible to go back to level 1 or 0
Anna Bridge 186:707f6e361f3e 827 *
Anna Bridge 186:707f6e361f3e 828 * @retval HAL status
Anna Bridge 186:707f6e361f3e 829 */
Anna Bridge 186:707f6e361f3e 830 static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint8_t OB_RDP)
Anna Bridge 186:707f6e361f3e 831 {
Anna Bridge 186:707f6e361f3e 832 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 833 uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U;
Anna Bridge 186:707f6e361f3e 834
Anna Bridge 186:707f6e361f3e 835 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 836 assert_param(IS_OB_RDP(OB_RDP));
Anna Bridge 186:707f6e361f3e 837
Anna Bridge 186:707f6e361f3e 838 tmp1 = (uint32_t)(OB->RDP & FLASH_OPTR_RDPROT);
Anna Bridge 186:707f6e361f3e 839
Anna Bridge 186:707f6e361f3e 840 #if defined(FLASH_OPTR_WPRMOD)
Anna Bridge 186:707f6e361f3e 841 /* Mask WPRMOD bit */
Anna Bridge 186:707f6e361f3e 842 tmp3 = (uint32_t)(OB->RDP & FLASH_OPTR_WPRMOD);
Anna Bridge 186:707f6e361f3e 843 #endif
Anna Bridge 186:707f6e361f3e 844
Anna Bridge 186:707f6e361f3e 845 /* calculate the option byte to write */
Anna Bridge 186:707f6e361f3e 846 tmp1 = (~((uint32_t)(OB_RDP | tmp3)));
Anna Bridge 186:707f6e361f3e 847 tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16U)) | ((uint32_t)(OB_RDP | tmp3)));
Anna Bridge 186:707f6e361f3e 848
Anna Bridge 186:707f6e361f3e 849 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 850 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 851
Anna Bridge 186:707f6e361f3e 852 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 853 {
Anna Bridge 186:707f6e361f3e 854 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 855 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 856
Anna Bridge 186:707f6e361f3e 857 /* program read protection level */
Anna Bridge 186:707f6e361f3e 858 OB->RDP = tmp2;
Anna Bridge 186:707f6e361f3e 859
Anna Bridge 186:707f6e361f3e 860 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 861 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 862 }
Anna Bridge 186:707f6e361f3e 863
Anna Bridge 186:707f6e361f3e 864 /* Return the Read protection operation Status */
Anna Bridge 186:707f6e361f3e 865 return status;
Anna Bridge 186:707f6e361f3e 866 }
Anna Bridge 186:707f6e361f3e 867
Anna Bridge 186:707f6e361f3e 868 /**
Anna Bridge 186:707f6e361f3e 869 * @brief Programs the FLASH brownout reset threshold level Option Byte.
Anna Bridge 186:707f6e361f3e 870 * @param OB_BOR Selects the brownout reset threshold level.
Anna Bridge 186:707f6e361f3e 871 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 872 * @arg @ref OB_BOR_OFF BOR is disabled at power down, the reset is asserted when the VDD
Anna Bridge 186:707f6e361f3e 873 * power supply reaches the PDR(Power Down Reset) threshold (1.5V)
Anna Bridge 186:707f6e361f3e 874 * @arg @ref OB_BOR_LEVEL1 BOR Reset threshold levels for 1.7V - 1.8V VDD power supply
Anna Bridge 186:707f6e361f3e 875 * @arg @ref OB_BOR_LEVEL2 BOR Reset threshold levels for 1.9V - 2.0V VDD power supply
Anna Bridge 186:707f6e361f3e 876 * @arg @ref OB_BOR_LEVEL3 BOR Reset threshold levels for 2.3V - 2.4V VDD power supply
Anna Bridge 186:707f6e361f3e 877 * @arg @ref OB_BOR_LEVEL4 BOR Reset threshold levels for 2.55V - 2.65V VDD power supply
Anna Bridge 186:707f6e361f3e 878 * @arg @ref OB_BOR_LEVEL5 BOR Reset threshold levels for 2.8V - 2.9V VDD power supply
Anna Bridge 186:707f6e361f3e 879 * @retval HAL status
Anna Bridge 186:707f6e361f3e 880 */
Anna Bridge 186:707f6e361f3e 881 static HAL_StatusTypeDef FLASH_OB_BORConfig(uint8_t OB_BOR)
Anna Bridge 186:707f6e361f3e 882 {
Anna Bridge 186:707f6e361f3e 883 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 884 uint32_t tmp = 0, tmp1 = 0;
Anna Bridge 186:707f6e361f3e 885
Anna Bridge 186:707f6e361f3e 886 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 887 assert_param(IS_OB_BOR_LEVEL(OB_BOR));
Anna Bridge 186:707f6e361f3e 888
Anna Bridge 186:707f6e361f3e 889 /* Get the User Option byte register */
Anna Bridge 186:707f6e361f3e 890 tmp1 = OB->USER & ((~FLASH_OPTR_BOR_LEV) >> 16U);
Anna Bridge 186:707f6e361f3e 891
Anna Bridge 186:707f6e361f3e 892 /* Calculate the option byte to write - [0xFF | nUSER | 0x00 | USER]*/
Anna Bridge 186:707f6e361f3e 893 tmp = (uint32_t)~((OB_BOR | tmp1)) << 16U;
Anna Bridge 186:707f6e361f3e 894 tmp |= (OB_BOR | tmp1);
Anna Bridge 186:707f6e361f3e 895
Anna Bridge 186:707f6e361f3e 896 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 897 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 898
Anna Bridge 186:707f6e361f3e 899 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 900 {
Anna Bridge 186:707f6e361f3e 901 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 902 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 903
Anna Bridge 186:707f6e361f3e 904 /* Write the BOR Option Byte */
Anna Bridge 186:707f6e361f3e 905 OB->USER = tmp;
Anna Bridge 186:707f6e361f3e 906
Anna Bridge 186:707f6e361f3e 907 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 908 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 909 }
Anna Bridge 186:707f6e361f3e 910
Anna Bridge 186:707f6e361f3e 911 /* Return the Option Byte BOR programmation Status */
Anna Bridge 186:707f6e361f3e 912 return status;
Anna Bridge 186:707f6e361f3e 913 }
Anna Bridge 186:707f6e361f3e 914
Anna Bridge 186:707f6e361f3e 915 /**
Anna Bridge 186:707f6e361f3e 916 * @brief Sets or resets the BOOT bit1 option bit.
Anna Bridge 186:707f6e361f3e 917 * @param OB_BootBit1 Set or Reset the BOOT bit1 option bit.
Anna Bridge 186:707f6e361f3e 918 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 919 * @arg @ref OB_BOOT_BIT1_RESET BOOT1 option bit reset
Anna Bridge 186:707f6e361f3e 920 * @arg @ref OB_BOOT_BIT1_SET BOOT1 option bit set
Anna Bridge 186:707f6e361f3e 921 * @retval HAL status
Anna Bridge 186:707f6e361f3e 922 */
Anna Bridge 186:707f6e361f3e 923 static HAL_StatusTypeDef FLASH_OB_BOOTBit1Config(uint8_t OB_BootBit1)
Anna Bridge 186:707f6e361f3e 924 {
Anna Bridge 186:707f6e361f3e 925 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 926 uint32_t tmp = 0, tmp1 = 0, OB_Bits = ((uint32_t) OB_BootBit1) << 15;
Anna Bridge 186:707f6e361f3e 927
Anna Bridge 186:707f6e361f3e 928 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 929 assert_param(IS_OB_BOOT1(OB_BootBit1));
Anna Bridge 186:707f6e361f3e 930
Anna Bridge 186:707f6e361f3e 931 /* Get the User Option byte register */
Anna Bridge 186:707f6e361f3e 932 tmp1 = OB->USER & ((~FLASH_OPTR_BOOT1) >> 16U);
Anna Bridge 186:707f6e361f3e 933
Anna Bridge 186:707f6e361f3e 934 /* Calculate the user option byte to write */
Anna Bridge 186:707f6e361f3e 935 tmp = (~(OB_Bits | tmp1)) << 16U;
Anna Bridge 186:707f6e361f3e 936 tmp |= OB_Bits | tmp1;
Anna Bridge 186:707f6e361f3e 937
Anna Bridge 186:707f6e361f3e 938 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 939 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 940
Anna Bridge 186:707f6e361f3e 941 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 942 {
Anna Bridge 186:707f6e361f3e 943 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 944 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 945 /* Program OB */
Anna Bridge 186:707f6e361f3e 946 OB->USER = tmp;
Anna Bridge 186:707f6e361f3e 947 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 948 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 949 }
Anna Bridge 186:707f6e361f3e 950
Anna Bridge 186:707f6e361f3e 951 return status;
Anna Bridge 186:707f6e361f3e 952 }
<> 144:ef7eb2e8f9f7 953
<> 144:ef7eb2e8f9f7 954 /**
<> 144:ef7eb2e8f9f7 955 * @brief Returns the FLASH User Option Bytes values.
<> 144:ef7eb2e8f9f7 956 * @retval The FLASH User Option Bytes.
<> 144:ef7eb2e8f9f7 957 */
<> 144:ef7eb2e8f9f7 958 static uint8_t FLASH_OB_GetUser(void)
<> 144:ef7eb2e8f9f7 959 {
<> 144:ef7eb2e8f9f7 960 /* Return the User Option Byte */
<> 151:5eaa88a5bcc7 961 return (uint8_t)((FLASH->OPTR & FLASH_OPTR_USER) >> 16U);
<> 144:ef7eb2e8f9f7 962 }
<> 144:ef7eb2e8f9f7 963
<> 144:ef7eb2e8f9f7 964 /**
Anna Bridge 186:707f6e361f3e 965 * @brief Returns the FLASH Read Protection level.
Anna Bridge 186:707f6e361f3e 966 * @retval FLASH RDP level
Anna Bridge 186:707f6e361f3e 967 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 968 * @arg @ref OB_RDP_LEVEL_0 No protection
Anna Bridge 186:707f6e361f3e 969 * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory
Anna Bridge 186:707f6e361f3e 970 * @arg @ref OB_RDP_LEVEL_2 Full chip protection
<> 144:ef7eb2e8f9f7 971 */
<> 144:ef7eb2e8f9f7 972 static uint8_t FLASH_OB_GetRDP(void)
<> 144:ef7eb2e8f9f7 973 {
<> 144:ef7eb2e8f9f7 974 return (uint8_t)(FLASH->OPTR & FLASH_OPTR_RDPROT);
<> 144:ef7eb2e8f9f7 975 }
<> 144:ef7eb2e8f9f7 976
<> 144:ef7eb2e8f9f7 977 /**
<> 144:ef7eb2e8f9f7 978 * @brief Returns the FLASH BOR level.
<> 144:ef7eb2e8f9f7 979 * @retval The BOR level Option Bytes.
<> 144:ef7eb2e8f9f7 980 */
<> 144:ef7eb2e8f9f7 981 static uint8_t FLASH_OB_GetBOR(void)
<> 144:ef7eb2e8f9f7 982 {
<> 144:ef7eb2e8f9f7 983 /* Return the BOR level */
<> 151:5eaa88a5bcc7 984 return (uint8_t)((FLASH->OPTR & (uint32_t)FLASH_OPTR_BOR_LEV) >> 16U);
<> 144:ef7eb2e8f9f7 985 }
<> 144:ef7eb2e8f9f7 986
<> 144:ef7eb2e8f9f7 987 /**
<> 144:ef7eb2e8f9f7 988 * @brief Returns the FLASH BOOT bit1 value.
<> 144:ef7eb2e8f9f7 989 * @retval The BOOT bit 1 value Option Bytes.
<> 144:ef7eb2e8f9f7 990 */
<> 144:ef7eb2e8f9f7 991 static uint8_t FLASH_OB_GetBOOTBit1(void)
<> 144:ef7eb2e8f9f7 992 {
<> 144:ef7eb2e8f9f7 993 /* Return the BOR level */
Anna Bridge 186:707f6e361f3e 994 return (FLASH->OPTR & FLASH_OPTR_BOOT1) >> FLASH_OPTR_BOOT1_Pos;
<> 144:ef7eb2e8f9f7 995
<> 144:ef7eb2e8f9f7 996 }
<> 144:ef7eb2e8f9f7 997
<> 144:ef7eb2e8f9f7 998 /**
<> 144:ef7eb2e8f9f7 999 * @brief Returns the FLASH Write Protection Option Bytes value.
<> 144:ef7eb2e8f9f7 1000 * @retval The FLASH Write Protection Option Bytes value.
<> 144:ef7eb2e8f9f7 1001 */
<> 144:ef7eb2e8f9f7 1002 static uint32_t FLASH_OB_GetWRP(void)
<> 144:ef7eb2e8f9f7 1003 {
<> 144:ef7eb2e8f9f7 1004 /* Return the FLASH write protection Register value */
<> 144:ef7eb2e8f9f7 1005 return (uint32_t)(FLASH->WRPR);
<> 144:ef7eb2e8f9f7 1006 }
<> 144:ef7eb2e8f9f7 1007
<> 144:ef7eb2e8f9f7 1008 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 1009 /**
<> 144:ef7eb2e8f9f7 1010 * @brief Returns the FLASH Write Protection Option Bytes value.
<> 144:ef7eb2e8f9f7 1011 * @retval The FLASH Write Protection Option Bytes value.
<> 144:ef7eb2e8f9f7 1012 */
<> 144:ef7eb2e8f9f7 1013 static uint32_t FLASH_OB_GetWRP2(void)
<> 144:ef7eb2e8f9f7 1014 {
<> 144:ef7eb2e8f9f7 1015 /* Return the FLASH write protection Register value */
<> 144:ef7eb2e8f9f7 1016 return (uint32_t)(FLASH->WRPR2);
<> 144:ef7eb2e8f9f7 1017 }
<> 144:ef7eb2e8f9f7 1018 #endif /* STM32L071xx || STM32L072xx || STM32L073xx || STM32L081xx || STM32L082xx || STM32L083xx */
<> 144:ef7eb2e8f9f7 1019
<> 144:ef7eb2e8f9f7 1020 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
<> 144:ef7eb2e8f9f7 1021 /**
<> 144:ef7eb2e8f9f7 1022 * @brief Write Option Byte of the desired pages of the Flash.
Anna Bridge 186:707f6e361f3e 1023 * @param Sector specifies the sectors to be write protected.
Anna Bridge 186:707f6e361f3e 1024 * @param Sector2 specifies the sectors to be write protected (only stm32l07xxx and stm32l08xxx devices)
Anna Bridge 186:707f6e361f3e 1025 * @param NewState new state of the specified FLASH Pages Write protection.
Anna Bridge 186:707f6e361f3e 1026 * This parameter can be:
Anna Bridge 186:707f6e361f3e 1027 * @arg @ref OB_WRPSTATE_ENABLE
Anna Bridge 186:707f6e361f3e 1028 * @arg @ref OB_WRPSTATE_DISABLE
<> 144:ef7eb2e8f9f7 1029 * @retval HAL_StatusTypeDef
<> 144:ef7eb2e8f9f7 1030 */
<> 144:ef7eb2e8f9f7 1031 static HAL_StatusTypeDef FLASH_OB_ProtectedSectorsConfig(uint32_t Sector, uint32_t Sector2, uint32_t NewState)
<> 144:ef7eb2e8f9f7 1032 #else
<> 144:ef7eb2e8f9f7 1033 /**
<> 144:ef7eb2e8f9f7 1034 * @brief Write Option Byte of the desired pages of the Flash.
Anna Bridge 186:707f6e361f3e 1035 * @param Sector specifies the sectors to be write protected.
Anna Bridge 186:707f6e361f3e 1036 * @param NewState new state of the specified FLASH Pages Write protection.
Anna Bridge 186:707f6e361f3e 1037 * This parameter can be:
Anna Bridge 186:707f6e361f3e 1038 * @arg @ref OB_WRPSTATE_ENABLE
Anna Bridge 186:707f6e361f3e 1039 * @arg @ref OB_WRPSTATE_DISABLE
<> 144:ef7eb2e8f9f7 1040 * @retval HAL_StatusTypeDef
<> 144:ef7eb2e8f9f7 1041 */
<> 144:ef7eb2e8f9f7 1042 static HAL_StatusTypeDef FLASH_OB_ProtectedSectorsConfig(uint32_t Sector, uint32_t NewState)
<> 144:ef7eb2e8f9f7 1043 #endif
<> 144:ef7eb2e8f9f7 1044 {
<> 144:ef7eb2e8f9f7 1045 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 1046 uint32_t WRP_Data = 0;
<> 144:ef7eb2e8f9f7 1047 uint32_t OB_WRP = Sector;
<> 144:ef7eb2e8f9f7 1048
<> 144:ef7eb2e8f9f7 1049 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 1050 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 1051
<> 144:ef7eb2e8f9f7 1052 if(status == HAL_OK)
<> 144:ef7eb2e8f9f7 1053 {
<> 144:ef7eb2e8f9f7 1054 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 1055 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 1056
Anna Bridge 186:707f6e361f3e 1057 /* Update WRP only if at least 1 selected sector */
Anna Bridge 186:707f6e361f3e 1058 if (OB_WRP != 0x00000000U)
<> 144:ef7eb2e8f9f7 1059 {
Anna Bridge 186:707f6e361f3e 1060 if ((OB_WRP & WRP_MASK_LOW) != 0x00000000U)
<> 144:ef7eb2e8f9f7 1061 {
Anna Bridge 186:707f6e361f3e 1062 if (NewState != OB_WRPSTATE_DISABLE)
Anna Bridge 186:707f6e361f3e 1063 {
Anna Bridge 186:707f6e361f3e 1064 WRP_Data = (uint16_t)(((OB_WRP & WRP_MASK_LOW) | OB->WRP01));
Anna Bridge 186:707f6e361f3e 1065 OB->WRP01 = (uint32_t)(~(WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1066 }
Anna Bridge 186:707f6e361f3e 1067 else
Anna Bridge 186:707f6e361f3e 1068 {
Anna Bridge 186:707f6e361f3e 1069 WRP_Data = (uint16_t)(~OB_WRP & (WRP_MASK_LOW & OB->WRP01));
Anna Bridge 186:707f6e361f3e 1070 OB->WRP01 = (uint32_t)((~WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1071 }
<> 144:ef7eb2e8f9f7 1072 }
<> 144:ef7eb2e8f9f7 1073 }
<> 144:ef7eb2e8f9f7 1074 #if defined(STM32L071xx) || defined(STM32L072xx) || defined(STM32L073xx) || defined(STM32L081xx) || defined(STM32L082xx) || defined(STM32L083xx)
Anna Bridge 186:707f6e361f3e 1075 /* Update WRP only if at least 1 selected sector */
Anna Bridge 186:707f6e361f3e 1076 if (OB_WRP != 0x00000000U)
<> 144:ef7eb2e8f9f7 1077 {
Anna Bridge 186:707f6e361f3e 1078 if ((OB_WRP & WRP_MASK_HIGH) != 0x00000000U)
<> 144:ef7eb2e8f9f7 1079 {
Anna Bridge 186:707f6e361f3e 1080 if (NewState != OB_WRPSTATE_DISABLE)
Anna Bridge 186:707f6e361f3e 1081 {
Anna Bridge 186:707f6e361f3e 1082 WRP_Data = (uint16_t)((((OB_WRP & WRP_MASK_HIGH) >> 16U | OB->WRP23)));
Anna Bridge 186:707f6e361f3e 1083 OB->WRP23 = (uint32_t)(~(WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1084 }
Anna Bridge 186:707f6e361f3e 1085 else
Anna Bridge 186:707f6e361f3e 1086 {
Anna Bridge 186:707f6e361f3e 1087 WRP_Data = (uint16_t)((((~OB_WRP & WRP_MASK_HIGH) >> 16U & OB->WRP23)));
Anna Bridge 186:707f6e361f3e 1088 OB->WRP23 = (uint32_t)((~WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1089 }
Anna Bridge 186:707f6e361f3e 1090 }
<> 144:ef7eb2e8f9f7 1091 }
<> 144:ef7eb2e8f9f7 1092
<> 144:ef7eb2e8f9f7 1093 OB_WRP = Sector2;
Anna Bridge 186:707f6e361f3e 1094 /* Update WRP only if at least 1 selected sector */
Anna Bridge 186:707f6e361f3e 1095 if (OB_WRP != 0x00000000U)
<> 144:ef7eb2e8f9f7 1096 {
Anna Bridge 186:707f6e361f3e 1097 if ((OB_WRP & WRP_MASK_LOW) != 0x00000000U)
<> 144:ef7eb2e8f9f7 1098 {
Anna Bridge 186:707f6e361f3e 1099 if (NewState != OB_WRPSTATE_DISABLE)
Anna Bridge 186:707f6e361f3e 1100 {
Anna Bridge 186:707f6e361f3e 1101 WRP_Data = (uint16_t)(((OB_WRP & WRP_MASK_LOW) | OB->WRP45));
Anna Bridge 186:707f6e361f3e 1102 OB->WRP45 =(uint32_t)(~(WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1103 }
Anna Bridge 186:707f6e361f3e 1104 else
Anna Bridge 186:707f6e361f3e 1105 {
Anna Bridge 186:707f6e361f3e 1106 WRP_Data = (uint16_t)(~OB_WRP & (WRP_MASK_LOW & OB->WRP45));
Anna Bridge 186:707f6e361f3e 1107 OB->WRP45 = (uint32_t)((~WRP_Data) << 16U) | (WRP_Data);
Anna Bridge 186:707f6e361f3e 1108 }
<> 144:ef7eb2e8f9f7 1109 }
<> 144:ef7eb2e8f9f7 1110 }
<> 144:ef7eb2e8f9f7 1111 #endif /* STM32L071xx || STM32L072xx || STM32L073xx || STM32L081xx || STM32L082xx || STM32L083xx */
<> 144:ef7eb2e8f9f7 1112 }
<> 144:ef7eb2e8f9f7 1113 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 1114 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 1115
<> 144:ef7eb2e8f9f7 1116 /* Return the write protection operation Status */
<> 144:ef7eb2e8f9f7 1117 return status;
<> 144:ef7eb2e8f9f7 1118 }
<> 144:ef7eb2e8f9f7 1119
<> 144:ef7eb2e8f9f7 1120 /**
Anna Bridge 186:707f6e361f3e 1121 * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
Anna Bridge 186:707f6e361f3e 1122 * @param OB_IWDG Selects the WDG mode.
Anna Bridge 186:707f6e361f3e 1123 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 1124 * @arg @ref OB_IWDG_SW Software WDG selected
Anna Bridge 186:707f6e361f3e 1125 * @arg @ref OB_IWDG_HW Hardware WDG selected
Anna Bridge 186:707f6e361f3e 1126 * @param OB_STOP Reset event when entering STOP mode.
Anna Bridge 186:707f6e361f3e 1127 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 1128 * @arg @ref OB_STOP_NORST No reset generated when entering in STOP
Anna Bridge 186:707f6e361f3e 1129 * @arg @ref OB_STOP_RST Reset generated when entering in STOP
Anna Bridge 186:707f6e361f3e 1130 * @param OB_STDBY Reset event when entering Standby mode.
Anna Bridge 186:707f6e361f3e 1131 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 1132 * @arg @ref OB_STDBY_NORST No reset generated when entering in STANDBY
Anna Bridge 186:707f6e361f3e 1133 * @arg @ref OB_STDBY_RST Reset generated when entering in STANDBY
Anna Bridge 186:707f6e361f3e 1134 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1135 */
Anna Bridge 186:707f6e361f3e 1136 static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY)
Anna Bridge 186:707f6e361f3e 1137 {
Anna Bridge 186:707f6e361f3e 1138 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 1139 uint32_t tmp = 0, tmp1 = 0;
Anna Bridge 186:707f6e361f3e 1140
Anna Bridge 186:707f6e361f3e 1141 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 1142 assert_param(IS_OB_IWDG_SOURCE(OB_IWDG));
Anna Bridge 186:707f6e361f3e 1143 assert_param(IS_OB_STOP_SOURCE(OB_STOP));
Anna Bridge 186:707f6e361f3e 1144 assert_param(IS_OB_STDBY_SOURCE(OB_STDBY));
Anna Bridge 186:707f6e361f3e 1145
Anna Bridge 186:707f6e361f3e 1146 /* Get the User Option byte register */
Anna Bridge 186:707f6e361f3e 1147 tmp1 = OB->USER & ((~FLASH_OPTR_USER) >> 16U);
Anna Bridge 186:707f6e361f3e 1148
Anna Bridge 186:707f6e361f3e 1149 /* Calculate the user option byte to write */
Anna Bridge 186:707f6e361f3e 1150 tmp = (uint32_t)(((uint32_t)~((uint32_t)((uint32_t)(OB_IWDG) | (uint32_t)(OB_STOP) | (uint32_t)(OB_STDBY) | tmp1))) << 16U);
Anna Bridge 186:707f6e361f3e 1151 tmp |= ((uint32_t)(OB_IWDG) | ((uint32_t)OB_STOP) | (uint32_t)(OB_STDBY) | tmp1);
Anna Bridge 186:707f6e361f3e 1152
Anna Bridge 186:707f6e361f3e 1153 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 1154 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 1155
Anna Bridge 186:707f6e361f3e 1156 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 1157 {
Anna Bridge 186:707f6e361f3e 1158 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 1159 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1160
Anna Bridge 186:707f6e361f3e 1161 /* Write the User Option Byte */
Anna Bridge 186:707f6e361f3e 1162 OB->USER = tmp;
Anna Bridge 186:707f6e361f3e 1163
Anna Bridge 186:707f6e361f3e 1164 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 1165 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 1166 }
Anna Bridge 186:707f6e361f3e 1167
Anna Bridge 186:707f6e361f3e 1168 /* Return the Option Byte program Status */
Anna Bridge 186:707f6e361f3e 1169 return status;
Anna Bridge 186:707f6e361f3e 1170 }
Anna Bridge 186:707f6e361f3e 1171
Anna Bridge 186:707f6e361f3e 1172 #if defined(FLASH_OPTR_BFB2)
Anna Bridge 186:707f6e361f3e 1173 /**
Anna Bridge 186:707f6e361f3e 1174 * @brief Configures to boot from Bank1 or Bank2.
Anna Bridge 186:707f6e361f3e 1175 * @param OB_BOOT select the FLASH Bank to boot from.
Anna Bridge 186:707f6e361f3e 1176 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 1177 * This parameter can be one of the following values:
Anna Bridge 186:707f6e361f3e 1178 * @arg @ref OB_BOOT_BANK1 BFB2 option bit reset
Anna Bridge 186:707f6e361f3e 1179 * @arg @ref OB_BOOT_BANK2 BFB2 option bit set
Anna Bridge 186:707f6e361f3e 1180 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1181 */
Anna Bridge 186:707f6e361f3e 1182 static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t OB_BOOT)
Anna Bridge 186:707f6e361f3e 1183 {
Anna Bridge 186:707f6e361f3e 1184 HAL_StatusTypeDef status = HAL_OK;
Anna Bridge 186:707f6e361f3e 1185 uint32_t tmp = 0U, tmp1 = 0U;
Anna Bridge 186:707f6e361f3e 1186
Anna Bridge 186:707f6e361f3e 1187 /* Check the parameters */
Anna Bridge 186:707f6e361f3e 1188 assert_param(IS_OB_BOOT_BANK(OB_BOOT));
Anna Bridge 186:707f6e361f3e 1189
Anna Bridge 186:707f6e361f3e 1190 /* Get the User Option byte register and BOR Level*/
Anna Bridge 186:707f6e361f3e 1191 tmp1 = OB->USER & ((~FLASH_OPTR_BFB2) >> 16U);
Anna Bridge 186:707f6e361f3e 1192
Anna Bridge 186:707f6e361f3e 1193 /* Calculate the option byte to write */
Anna Bridge 186:707f6e361f3e 1194 tmp = (uint32_t)~(OB_BOOT | tmp1) << 16U;
Anna Bridge 186:707f6e361f3e 1195 tmp |= (OB_BOOT | tmp1);
Anna Bridge 186:707f6e361f3e 1196
Anna Bridge 186:707f6e361f3e 1197 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 1198 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 1199
Anna Bridge 186:707f6e361f3e 1200 if(status == HAL_OK)
Anna Bridge 186:707f6e361f3e 1201 {
Anna Bridge 186:707f6e361f3e 1202 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 1203 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1204
Anna Bridge 186:707f6e361f3e 1205 /* Write the BOOT Option Byte */
Anna Bridge 186:707f6e361f3e 1206 OB->USER = tmp;
Anna Bridge 186:707f6e361f3e 1207
Anna Bridge 186:707f6e361f3e 1208 /* Wait for last operation to be completed */
Anna Bridge 186:707f6e361f3e 1209 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
Anna Bridge 186:707f6e361f3e 1210 }
Anna Bridge 186:707f6e361f3e 1211
Anna Bridge 186:707f6e361f3e 1212 /* Return the Option Byte program Status */
Anna Bridge 186:707f6e361f3e 1213 return status;
Anna Bridge 186:707f6e361f3e 1214 }
Anna Bridge 186:707f6e361f3e 1215
Anna Bridge 186:707f6e361f3e 1216 #endif /* FLASH_OPTR_BFB2 */
Anna Bridge 186:707f6e361f3e 1217
Anna Bridge 186:707f6e361f3e 1218 /**
Anna Bridge 186:707f6e361f3e 1219 * @}
Anna Bridge 186:707f6e361f3e 1220 */
Anna Bridge 186:707f6e361f3e 1221
Anna Bridge 186:707f6e361f3e 1222 /**
Anna Bridge 186:707f6e361f3e 1223 * @}
Anna Bridge 186:707f6e361f3e 1224 */
Anna Bridge 186:707f6e361f3e 1225
Anna Bridge 186:707f6e361f3e 1226 /** @addtogroup FLASH
Anna Bridge 186:707f6e361f3e 1227 * @{
Anna Bridge 186:707f6e361f3e 1228 */
Anna Bridge 186:707f6e361f3e 1229
Anna Bridge 186:707f6e361f3e 1230
Anna Bridge 186:707f6e361f3e 1231 /** @addtogroup FLASH_Private_Functions
Anna Bridge 186:707f6e361f3e 1232 * @{
Anna Bridge 186:707f6e361f3e 1233 */
Anna Bridge 186:707f6e361f3e 1234
Anna Bridge 186:707f6e361f3e 1235 /**
Anna Bridge 186:707f6e361f3e 1236 * @brief Erases a specified page in program memory.
Anna Bridge 186:707f6e361f3e 1237 * @param PageAddress The page address in program memory to be erased.
Anna Bridge 186:707f6e361f3e 1238 * @note A Page is erased in the Program memory only if the address to load
Anna Bridge 186:707f6e361f3e 1239 * is the start address of a page (multiple of @ref FLASH_PAGE_SIZE bytes).
Anna Bridge 186:707f6e361f3e 1240 * @retval None
Anna Bridge 186:707f6e361f3e 1241 */
Anna Bridge 186:707f6e361f3e 1242 void FLASH_PageErase(uint32_t PageAddress)
Anna Bridge 186:707f6e361f3e 1243 {
Anna Bridge 186:707f6e361f3e 1244 /* Clean the error context */
Anna Bridge 186:707f6e361f3e 1245 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1246
Anna Bridge 186:707f6e361f3e 1247 /* Set the ERASE bit */
Anna Bridge 186:707f6e361f3e 1248 SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
Anna Bridge 186:707f6e361f3e 1249
Anna Bridge 186:707f6e361f3e 1250 /* Set PROG bit */
Anna Bridge 186:707f6e361f3e 1251 SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
Anna Bridge 186:707f6e361f3e 1252
Anna Bridge 186:707f6e361f3e 1253 /* Write 00000000h to the first word of the program page to erase */
Anna Bridge 186:707f6e361f3e 1254 *(__IO uint32_t *)(uint32_t)(PageAddress & ~(FLASH_PAGE_SIZE - 1)) = 0x00000000;
Anna Bridge 186:707f6e361f3e 1255 }
Anna Bridge 186:707f6e361f3e 1256
Anna Bridge 186:707f6e361f3e 1257 /**
<> 144:ef7eb2e8f9f7 1258 * @}
<> 144:ef7eb2e8f9f7 1259 */
<> 144:ef7eb2e8f9f7 1260
<> 144:ef7eb2e8f9f7 1261 /**
<> 144:ef7eb2e8f9f7 1262 * @}
<> 144:ef7eb2e8f9f7 1263 */
<> 144:ef7eb2e8f9f7 1264
<> 144:ef7eb2e8f9f7 1265 #endif /* HAL_FLASH_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 1266 /**
<> 144:ef7eb2e8f9f7 1267 * @}
<> 144:ef7eb2e8f9f7 1268 */
Anna Bridge 186:707f6e361f3e 1269
<> 144:ef7eb2e8f9f7 1270 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/