Jolyon Hill / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
113:b3775bf36a83
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32l0xx_hal_flash.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @version V1.5.0
<> 144:ef7eb2e8f9f7 6 * @date 8-January-2016
<> 144:ef7eb2e8f9f7 7 * @brief FLASH HAL module driver.
<> 144:ef7eb2e8f9f7 8 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 9 * functionalities of the internal FLASH memory:
<> 144:ef7eb2e8f9f7 10 * + FLASH Interface configuration
<> 144:ef7eb2e8f9f7 11 * + FLASH Memory Programming
<> 144:ef7eb2e8f9f7 12 * + DATA EEPROM Programming
<> 144:ef7eb2e8f9f7 13 * + Option Bytes Programming
<> 144:ef7eb2e8f9f7 14 * + Interrupts and flags management
<> 144:ef7eb2e8f9f7 15 *
<> 144:ef7eb2e8f9f7 16 * @verbatim
<> 144:ef7eb2e8f9f7 17
<> 144:ef7eb2e8f9f7 18 ==============================================================================
<> 144:ef7eb2e8f9f7 19 ##### FLASH peripheral features #####
<> 144:ef7eb2e8f9f7 20 ==============================================================================
<> 144:ef7eb2e8f9f7 21
<> 144:ef7eb2e8f9f7 22 [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses
<> 144:ef7eb2e8f9f7 23 to the Flash memory. It implements the erase and program Flash memory operations
<> 144:ef7eb2e8f9f7 24 and the read and write protection mechanisms.
<> 144:ef7eb2e8f9f7 25
<> 144:ef7eb2e8f9f7 26 [..] The Flash memory interface accelerates code execution with a system of instruction prefetch.
<> 144:ef7eb2e8f9f7 27
<> 144:ef7eb2e8f9f7 28 [..] The FLASH main features are:
<> 144:ef7eb2e8f9f7 29 (+) Flash memory read operations
<> 144:ef7eb2e8f9f7 30 (+) Flash memory program/erase operations
<> 144:ef7eb2e8f9f7 31 (+) Read / write protections
<> 144:ef7eb2e8f9f7 32 (+) Prefetch on I-Code
<> 144:ef7eb2e8f9f7 33 (+) Option Bytes programming
<> 144:ef7eb2e8f9f7 34
<> 144:ef7eb2e8f9f7 35 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 36 ==============================================================================
<> 144:ef7eb2e8f9f7 37 [..] This driver provides functions to configure and program the Flash
<> 144:ef7eb2e8f9f7 38 memory of all STM32L0xx devices.
<> 144:ef7eb2e8f9f7 39
<> 144:ef7eb2e8f9f7 40 (#) FLASH Memory Programming functions: this group includes all
<> 144:ef7eb2e8f9f7 41 needed functions to erase and program the main memory:
<> 144:ef7eb2e8f9f7 42 (++) Lock and Unlock the Flash interface.
<> 144:ef7eb2e8f9f7 43 (++) Erase function: Erase Page.
<> 144:ef7eb2e8f9f7 44 (++) Program functions: Fast Word and Half Page(should be
<> 144:ef7eb2e8f9f7 45 executed from internal SRAM).
<> 144:ef7eb2e8f9f7 46
<> 144:ef7eb2e8f9f7 47 (#) DATA EEPROM Programming functions: this group includes all
<> 144:ef7eb2e8f9f7 48 needed functions to erase and program the DATA EEPROM memory:
<> 144:ef7eb2e8f9f7 49 (++) Lock and Unlock the DATA EEPROM interface.
<> 144:ef7eb2e8f9f7 50 (++) Erase function: Erase Byte, erase HalfWord, erase Word, erase
<> 144:ef7eb2e8f9f7 51 Double Word (should be executed from internal SRAM).
<> 144:ef7eb2e8f9f7 52 (++) Program functions: Fast Program Byte, Fast Program Half-Word,
<> 144:ef7eb2e8f9f7 53 FastProgramWord, Program Byte, Program Half-Word,
<> 144:ef7eb2e8f9f7 54 Program Word and Program Double-Word (should be executed
<> 144:ef7eb2e8f9f7 55 from internal SRAM).
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 (#) FLASH Option Bytes Programming functions: this group includes
<> 144:ef7eb2e8f9f7 58 all needed functions to:
<> 144:ef7eb2e8f9f7 59 (++) Lock and Unlock the Flash Option bytes.
<> 144:ef7eb2e8f9f7 60 (++) Set/Reset the write protection.
<> 144:ef7eb2e8f9f7 61 (++) Set the Read protection Level.
<> 144:ef7eb2e8f9f7 62 (++) Set the BOR level.
<> 144:ef7eb2e8f9f7 63 (++) Program the user option Bytes.
<> 144:ef7eb2e8f9f7 64 (++) Launch the Option Bytes loader.
<> 144:ef7eb2e8f9f7 65 (++) Get the Write protection.
<> 144:ef7eb2e8f9f7 66 (++) Get the read protection status.
<> 144:ef7eb2e8f9f7 67 (++) Get the BOR level.
<> 144:ef7eb2e8f9f7 68 (++) Get the user option bytes.
<> 144:ef7eb2e8f9f7 69
<> 144:ef7eb2e8f9f7 70 (#) Interrupts and flags management functions :
<> 144:ef7eb2e8f9f7 71 (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler()
<> 144:ef7eb2e8f9f7 72 (++) Wait for last FLASH operation according to its status
<> 144:ef7eb2e8f9f7 73 (++) Get error flag status by calling HAL_GetErrorCode()
<> 144:ef7eb2e8f9f7 74
<> 144:ef7eb2e8f9f7 75 (#) FLASH Interface configuration functions: this group includes
<> 144:ef7eb2e8f9f7 76 the management of following features:
<> 144:ef7eb2e8f9f7 77 (++) Enable/Disable the RUN PowerDown mode.
<> 144:ef7eb2e8f9f7 78 (++) Enable/Disable the SLEEP PowerDown mode.
<> 144:ef7eb2e8f9f7 79
<> 144:ef7eb2e8f9f7 80 (#) FLASH Peripheral State methods: this group includes
<> 144:ef7eb2e8f9f7 81 the management of following features:
<> 144:ef7eb2e8f9f7 82 (++) Wait for the FLASH operation
<> 144:ef7eb2e8f9f7 83 (++) Get the specific FLASH error flag
<> 144:ef7eb2e8f9f7 84
<> 144:ef7eb2e8f9f7 85 [..] In addition to these function, this driver includes a set of macros allowing
<> 144:ef7eb2e8f9f7 86 to handle the following operations:
<> 144:ef7eb2e8f9f7 87
<> 144:ef7eb2e8f9f7 88 (+) Set/Get the latency
<> 144:ef7eb2e8f9f7 89 (+) Enable/Disable the prefetch buffer
<> 144:ef7eb2e8f9f7 90 (+) Enable/Disable the preread buffer
<> 144:ef7eb2e8f9f7 91 (+) Enable/Disable the Flash power-down
<> 144:ef7eb2e8f9f7 92 (+) Enable/Disable the FLASH interrupts
<> 144:ef7eb2e8f9f7 93 (+) Monitor the FLASH flags status
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 ===============================================================================
<> 144:ef7eb2e8f9f7 96 ##### Programming operation functions #####
<> 144:ef7eb2e8f9f7 97 ===============================================================================
<> 144:ef7eb2e8f9f7 98 [..]
<> 144:ef7eb2e8f9f7 99 This subsection provides a set of functions allowing to manage the FLASH
<> 144:ef7eb2e8f9f7 100 program operations.
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 [..] The FLASH Memory Programming functions, includes the following functions:
<> 144:ef7eb2e8f9f7 103 (+) HAL_FLASH_Unlock(void);
<> 144:ef7eb2e8f9f7 104 (+) HAL_FLASH_Lock(void);
<> 144:ef7eb2e8f9f7 105 (+) HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 106 (+) HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 [..] Any operation of erase or program should follow these steps:
<> 144:ef7eb2e8f9f7 109 (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and
<> 144:ef7eb2e8f9f7 110 program memory access.
<> 144:ef7eb2e8f9f7 111 (#) Call the desired function to erase page or program data.
<> 144:ef7eb2e8f9f7 112 (#) Call the HAL_FLASH_Lock() to disable the flash program memory access
<> 144:ef7eb2e8f9f7 113 (recommended to protect the FLASH memory against possible unwanted operation).
<> 144:ef7eb2e8f9f7 114
<> 144:ef7eb2e8f9f7 115 ==============================================================================
<> 144:ef7eb2e8f9f7 116 ##### Option Bytes Programming functions #####
<> 144:ef7eb2e8f9f7 117 ==============================================================================
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 [..] The FLASH_Option Bytes Programming_functions, includes the following functions:
<> 144:ef7eb2e8f9f7 120 (+) HAL_FLASH_OB_Unlock(void);
<> 144:ef7eb2e8f9f7 121 (+) HAL_FLASH_OB_Lock(void);
<> 144:ef7eb2e8f9f7 122 (+) HAL_FLASH_OB_Launch(void);
<> 144:ef7eb2e8f9f7 123 (+) HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);
<> 144:ef7eb2e8f9f7 124 (+) HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);
<> 144:ef7eb2e8f9f7 125
<> 144:ef7eb2e8f9f7 126 [..] Any operation of erase or program should follow these steps:
<> 144:ef7eb2e8f9f7 127 (#) Call the HAL_FLASH_OB_Unlock() function to enable the Flash option control
<> 144:ef7eb2e8f9f7 128 register access.
<> 144:ef7eb2e8f9f7 129 (#) Call the following functions to program the desired option bytes.
<> 144:ef7eb2e8f9f7 130 (++) HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);
<> 144:ef7eb2e8f9f7 131 (#) Once all needed option bytes to be programmed are correctly written, call the
<> 144:ef7eb2e8f9f7 132 HAL_FLASH_OB_Launch(void) function to launch the Option Bytes programming process.
<> 144:ef7eb2e8f9f7 133 (#) Call the HAL_FLASH_OB_Lock() to disable the Flash option control register access (recommended
<> 144:ef7eb2e8f9f7 134 to protect the option Bytes against possible unwanted operations).
<> 144:ef7eb2e8f9f7 135
<> 144:ef7eb2e8f9f7 136 [..] Proprietary code Read Out Protection (PcROP):
<> 144:ef7eb2e8f9f7 137 (#) The PcROP sector is selected by using the same option bytes as the Write
<> 144:ef7eb2e8f9f7 138 protection. As a result, these 2 options are exclusive each other.
<> 144:ef7eb2e8f9f7 139 (#) To activate PCROP mode for Flash sectors(s), you need to follow the sequence below:
<> 144:ef7eb2e8f9f7 140 (++) Use this function HAL_FLASHEx_AdvOBProgram with PCROPState = OB_PCROP_STATE_ENABLE.
<> 144:ef7eb2e8f9f7 141
<> 144:ef7eb2e8f9f7 142 * @endverbatim
<> 144:ef7eb2e8f9f7 143 *
<> 144:ef7eb2e8f9f7 144 ******************************************************************************
<> 144:ef7eb2e8f9f7 145 * @attention
<> 144:ef7eb2e8f9f7 146 *
<> 144:ef7eb2e8f9f7 147 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 148 *
<> 144:ef7eb2e8f9f7 149 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 150 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 151 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 152 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 153 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 154 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 155 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 156 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 157 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 158 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 159 *
<> 144:ef7eb2e8f9f7 160 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 161 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 162 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 163 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 164 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 165 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 166 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 167 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 168 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 169 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 170 *
<> 144:ef7eb2e8f9f7 171 ******************************************************************************
<> 144:ef7eb2e8f9f7 172 */
<> 144:ef7eb2e8f9f7 173
<> 144:ef7eb2e8f9f7 174 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 175 #include "stm32l0xx_hal.h"
<> 144:ef7eb2e8f9f7 176
<> 144:ef7eb2e8f9f7 177 /** @addtogroup STM32L0xx_HAL_Driver
<> 144:ef7eb2e8f9f7 178 * @{
<> 144:ef7eb2e8f9f7 179 */
<> 144:ef7eb2e8f9f7 180
<> 144:ef7eb2e8f9f7 181 #ifdef HAL_FLASH_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 182
<> 144:ef7eb2e8f9f7 183 /** @addtogroup FLASH FLASH
<> 144:ef7eb2e8f9f7 184 * @brief FLASH driver modules
<> 144:ef7eb2e8f9f7 185 * @{
<> 144:ef7eb2e8f9f7 186 */
<> 144:ef7eb2e8f9f7 187
<> 144:ef7eb2e8f9f7 188
<> 144:ef7eb2e8f9f7 189 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 190 /* Private define ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 191 /* Private macro -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 192 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 193 /** @addtogroup FLASH_Private
<> 144:ef7eb2e8f9f7 194 * @{
<> 144:ef7eb2e8f9f7 195 */
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 /**
<> 144:ef7eb2e8f9f7 198 * @brief Variable used for Program/Erase sectors under interruption
<> 144:ef7eb2e8f9f7 199 */
<> 144:ef7eb2e8f9f7 200 FLASH_ProcessTypeDef ProcFlash;
<> 144:ef7eb2e8f9f7 201
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 /* Private function prototypes -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 204 static void FLASH_SetErrorCode(void);
<> 144:ef7eb2e8f9f7 205 static void FLASH_Program_Word(uint32_t Address, uint32_t Data);
<> 144:ef7eb2e8f9f7 206
<> 144:ef7eb2e8f9f7 207 /**
<> 144:ef7eb2e8f9f7 208 * @}
<> 144:ef7eb2e8f9f7 209 */
<> 144:ef7eb2e8f9f7 210
<> 144:ef7eb2e8f9f7 211 /* functions -----------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 212
<> 144:ef7eb2e8f9f7 213 /** @addtogroup FLASH_Exported_Functions
<> 144:ef7eb2e8f9f7 214 * @{
<> 144:ef7eb2e8f9f7 215 */
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217 /** @addtogroup FLASH_Exported_Functions_Group1
<> 144:ef7eb2e8f9f7 218 * @brief Programming operation functions
<> 144:ef7eb2e8f9f7 219 *
<> 144:ef7eb2e8f9f7 220 @verbatim
<> 144:ef7eb2e8f9f7 221 @endverbatim
<> 144:ef7eb2e8f9f7 222 * @{
<> 144:ef7eb2e8f9f7 223 */
<> 144:ef7eb2e8f9f7 224 /**
<> 144:ef7eb2e8f9f7 225 * @brief Program word at a specified address
<> 144:ef7eb2e8f9f7 226 * @note To correctly run this function, the HAL_FLASH_Unlock() function
<> 144:ef7eb2e8f9f7 227 * must be called before.
<> 144:ef7eb2e8f9f7 228 * Call the HAL_FLASH_Lock() to disable the flash memory access
<> 144:ef7eb2e8f9f7 229 * (recommended to protect the FLASH memory against possible unwanted operation).
<> 144:ef7eb2e8f9f7 230 * @param TypeProgram: Indicate the way to program at a specified address.
<> 144:ef7eb2e8f9f7 231 * This parameter can be a value of @ref FLASH_Type_Program
<> 144:ef7eb2e8f9f7 232 * @param Address: specifies the address to be programmed.
<> 144:ef7eb2e8f9f7 233 * @param Data: specifies the data to be programmed
<> 144:ef7eb2e8f9f7 234 *
<> 144:ef7eb2e8f9f7 235 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 236 */
<> 144:ef7eb2e8f9f7 237 HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 238 {
<> 144:ef7eb2e8f9f7 239 HAL_StatusTypeDef status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 240
<> 144:ef7eb2e8f9f7 241 /* Process Locked */
<> 144:ef7eb2e8f9f7 242 __HAL_LOCK(&ProcFlash);
<> 144:ef7eb2e8f9f7 243
<> 144:ef7eb2e8f9f7 244 /* Check the parameters */
<> 144:ef7eb2e8f9f7 245 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
<> 144:ef7eb2e8f9f7 246
<> 144:ef7eb2e8f9f7 247 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 248 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 249
<> 144:ef7eb2e8f9f7 250 if(status == HAL_OK)
<> 144:ef7eb2e8f9f7 251 {
<> 144:ef7eb2e8f9f7 252 /* Program word (32-bit) at a specified address */
<> 144:ef7eb2e8f9f7 253 FLASH_Program_Word(Address, (uint32_t) Data);
<> 144:ef7eb2e8f9f7 254
<> 144:ef7eb2e8f9f7 255 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 256 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 257 }
<> 144:ef7eb2e8f9f7 258
<> 144:ef7eb2e8f9f7 259 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 260 __HAL_UNLOCK(&ProcFlash);
<> 144:ef7eb2e8f9f7 261
<> 144:ef7eb2e8f9f7 262 return status;
<> 144:ef7eb2e8f9f7 263 }
<> 144:ef7eb2e8f9f7 264
<> 144:ef7eb2e8f9f7 265 /**
<> 144:ef7eb2e8f9f7 266 * @brief Program word at a specified address with interrupt enabled.
<> 144:ef7eb2e8f9f7 267 * @param TypeProgram: Indicate the way to program at a specified address.
<> 144:ef7eb2e8f9f7 268 * This parameter can be a value of @ref FLASH_Type_Program
<> 144:ef7eb2e8f9f7 269 * @param Address: specifies the address to be programmed.
<> 144:ef7eb2e8f9f7 270 * @param Data: specifies the data to be programmed
<> 144:ef7eb2e8f9f7 271 *
<> 144:ef7eb2e8f9f7 272 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 273 */
<> 144:ef7eb2e8f9f7 274 HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 275 {
<> 144:ef7eb2e8f9f7 276 HAL_StatusTypeDef status = HAL_OK;
<> 144:ef7eb2e8f9f7 277
<> 144:ef7eb2e8f9f7 278 /* Process Locked */
<> 144:ef7eb2e8f9f7 279 __HAL_LOCK(&ProcFlash);
<> 144:ef7eb2e8f9f7 280
<> 144:ef7eb2e8f9f7 281 /* Check the parameters */
<> 144:ef7eb2e8f9f7 282 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
<> 144:ef7eb2e8f9f7 283
<> 144:ef7eb2e8f9f7 284 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 285 status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
<> 144:ef7eb2e8f9f7 286
<> 144:ef7eb2e8f9f7 287 if(status == HAL_OK)
<> 144:ef7eb2e8f9f7 288 {
<> 144:ef7eb2e8f9f7 289 /* Enable End of FLASH Operation interrupt */
<> 144:ef7eb2e8f9f7 290 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
<> 144:ef7eb2e8f9f7 291
<> 144:ef7eb2e8f9f7 292 /* Enable Error source interrupt */
<> 144:ef7eb2e8f9f7 293 __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
<> 144:ef7eb2e8f9f7 294
<> 144:ef7eb2e8f9f7 295 ProcFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM;
<> 144:ef7eb2e8f9f7 296 ProcFlash.Address = Address;
<> 144:ef7eb2e8f9f7 297
<> 144:ef7eb2e8f9f7 298 if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
<> 144:ef7eb2e8f9f7 299 {
<> 144:ef7eb2e8f9f7 300 /* Program word (32-bit) at a specified address */
<> 144:ef7eb2e8f9f7 301 FLASH_Program_Word(Address, (uint32_t) Data);
<> 144:ef7eb2e8f9f7 302 }
<> 144:ef7eb2e8f9f7 303 }
<> 144:ef7eb2e8f9f7 304 return status;
<> 144:ef7eb2e8f9f7 305 }
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 /**
<> 144:ef7eb2e8f9f7 308 * @brief This function handles FLASH interrupt request.
<> 144:ef7eb2e8f9f7 309 * @retval None
<> 144:ef7eb2e8f9f7 310 */
<> 144:ef7eb2e8f9f7 311 void HAL_FLASH_IRQHandler(void)
<> 144:ef7eb2e8f9f7 312 {
<> 144:ef7eb2e8f9f7 313 uint32_t temp;
<> 144:ef7eb2e8f9f7 314
<> 144:ef7eb2e8f9f7 315 /* Check FLASH operation error flags */
<> 144:ef7eb2e8f9f7 316
<> 144:ef7eb2e8f9f7 317 /* WARNING : On the first cut of STM32L031xx and STM32L041xx devices,
<> 144:ef7eb2e8f9f7 318 * (RevID = 0x1000) the FLASH_FLAG_OPTVERR bit was not behaving
<> 144:ef7eb2e8f9f7 319 * as expected. If the user run an application using the first
<> 144:ef7eb2e8f9f7 320 * cut of the STM32L031xx device or the first cut of the STM32L041xx
<> 144:ef7eb2e8f9f7 321 * device, the check on the FLASH_FLAG_OPTVERR bit should be ignored.
<> 144:ef7eb2e8f9f7 322 *
<> 144:ef7eb2e8f9f7 323 * Note :The RevID of the device can be retrieved via the HAL_GetREVID()
<> 144:ef7eb2e8f9f7 324 * function.
<> 144:ef7eb2e8f9f7 325 *
<> 144:ef7eb2e8f9f7 326 */
<> 144:ef7eb2e8f9f7 327
<> 144:ef7eb2e8f9f7 328 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | \
<> 144:ef7eb2e8f9f7 329 FLASH_FLAG_RDERR | FLASH_FLAG_FWWERR | FLASH_FLAG_NOTZEROERR) != RESET)
<> 144:ef7eb2e8f9f7 330 {
<> 144:ef7eb2e8f9f7 331 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
<> 144:ef7eb2e8f9f7 332 {
<> 144:ef7eb2e8f9f7 333 /* Return the faulty sector */
<> 144:ef7eb2e8f9f7 334 temp = ProcFlash.Page;
<> 144:ef7eb2e8f9f7 335 ProcFlash.Page = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 336 }
<> 144:ef7eb2e8f9f7 337 else
<> 144:ef7eb2e8f9f7 338 {
<> 144:ef7eb2e8f9f7 339 /* Return the faulty address */
<> 144:ef7eb2e8f9f7 340 temp = ProcFlash.Address;
<> 144:ef7eb2e8f9f7 341 }
<> 144:ef7eb2e8f9f7 342
<> 144:ef7eb2e8f9f7 343 /* Save the Error code */
<> 144:ef7eb2e8f9f7 344 FLASH_SetErrorCode();
<> 144:ef7eb2e8f9f7 345
<> 144:ef7eb2e8f9f7 346 /* FLASH error interrupt user callback */
<> 144:ef7eb2e8f9f7 347 HAL_FLASH_OperationErrorCallback(temp);
<> 144:ef7eb2e8f9f7 348
<> 144:ef7eb2e8f9f7 349 /* Stop the procedure ongoing */
<> 144:ef7eb2e8f9f7 350 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
<> 144:ef7eb2e8f9f7 351 }
<> 144:ef7eb2e8f9f7 352
<> 144:ef7eb2e8f9f7 353 /* Check FLASH End of Operation flag */
<> 144:ef7eb2e8f9f7 354 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET)
<> 144:ef7eb2e8f9f7 355 {
<> 144:ef7eb2e8f9f7 356 /* Clear FLASH End of Operation pending bit */
<> 144:ef7eb2e8f9f7 357 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
<> 144:ef7eb2e8f9f7 358
<> 144:ef7eb2e8f9f7 359 /* Process can continue only if no error detected */
<> 144:ef7eb2e8f9f7 360 if(ProcFlash.ProcedureOnGoing != FLASH_PROC_NONE)
<> 144:ef7eb2e8f9f7 361 {
<> 144:ef7eb2e8f9f7 362 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
<> 144:ef7eb2e8f9f7 363 {
<> 144:ef7eb2e8f9f7 364 /* Nb of sector to erased can be decreased */
<> 144:ef7eb2e8f9f7 365 ProcFlash.NbPagesToErase--;
<> 144:ef7eb2e8f9f7 366
<> 144:ef7eb2e8f9f7 367 /* Check if there are still sectors to erase */
<> 144:ef7eb2e8f9f7 368 if(ProcFlash.NbPagesToErase != 0)
<> 144:ef7eb2e8f9f7 369 {
<> 144:ef7eb2e8f9f7 370 temp = ProcFlash.Page;
<> 144:ef7eb2e8f9f7 371 /* Indicate user which sector has been erased */
<> 144:ef7eb2e8f9f7 372 HAL_FLASH_EndOfOperationCallback(temp);
<> 144:ef7eb2e8f9f7 373
<> 144:ef7eb2e8f9f7 374 /* Increment sector number */
<> 144:ef7eb2e8f9f7 375 temp = ProcFlash.Page + FLASH_PAGE_SIZE;
<> 144:ef7eb2e8f9f7 376 ProcFlash.Page = ProcFlash.Page + FLASH_PAGE_SIZE;
<> 144:ef7eb2e8f9f7 377
<> 144:ef7eb2e8f9f7 378 /* If the erase operation is completed, disable the ERASE Bit */
<> 144:ef7eb2e8f9f7 379 CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
<> 144:ef7eb2e8f9f7 380
<> 144:ef7eb2e8f9f7 381 FLASH_ErasePage(temp);
<> 144:ef7eb2e8f9f7 382 }
<> 144:ef7eb2e8f9f7 383 else
<> 144:ef7eb2e8f9f7 384 {
<> 144:ef7eb2e8f9f7 385 /* No more sectors to Erase, user callback can be called */
<> 144:ef7eb2e8f9f7 386 /* Reset Sector and stop Erase sectors procedure */
<> 144:ef7eb2e8f9f7 387 ProcFlash.Page = temp = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 388 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
<> 144:ef7eb2e8f9f7 389 /* FLASH EOP interrupt user callback */
<> 144:ef7eb2e8f9f7 390 HAL_FLASH_EndOfOperationCallback(temp);
<> 144:ef7eb2e8f9f7 391 }
<> 144:ef7eb2e8f9f7 392 }
<> 144:ef7eb2e8f9f7 393 else
<> 144:ef7eb2e8f9f7 394 {
<> 144:ef7eb2e8f9f7 395 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_PROGRAM)
<> 144:ef7eb2e8f9f7 396 {
<> 144:ef7eb2e8f9f7 397 /* If the program operation is completed, disable the PROG Bit */
<> 144:ef7eb2e8f9f7 398 CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
<> 144:ef7eb2e8f9f7 399 /* Program ended. Return the selected address */
<> 144:ef7eb2e8f9f7 400 /* FLASH EOP interrupt user callback */
<> 144:ef7eb2e8f9f7 401 HAL_FLASH_EndOfOperationCallback(ProcFlash.Address);
<> 144:ef7eb2e8f9f7 402 }
<> 144:ef7eb2e8f9f7 403 ProcFlash.ProcedureOnGoing = FLASH_PROC_NONE;
<> 144:ef7eb2e8f9f7 404 }
<> 144:ef7eb2e8f9f7 405 }
<> 144:ef7eb2e8f9f7 406 }
<> 144:ef7eb2e8f9f7 407
<> 144:ef7eb2e8f9f7 408 if(ProcFlash.ProcedureOnGoing == FLASH_PROC_NONE)
<> 144:ef7eb2e8f9f7 409 {
<> 144:ef7eb2e8f9f7 410 /* Operation is completed, disable the PG and PER Bits */
<> 144:ef7eb2e8f9f7 411 CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE | FLASH_PECR_PROG);
<> 144:ef7eb2e8f9f7 412
<> 144:ef7eb2e8f9f7 413 /* Disable End of FLASH Operation interrupt */
<> 144:ef7eb2e8f9f7 414 __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
<> 144:ef7eb2e8f9f7 415
<> 144:ef7eb2e8f9f7 416 /* Disable Error source interrupt */
<> 144:ef7eb2e8f9f7 417 __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR);
<> 144:ef7eb2e8f9f7 418
<> 144:ef7eb2e8f9f7 419 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 420 __HAL_UNLOCK(&ProcFlash);
<> 144:ef7eb2e8f9f7 421 }
<> 144:ef7eb2e8f9f7 422
<> 144:ef7eb2e8f9f7 423 }
<> 144:ef7eb2e8f9f7 424
<> 144:ef7eb2e8f9f7 425 /**
<> 144:ef7eb2e8f9f7 426 * @brief FLASH end of operation interrupt callback
<> 144:ef7eb2e8f9f7 427 * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure
<> 144:ef7eb2e8f9f7 428 * - Pages Erase: Sector which has been erased
<> 144:ef7eb2e8f9f7 429 * (if 0xFFFFFFFF, it means that all the selected sectors have been erased)
<> 144:ef7eb2e8f9f7 430 * - Program: Address which was selected for data program
<> 144:ef7eb2e8f9f7 431 * @retval none
<> 144:ef7eb2e8f9f7 432 */
<> 144:ef7eb2e8f9f7 433 __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
<> 144:ef7eb2e8f9f7 434 {
<> 144:ef7eb2e8f9f7 435 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 436 UNUSED(ReturnValue);
<> 144:ef7eb2e8f9f7 437
<> 144:ef7eb2e8f9f7 438 /* NOTE : This function Should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 439 the HAL_FLASH_EndOfOperationCallback could be implemented in the user file
<> 144:ef7eb2e8f9f7 440 */
<> 144:ef7eb2e8f9f7 441 }
<> 144:ef7eb2e8f9f7 442
<> 144:ef7eb2e8f9f7 443 /**
<> 144:ef7eb2e8f9f7 444 * @brief FLASH operation error interrupt callback
<> 144:ef7eb2e8f9f7 445 * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure
<> 144:ef7eb2e8f9f7 446 * - Pagess Erase: Sector number which returned an error
<> 144:ef7eb2e8f9f7 447 * - Program: Address which was selected for data program
<> 144:ef7eb2e8f9f7 448 * @retval none
<> 144:ef7eb2e8f9f7 449 */
<> 144:ef7eb2e8f9f7 450 __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
<> 144:ef7eb2e8f9f7 451 {
<> 144:ef7eb2e8f9f7 452 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 453 UNUSED(ReturnValue);
<> 144:ef7eb2e8f9f7 454
<> 144:ef7eb2e8f9f7 455 /* NOTE : This function Should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 456 the HAL_FLASH_OperationErrorCallback could be implemented in the user file
<> 144:ef7eb2e8f9f7 457 */
<> 144:ef7eb2e8f9f7 458 }
<> 144:ef7eb2e8f9f7 459
<> 144:ef7eb2e8f9f7 460 /**
<> 144:ef7eb2e8f9f7 461 * @}
<> 144:ef7eb2e8f9f7 462 */
<> 144:ef7eb2e8f9f7 463
<> 144:ef7eb2e8f9f7 464 /** @addtogroup FLASH_Exported_Functions_Group2
<> 144:ef7eb2e8f9f7 465 * @brief management functions
<> 144:ef7eb2e8f9f7 466 *
<> 144:ef7eb2e8f9f7 467 @verbatim
<> 144:ef7eb2e8f9f7 468 ===============================================================================
<> 144:ef7eb2e8f9f7 469 ##### Peripheral Control functions #####
<> 144:ef7eb2e8f9f7 470 ===============================================================================
<> 144:ef7eb2e8f9f7 471 [..]
<> 144:ef7eb2e8f9f7 472 This subsection provides a set of functions allowing to control the FLASH
<> 144:ef7eb2e8f9f7 473 memory operations.
<> 144:ef7eb2e8f9f7 474
<> 144:ef7eb2e8f9f7 475 @endverbatim
<> 144:ef7eb2e8f9f7 476 * @{
<> 144:ef7eb2e8f9f7 477 */
<> 144:ef7eb2e8f9f7 478
<> 144:ef7eb2e8f9f7 479 /**
<> 144:ef7eb2e8f9f7 480 * @brief Unlock the FLASH control register access
<> 144:ef7eb2e8f9f7 481 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 482 */
<> 144:ef7eb2e8f9f7 483 HAL_StatusTypeDef HAL_FLASH_Unlock(void)
<> 144:ef7eb2e8f9f7 484 {
<> 144:ef7eb2e8f9f7 485 if((FLASH->PECR & FLASH_PECR_PRGLOCK) != RESET)
<> 144:ef7eb2e8f9f7 486 {
<> 144:ef7eb2e8f9f7 487 /* Unlocking FLASH_PECR register access */
<> 144:ef7eb2e8f9f7 488 if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
<> 144:ef7eb2e8f9f7 489 {
<> 144:ef7eb2e8f9f7 490 FLASH->PEKEYR = FLASH_PEKEY1;
<> 144:ef7eb2e8f9f7 491 FLASH->PEKEYR = FLASH_PEKEY2;
<> 144:ef7eb2e8f9f7 492 }
<> 144:ef7eb2e8f9f7 493
<> 144:ef7eb2e8f9f7 494 /* Unlocking the program memory access */
<> 144:ef7eb2e8f9f7 495 FLASH->PRGKEYR = FLASH_PRGKEY1;
<> 144:ef7eb2e8f9f7 496 FLASH->PRGKEYR = FLASH_PRGKEY2;
<> 144:ef7eb2e8f9f7 497 }
<> 144:ef7eb2e8f9f7 498 else
<> 144:ef7eb2e8f9f7 499 {
<> 144:ef7eb2e8f9f7 500 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 501 }
<> 144:ef7eb2e8f9f7 502
<> 144:ef7eb2e8f9f7 503 return HAL_OK;
<> 144:ef7eb2e8f9f7 504 }
<> 144:ef7eb2e8f9f7 505
<> 144:ef7eb2e8f9f7 506 /**
<> 144:ef7eb2e8f9f7 507 * @brief Locks the FLASH control register access
<> 144:ef7eb2e8f9f7 508 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 509 */
<> 144:ef7eb2e8f9f7 510 HAL_StatusTypeDef HAL_FLASH_Lock(void)
<> 144:ef7eb2e8f9f7 511 {
<> 144:ef7eb2e8f9f7 512 /* Set the PRGLOCK Bit to lock the program memory access */
<> 144:ef7eb2e8f9f7 513 SET_BIT(FLASH->PECR, FLASH_PECR_PRGLOCK);
<> 144:ef7eb2e8f9f7 514
<> 144:ef7eb2e8f9f7 515 return HAL_OK;
<> 144:ef7eb2e8f9f7 516 }
<> 144:ef7eb2e8f9f7 517
<> 144:ef7eb2e8f9f7 518 /**
<> 144:ef7eb2e8f9f7 519 * @brief Unlock the FLASH Option Control Registers access.
<> 144:ef7eb2e8f9f7 520 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 521 */
<> 144:ef7eb2e8f9f7 522 HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
<> 144:ef7eb2e8f9f7 523 {
<> 144:ef7eb2e8f9f7 524 if((FLASH->PECR & FLASH_PECR_OPTLOCK) != RESET)
<> 144:ef7eb2e8f9f7 525 {
<> 144:ef7eb2e8f9f7 526 /* Unlocking FLASH_PECR register access */
<> 144:ef7eb2e8f9f7 527 if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
<> 144:ef7eb2e8f9f7 528 {
<> 144:ef7eb2e8f9f7 529 FLASH->PEKEYR = FLASH_PEKEY1;
<> 144:ef7eb2e8f9f7 530 FLASH->PEKEYR = FLASH_PEKEY2;
<> 144:ef7eb2e8f9f7 531 }
<> 144:ef7eb2e8f9f7 532
<> 144:ef7eb2e8f9f7 533 /* Unlocking the option bytes block access */
<> 144:ef7eb2e8f9f7 534 FLASH->OPTKEYR = FLASH_OPTKEY1;
<> 144:ef7eb2e8f9f7 535 FLASH->OPTKEYR = FLASH_OPTKEY2;
<> 144:ef7eb2e8f9f7 536 }
<> 144:ef7eb2e8f9f7 537 else
<> 144:ef7eb2e8f9f7 538 {
<> 144:ef7eb2e8f9f7 539 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 540 }
<> 144:ef7eb2e8f9f7 541
<> 144:ef7eb2e8f9f7 542 return HAL_OK;
<> 144:ef7eb2e8f9f7 543 }
<> 144:ef7eb2e8f9f7 544
<> 144:ef7eb2e8f9f7 545 /**
<> 144:ef7eb2e8f9f7 546 * @brief Lock the FLASH Option Control Registers access.
<> 144:ef7eb2e8f9f7 547 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 548 */
<> 144:ef7eb2e8f9f7 549 HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
<> 144:ef7eb2e8f9f7 550 {
<> 144:ef7eb2e8f9f7 551 /* Set the OPTLOCK Bit to lock the option bytes block access */
<> 144:ef7eb2e8f9f7 552 SET_BIT(FLASH->PECR, FLASH_PECR_OPTLOCK);
<> 144:ef7eb2e8f9f7 553
<> 144:ef7eb2e8f9f7 554 return HAL_OK;
<> 144:ef7eb2e8f9f7 555 }
<> 144:ef7eb2e8f9f7 556
<> 144:ef7eb2e8f9f7 557 /**
<> 144:ef7eb2e8f9f7 558 * @brief Launch the option byte loading.
<> 144:ef7eb2e8f9f7 559 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 560 */
<> 144:ef7eb2e8f9f7 561 HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
<> 144:ef7eb2e8f9f7 562 {
<> 144:ef7eb2e8f9f7 563 /* Clean the error context */
<> 144:ef7eb2e8f9f7 564 ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 565
<> 144:ef7eb2e8f9f7 566 /* Set the OBL_Launch bit to lauch the option byte loading */
<> 144:ef7eb2e8f9f7 567 SET_BIT(FLASH->PECR, FLASH_PECR_OBL_LAUNCH);
<> 144:ef7eb2e8f9f7 568
<> 144:ef7eb2e8f9f7 569 /* Wait for last operation to be completed */
<> 144:ef7eb2e8f9f7 570 return(FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE
<> 144:ef7eb2e8f9f7 571 ));
<> 144:ef7eb2e8f9f7 572 }
<> 144:ef7eb2e8f9f7 573
<> 144:ef7eb2e8f9f7 574 /**
<> 144:ef7eb2e8f9f7 575 * @}
<> 144:ef7eb2e8f9f7 576 */
<> 144:ef7eb2e8f9f7 577
<> 144:ef7eb2e8f9f7 578 /** @addtogroup FLASH_Exported_Functions_Group3
<> 144:ef7eb2e8f9f7 579 * @brief Peripheral Errors functions
<> 144:ef7eb2e8f9f7 580 *
<> 144:ef7eb2e8f9f7 581 @verbatim
<> 144:ef7eb2e8f9f7 582 ===============================================================================
<> 144:ef7eb2e8f9f7 583 ##### Peripheral Errors functions #####
<> 144:ef7eb2e8f9f7 584 ===============================================================================
<> 144:ef7eb2e8f9f7 585 [..]
<> 144:ef7eb2e8f9f7 586 This subsection permit to get in run-time Errors of the FLASH peripheral.
<> 144:ef7eb2e8f9f7 587
<> 144:ef7eb2e8f9f7 588 @endverbatim
<> 144:ef7eb2e8f9f7 589 * @{
<> 144:ef7eb2e8f9f7 590 */
<> 144:ef7eb2e8f9f7 591
<> 144:ef7eb2e8f9f7 592 /**
<> 144:ef7eb2e8f9f7 593 * @brief Get the specific FLASH error flag.
<> 144:ef7eb2e8f9f7 594 * @retval uint32_t: The returned value can be a mixed of :
<> 144:ef7eb2e8f9f7 595 * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP)
<> 144:ef7eb2e8f9f7 596 * @arg HAL_FLASH_ERROR_SIZE: FLASH Programming Parallelism error flag
<> 144:ef7eb2e8f9f7 597 * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag
<> 144:ef7eb2e8f9f7 598 * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag
<> 144:ef7eb2e8f9f7 599 * @arg HAL_FLASH_ERROR_OPTV: FLASH Option valid error flag
<> 144:ef7eb2e8f9f7 600 * @arg HAL_FLASH_ERROR_FWWERR: FLASH Write or Errase operation aborted
<> 144:ef7eb2e8f9f7 601 * @arg HAL_FLASH_ERROR_NOTZERO: FLASH Write operation is done in a not-erased region
<> 144:ef7eb2e8f9f7 602 */
<> 144:ef7eb2e8f9f7 603 uint32_t HAL_FLASH_GetError(void)
<> 144:ef7eb2e8f9f7 604 {
<> 144:ef7eb2e8f9f7 605 return ProcFlash.ErrorCode;
<> 144:ef7eb2e8f9f7 606 }
<> 144:ef7eb2e8f9f7 607
<> 144:ef7eb2e8f9f7 608 /**
<> 144:ef7eb2e8f9f7 609 * @}
<> 144:ef7eb2e8f9f7 610 */
<> 144:ef7eb2e8f9f7 611
<> 144:ef7eb2e8f9f7 612 /**
<> 144:ef7eb2e8f9f7 613 * @}
<> 144:ef7eb2e8f9f7 614 */
<> 144:ef7eb2e8f9f7 615
<> 144:ef7eb2e8f9f7 616 /** @addtogroup FLASH_Private
<> 144:ef7eb2e8f9f7 617 * @{
<> 144:ef7eb2e8f9f7 618 */
<> 144:ef7eb2e8f9f7 619
<> 144:ef7eb2e8f9f7 620 /**
<> 144:ef7eb2e8f9f7 621 * @brief Wait for a FLASH operation to complete.
<> 144:ef7eb2e8f9f7 622 * @param Timeout: maximum flash operationtimeout
<> 144:ef7eb2e8f9f7 623 * @retval HAL status
<> 144:ef7eb2e8f9f7 624 */
<> 144:ef7eb2e8f9f7 625 HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
<> 144:ef7eb2e8f9f7 626 {
<> 144:ef7eb2e8f9f7 627 /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
<> 144:ef7eb2e8f9f7 628 Even if the FLASH operation fails, the BUSY flag will be reset and an error
<> 144:ef7eb2e8f9f7 629 flag will be set */
<> 144:ef7eb2e8f9f7 630
<> 144:ef7eb2e8f9f7 631 uint32_t tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 632
<> 144:ef7eb2e8f9f7 633 while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET)
<> 144:ef7eb2e8f9f7 634 {
<> 144:ef7eb2e8f9f7 635 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 636 {
<> 144:ef7eb2e8f9f7 637 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 638 {
<> 144:ef7eb2e8f9f7 639 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 640 }
<> 144:ef7eb2e8f9f7 641 }
<> 144:ef7eb2e8f9f7 642 }
<> 144:ef7eb2e8f9f7 643
<> 144:ef7eb2e8f9f7 644 /* Check FLASH End of Operation flag */
<> 144:ef7eb2e8f9f7 645 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
<> 144:ef7eb2e8f9f7 646 {
<> 144:ef7eb2e8f9f7 647 /* Clear FLASH End of Operation pending bit */
<> 144:ef7eb2e8f9f7 648 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
<> 144:ef7eb2e8f9f7 649 }
<> 144:ef7eb2e8f9f7 650
<> 144:ef7eb2e8f9f7 651
<> 144:ef7eb2e8f9f7 652 if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) || \
<> 144:ef7eb2e8f9f7 653 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR) != RESET) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) != RESET) || \
<> 144:ef7eb2e8f9f7 654 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_FWWERR) != RESET) || \
<> 144:ef7eb2e8f9f7 655 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_NOTZEROERR) != RESET))
<> 144:ef7eb2e8f9f7 656 {
<> 144:ef7eb2e8f9f7 657 /* Save the error code */
<> 144:ef7eb2e8f9f7 658
<> 144:ef7eb2e8f9f7 659 /* WARNING : On the first cut of STM32L031xx and STM32L041xx devices,
<> 144:ef7eb2e8f9f7 660 * (RefID = 0x1000) the FLASH_FLAG_OPTVERR bit was not behaving
<> 144:ef7eb2e8f9f7 661 * as expected. If the user run an application using the first
<> 144:ef7eb2e8f9f7 662 * cut of the STM32L031xx device or the first cut of the STM32L041xx
<> 144:ef7eb2e8f9f7 663 * device, this error should be ignored. The revId of the device
<> 144:ef7eb2e8f9f7 664 * can be retrieved via the HAL_GetREVID() function.
<> 144:ef7eb2e8f9f7 665 *
<> 144:ef7eb2e8f9f7 666 */
<> 144:ef7eb2e8f9f7 667 FLASH_SetErrorCode();
<> 144:ef7eb2e8f9f7 668 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 669 }
<> 144:ef7eb2e8f9f7 670
<> 144:ef7eb2e8f9f7 671 /* There is no error flag set */
<> 144:ef7eb2e8f9f7 672 return HAL_OK;
<> 144:ef7eb2e8f9f7 673 }
<> 144:ef7eb2e8f9f7 674
<> 144:ef7eb2e8f9f7 675 /**
<> 144:ef7eb2e8f9f7 676 * @brief Set the specific FLASH error flag.
<> 144:ef7eb2e8f9f7 677 * @retval None
<> 144:ef7eb2e8f9f7 678 */
<> 144:ef7eb2e8f9f7 679 static void FLASH_SetErrorCode(void)
<> 144:ef7eb2e8f9f7 680 {
<> 144:ef7eb2e8f9f7 681 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR))
<> 144:ef7eb2e8f9f7 682 {
<> 144:ef7eb2e8f9f7 683 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_WRP;
<> 144:ef7eb2e8f9f7 684 }
<> 144:ef7eb2e8f9f7 685 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR))
<> 144:ef7eb2e8f9f7 686 {
<> 144:ef7eb2e8f9f7 687 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_PGA;
<> 144:ef7eb2e8f9f7 688 }
<> 144:ef7eb2e8f9f7 689 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR))
<> 144:ef7eb2e8f9f7 690 {
<> 144:ef7eb2e8f9f7 691 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_SIZE;
<> 144:ef7eb2e8f9f7 692 }
<> 144:ef7eb2e8f9f7 693 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR))
<> 144:ef7eb2e8f9f7 694 {
<> 144:ef7eb2e8f9f7 695 /* WARNING : On the first cut of STM32L031xx and STM32L041xx devices,
<> 144:ef7eb2e8f9f7 696 * (RefID = 0x1000) the FLASH_FLAG_OPTVERR bit was not behaving
<> 144:ef7eb2e8f9f7 697 * as expected. If the user run an application using the first
<> 144:ef7eb2e8f9f7 698 * cut of the STM32L031xx device or the first cut of the STM32L041xx
<> 144:ef7eb2e8f9f7 699 * device, this error should be ignored. The revId of the device
<> 144:ef7eb2e8f9f7 700 * can be retrieved via the HAL_GetREVID() function.
<> 144:ef7eb2e8f9f7 701 *
<> 144:ef7eb2e8f9f7 702 */
<> 144:ef7eb2e8f9f7 703 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_OPTV;
<> 144:ef7eb2e8f9f7 704 }
<> 144:ef7eb2e8f9f7 705 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR))
<> 144:ef7eb2e8f9f7 706 {
<> 144:ef7eb2e8f9f7 707 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_RD;
<> 144:ef7eb2e8f9f7 708 }
<> 144:ef7eb2e8f9f7 709 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_FWWERR))
<> 144:ef7eb2e8f9f7 710 {
<> 144:ef7eb2e8f9f7 711 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_FWWERR;
<> 144:ef7eb2e8f9f7 712 }
<> 144:ef7eb2e8f9f7 713 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_NOTZEROERR))
<> 144:ef7eb2e8f9f7 714 {
<> 144:ef7eb2e8f9f7 715 ProcFlash.ErrorCode |= HAL_FLASH_ERROR_NOTZERO;
<> 144:ef7eb2e8f9f7 716 }
<> 144:ef7eb2e8f9f7 717
<> 144:ef7eb2e8f9f7 718 /* Errors are now stored, clear errors flags */
<> 144:ef7eb2e8f9f7 719
<> 144:ef7eb2e8f9f7 720 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR |
<> 144:ef7eb2e8f9f7 721 FLASH_FLAG_OPTVERR | FLASH_FLAG_RDERR | FLASH_FLAG_FWWERR |
<> 144:ef7eb2e8f9f7 722 FLASH_FLAG_NOTZEROERR);
<> 144:ef7eb2e8f9f7 723 }
<> 144:ef7eb2e8f9f7 724
<> 144:ef7eb2e8f9f7 725 /**
<> 144:ef7eb2e8f9f7 726 * @brief Erases a specified page in program memory.
<> 144:ef7eb2e8f9f7 727 * @note To correctly run this function, the HAL_FLASH_Unlock() function
<> 144:ef7eb2e8f9f7 728 * must be called before.
<> 144:ef7eb2e8f9f7 729 * Call the HAL_FLASH_Lock() to disable the flash memory access
<> 144:ef7eb2e8f9f7 730 * (recommended to protect the FLASH memory against possible unwanted operation)
<> 144:ef7eb2e8f9f7 731 * @param Page_Address: The page address in program memory to be erased.
<> 144:ef7eb2e8f9f7 732 * @note A Page is erased in the Program memory only if the address to load
<> 144:ef7eb2e8f9f7 733 * is the start address of a page (multiple of 128 bytes).
<> 144:ef7eb2e8f9f7 734 * @retval HAL_StatusTypeDef HAL Status
<> 144:ef7eb2e8f9f7 735 */
<> 144:ef7eb2e8f9f7 736 void FLASH_ErasePage(uint32_t Page_Address)
<> 144:ef7eb2e8f9f7 737 {
<> 144:ef7eb2e8f9f7 738 /* Clean the error context */
<> 144:ef7eb2e8f9f7 739 ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 740
<> 144:ef7eb2e8f9f7 741 /* Set the ERASE bit */
<> 144:ef7eb2e8f9f7 742 SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
<> 144:ef7eb2e8f9f7 743
<> 144:ef7eb2e8f9f7 744 /* Set PROG bit */
<> 144:ef7eb2e8f9f7 745 SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
<> 144:ef7eb2e8f9f7 746
<> 144:ef7eb2e8f9f7 747 /* Write 00000000h to the first word of the program page to erase */
<> 144:ef7eb2e8f9f7 748 *(__IO uint32_t *)Page_Address = 0x00000000;
<> 144:ef7eb2e8f9f7 749 }
<> 144:ef7eb2e8f9f7 750
<> 144:ef7eb2e8f9f7 751 /**
<> 144:ef7eb2e8f9f7 752 * @brief Program word (32-bit) at a specified address.
<> 144:ef7eb2e8f9f7 753 * @param Address: specifies the address to be programmed.
<> 144:ef7eb2e8f9f7 754 * @param Data: specifies the data to be programmed.
<> 144:ef7eb2e8f9f7 755 * @retval None
<> 144:ef7eb2e8f9f7 756 */
<> 144:ef7eb2e8f9f7 757 static void FLASH_Program_Word(uint32_t Address, uint32_t Data)
<> 144:ef7eb2e8f9f7 758 {
<> 144:ef7eb2e8f9f7 759 /* Check the parameters */
<> 144:ef7eb2e8f9f7 760 assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
<> 144:ef7eb2e8f9f7 761
<> 144:ef7eb2e8f9f7 762 /* Clean the error context */
<> 144:ef7eb2e8f9f7 763 ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
<> 144:ef7eb2e8f9f7 764
<> 144:ef7eb2e8f9f7 765 *(__IO uint32_t*)Address = Data;
<> 144:ef7eb2e8f9f7 766 }
<> 144:ef7eb2e8f9f7 767
<> 144:ef7eb2e8f9f7 768 /**
<> 144:ef7eb2e8f9f7 769 * @}
<> 144:ef7eb2e8f9f7 770 */
<> 144:ef7eb2e8f9f7 771
<> 144:ef7eb2e8f9f7 772 #endif /* HAL_FLASH_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 773
<> 144:ef7eb2e8f9f7 774 /**
<> 144:ef7eb2e8f9f7 775 * @}
<> 144:ef7eb2e8f9f7 776 */
<> 144:ef7eb2e8f9f7 777
<> 144:ef7eb2e8f9f7 778 /**
<> 144:ef7eb2e8f9f7 779 * @}
<> 144:ef7eb2e8f9f7 780 */
<> 144:ef7eb2e8f9f7 781
<> 144:ef7eb2e8f9f7 782 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
<> 144:ef7eb2e8f9f7 783