fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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