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:
441:d2c15dda23c1
Child:
630:825f75ca301e
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 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****/