L4 HAL Drivers

Committer:
EricLew
Date:
Mon Nov 02 19:37:23 2015 +0000
Revision:
0:80ee8f3b695e
Errors are with definitions of LCD and QSPI functions. I believe all .h and .c files are  uploaded, but there may need to be certain functions called.

Who changed what in which revision?

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