mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Mon Nov 03 10:45:07 2014 +0000
Revision:
382:ee426a420dbb
Parent:
targets/cmsis/TARGET_STM/TARGET_DISCO_L053C8/stm32l0xx_hal_flash.c@376:cb4d9db17537
Child:
489:119543c9f674
Synchronized with git revision d54467eb07f62efd9ccdf44f1ede7fe1c1b0cf83

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

Who changed what in which revision?

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