mbed library sources

Fork of mbed-src by mbed official

Committer:
moirans2
Date:
Wed Jan 14 20:53:08 2015 +0000
Revision:
445:9a3ffe6cfa19
Parent:
441:d2c15dda23c1
internal clock stm32L051

Who changed what in which revision?

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