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 Aug 06 08:15:07 2014 +0100
Revision:
274:6937b19af361
Parent:
226:b062af740e40
Child:
369:2e96f1b71984
Synchronized with git revision 5b145e4f6c509376173c3ea2aa35a6da879a2124

Full URL: https://github.com/mbedmicro/mbed/commit/5b145e4f6c509376173c3ea2aa35a6da879a2124/

[TARGET_LPC11UXX] PeripheralNames.h and PinMap definitions separation for LPC11UXX platforms

Who changed what in which revision?

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