mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Oct 09 08:15:07 2014 +0100
Revision:
340:28d1f895c6fe
Synchronized with git revision b5a4c8e80393336b2656fb29ab46d405d3068602

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

HAL: nrf51822 - Few fixes for PWM and Serial

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