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:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

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