teralytic / mbed-dev

Fork of mbed by teralytic

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

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