TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

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