mbed library sources

Fork of mbed-src by mbed official

Committer:
HiAlgoBoost
Date:
Sun Aug 09 05:18:54 2015 +0000
Revision:
603:f00c7e78e8b4
Parent:
573:ad23fe03a082
Evening of August 8th version

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 573:ad23fe03a082 5 * @version V1.0.0
mbed_official 573:ad23fe03a082 6 * @date 12-May-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****/