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:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
489:119543c9f674
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

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