SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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