fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
0:9b334a45a8ff
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f3xx_hal_flash.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
bogdanm 0:9b334a45a8ff 5 * @version V1.1.0
bogdanm 0:9b334a45a8ff 6 * @date 12-Sept-2014
bogdanm 0:9b334a45a8ff 7 * @brief FLASH HAL module driver.
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 10 * functionalities of the internal FLASH memory:
bogdanm 0:9b334a45a8ff 11 * + Program operations functions
bogdanm 0:9b334a45a8ff 12 * + Memory Control functions
bogdanm 0:9b334a45a8ff 13 * + Peripheral State functions
bogdanm 0:9b334a45a8ff 14 *
bogdanm 0:9b334a45a8ff 15 @verbatim
bogdanm 0:9b334a45a8ff 16 ==============================================================================
bogdanm 0:9b334a45a8ff 17 ##### FLASH peripheral features #####
bogdanm 0:9b334a45a8ff 18 ==============================================================================
bogdanm 0:9b334a45a8ff 19
bogdanm 0:9b334a45a8ff 20 [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses
bogdanm 0:9b334a45a8ff 21 to the Flash memory. It implements the erase and program Flash memory operations
bogdanm 0:9b334a45a8ff 22 and the read and write protection mechanisms.
bogdanm 0:9b334a45a8ff 23
bogdanm 0:9b334a45a8ff 24 [..] The Flash memory interface accelerates code execution with a system of instruction
bogdanm 0:9b334a45a8ff 25 prefetch.
bogdanm 0:9b334a45a8ff 26
bogdanm 0:9b334a45a8ff 27 [..] The FLASH main features are:
bogdanm 0:9b334a45a8ff 28 (+) Flash memory read operations
bogdanm 0:9b334a45a8ff 29 (+) Flash memory program/erase operations
bogdanm 0:9b334a45a8ff 30 (+) Read / write protections
bogdanm 0:9b334a45a8ff 31 (+) Prefetch on I-Code
bogdanm 0:9b334a45a8ff 32
bogdanm 0:9b334a45a8ff 33
bogdanm 0:9b334a45a8ff 34 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 35 ==============================================================================
bogdanm 0:9b334a45a8ff 36 [..]
bogdanm 0:9b334a45a8ff 37 This driver provides functions and macros to configure and program the FLASH
bogdanm 0:9b334a45a8ff 38 memory of all STM32F3xx devices. These functions are split in 3 groups:
bogdanm 0:9b334a45a8ff 39
bogdanm 0:9b334a45a8ff 40 (#) FLASH Memory I/O Programming functions: this group includes all needed
bogdanm 0:9b334a45a8ff 41 functions to erase and program the main memory:
bogdanm 0:9b334a45a8ff 42 (++) Lock and Unlock the FLASH interface
bogdanm 0:9b334a45a8ff 43 (++) Erase function: Erase page, erase all pages
bogdanm 0:9b334a45a8ff 44 (++) Program functions: half word and word
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 (#) Option Bytes Programming functions: this group includes all needed
bogdanm 0:9b334a45a8ff 47 functions to manage the Option Bytes:
bogdanm 0:9b334a45a8ff 48 (++) Lock and Unlock the Option Bytes
bogdanm 0:9b334a45a8ff 49 (++) Erase Option Bytes
bogdanm 0:9b334a45a8ff 50 (++) Set/Reset the write protection
bogdanm 0:9b334a45a8ff 51 (++) Set the Read protection Level
bogdanm 0:9b334a45a8ff 52 (++) Program the user Option Bytes
bogdanm 0:9b334a45a8ff 53 (++) Program the data Option Bytes
bogdanm 0:9b334a45a8ff 54 (++) Launch the Option Bytes loader
bogdanm 0:9b334a45a8ff 55
bogdanm 0:9b334a45a8ff 56 (#) Interrupts and flags management functions : this group
bogdanm 0:9b334a45a8ff 57 includes all needed functions to:
bogdanm 0:9b334a45a8ff 58 (++) Handle FLASH interrupts
bogdanm 0:9b334a45a8ff 59 (++) Wait for last FLASH operation according to its status
bogdanm 0:9b334a45a8ff 60 (++) Get error flag status
bogdanm 0:9b334a45a8ff 61
bogdanm 0:9b334a45a8ff 62 [..] In addition to these function, this driver includes a set of macros allowing
bogdanm 0:9b334a45a8ff 63 to handle the following operations:
bogdanm 0:9b334a45a8ff 64
bogdanm 0:9b334a45a8ff 65 (+) Set the latency
bogdanm 0:9b334a45a8ff 66 (+) Enable/Disable the prefetch buffer
bogdanm 0:9b334a45a8ff 67 (+) Enable/Disable the half cycle access
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) 2014 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 "stm32f3xx_hal.h"
bogdanm 0:9b334a45a8ff 104
bogdanm 0:9b334a45a8ff 105 /** @addtogroup STM32F3xx_HAL_Driver
bogdanm 0:9b334a45a8ff 106 * @{
bogdanm 0:9b334a45a8ff 107 */
bogdanm 0:9b334a45a8ff 108
bogdanm 0:9b334a45a8ff 109 /** @defgroup FLASH FLASH HAL module driver
bogdanm 0:9b334a45a8ff 110 * @brief FLASH HAL module driver
bogdanm 0:9b334a45a8ff 111 * @{
bogdanm 0:9b334a45a8ff 112 */
bogdanm 0:9b334a45a8ff 113
bogdanm 0:9b334a45a8ff 114 #ifdef HAL_FLASH_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 115
bogdanm 0:9b334a45a8ff 116 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 117 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 118 /** @defgroup FLASH_Private_Defines FLASH Private Define
bogdanm 0:9b334a45a8ff 119 * @{
bogdanm 0:9b334a45a8ff 120 */
bogdanm 0:9b334a45a8ff 121 #define HAL_FLASH_TIMEOUT_VALUE ((uint32_t)50000)/* 50 s */
bogdanm 0:9b334a45a8ff 122 /**
bogdanm 0:9b334a45a8ff 123 * @}
bogdanm 0:9b334a45a8ff 124 */
bogdanm 0:9b334a45a8ff 125
bogdanm 0:9b334a45a8ff 126 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 127 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 128 /** @defgroup FLASH_Private_Variables FLASH Private Variables
bogdanm 0:9b334a45a8ff 129 * @{
bogdanm 0:9b334a45a8ff 130 */
bogdanm 0:9b334a45a8ff 131 /* Variables used for Erase pages under interruption*/
bogdanm 0:9b334a45a8ff 132 FLASH_ProcessTypeDef pFlash;
bogdanm 0:9b334a45a8ff 133 /**
bogdanm 0:9b334a45a8ff 134 * @}
bogdanm 0:9b334a45a8ff 135 */
bogdanm 0:9b334a45a8ff 136
bogdanm 0:9b334a45a8ff 137 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 138 /** @defgroup FLASH_Private_Functions FLASH Private Functions
bogdanm 0:9b334a45a8ff 139 * @{
bogdanm 0:9b334a45a8ff 140 */
bogdanm 0:9b334a45a8ff 141 /* Program operations */
bogdanm 0:9b334a45a8ff 142 static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data);
bogdanm 0:9b334a45a8ff 143 static void FLASH_SetErrorCode(void);
bogdanm 0:9b334a45a8ff 144 /**
bogdanm 0:9b334a45a8ff 145 * @}
bogdanm 0:9b334a45a8ff 146 */
bogdanm 0:9b334a45a8ff 147
bogdanm 0:9b334a45a8ff 148 /* Exported functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 149 /** @defgroup FLASH_Exported_Functions FLASH Exported Functions
bogdanm 0:9b334a45a8ff 150 * @{
bogdanm 0:9b334a45a8ff 151 */
bogdanm 0:9b334a45a8ff 152
bogdanm 0:9b334a45a8ff 153 /** @defgroup FLASH_Exported_Functions_Group1 Input and Output operation functions
bogdanm 0:9b334a45a8ff 154 * @brief Data transfers functions
bogdanm 0:9b334a45a8ff 155 *
bogdanm 0:9b334a45a8ff 156 @verbatim
bogdanm 0:9b334a45a8ff 157 ===============================================================================
bogdanm 0:9b334a45a8ff 158 ##### IO operation functions #####
bogdanm 0:9b334a45a8ff 159 ===============================================================================
bogdanm 0:9b334a45a8ff 160 [..]
bogdanm 0:9b334a45a8ff 161 This subsection provides a set of functions allowing to manage the FLASH
bogdanm 0:9b334a45a8ff 162 program operations (write/erase).
bogdanm 0:9b334a45a8ff 163
bogdanm 0:9b334a45a8ff 164 @endverbatim
bogdanm 0:9b334a45a8ff 165 * @{
bogdanm 0:9b334a45a8ff 166 */
bogdanm 0:9b334a45a8ff 167
bogdanm 0:9b334a45a8ff 168 /**
bogdanm 0:9b334a45a8ff 169 * @brief Program halfword, word or double word at a specified address
bogdanm 0:9b334a45a8ff 170 * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
bogdanm 0:9b334a45a8ff 171 * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
bogdanm 0:9b334a45a8ff 172 *
bogdanm 0:9b334a45a8ff 173 * @note If an erase and a program operations are requested simultaneously,
bogdanm 0:9b334a45a8ff 174 * the erase operation is performed before the program one.
bogdanm 0:9b334a45a8ff 175 *
bogdanm 0:9b334a45a8ff 176 * @param TypeProgram: Indicate the way to program at a specified address.
bogdanm 0:9b334a45a8ff 177 * This parameter can be a value of @ref FLASH_Type_Program
bogdanm 0:9b334a45a8ff 178 * @param Address: Specifies the address to be programmed.
bogdanm 0:9b334a45a8ff 179 * @param Data: Specifies the data to be programmed
bogdanm 0:9b334a45a8ff 180 *
bogdanm 0:9b334a45a8ff 181 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 182 */
bogdanm 0:9b334a45a8ff 183 HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
bogdanm 0:9b334a45a8ff 184 {
bogdanm 0:9b334a45a8ff 185 HAL_StatusTypeDef status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 186 uint8_t index = 0;
bogdanm 0:9b334a45a8ff 187 uint8_t nbiterations = 0;
bogdanm 0:9b334a45a8ff 188
bogdanm 0:9b334a45a8ff 189 /* Process Locked */
bogdanm 0:9b334a45a8ff 190 __HAL_LOCK(&pFlash);
bogdanm 0:9b334a45a8ff 191
bogdanm 0:9b334a45a8ff 192 /* Check the parameters */
bogdanm 0:9b334a45a8ff 193 assert_param(IS_TYPEPROGRAM(TypeProgram));
bogdanm 0:9b334a45a8ff 194 assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
bogdanm 0:9b334a45a8ff 195
bogdanm 0:9b334a45a8ff 196 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 197 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 198
bogdanm 0:9b334a45a8ff 199 if(status == HAL_OK)
bogdanm 0:9b334a45a8ff 200 {
bogdanm 0:9b334a45a8ff 201 if(TypeProgram == TYPEPROGRAM_HALFWORD)
bogdanm 0:9b334a45a8ff 202 {
bogdanm 0:9b334a45a8ff 203 /* Program halfword (16-bit) at a specified address. */
bogdanm 0:9b334a45a8ff 204 nbiterations = 1;
bogdanm 0:9b334a45a8ff 205 }
bogdanm 0:9b334a45a8ff 206 else if(TypeProgram == TYPEPROGRAM_WORD)
bogdanm 0:9b334a45a8ff 207 {
bogdanm 0:9b334a45a8ff 208 /* Program word (32-bit = 2*16-bit) at a specified address. */
bogdanm 0:9b334a45a8ff 209 nbiterations = 2;
bogdanm 0:9b334a45a8ff 210 }
bogdanm 0:9b334a45a8ff 211 else
bogdanm 0:9b334a45a8ff 212 {
bogdanm 0:9b334a45a8ff 213 /* Program double word (64-bit = 4*16-bit) at a specified address. */
bogdanm 0:9b334a45a8ff 214 nbiterations = 4;
bogdanm 0:9b334a45a8ff 215 }
bogdanm 0:9b334a45a8ff 216
bogdanm 0:9b334a45a8ff 217 for (index = 0; index < nbiterations; index++)
bogdanm 0:9b334a45a8ff 218 {
bogdanm 0:9b334a45a8ff 219 FLASH_Program_HalfWord((Address + (2*index)), (uint16_t)(Data >> (16*index)));
bogdanm 0:9b334a45a8ff 220
bogdanm 0:9b334a45a8ff 221 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 222 status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
bogdanm 0:9b334a45a8ff 223
bogdanm 0:9b334a45a8ff 224 /* Check FLASH End of Operation flag */
bogdanm 0:9b334a45a8ff 225 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
bogdanm 0:9b334a45a8ff 226 {
bogdanm 0:9b334a45a8ff 227 /* Clear FLASH End of Operation pending bit */
bogdanm 0:9b334a45a8ff 228 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
bogdanm 0:9b334a45a8ff 229 }
bogdanm 0:9b334a45a8ff 230
bogdanm 0:9b334a45a8ff 231 /* If the program operation is completed, disable the PG Bit */
bogdanm 0:9b334a45a8ff 232 CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
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_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 == 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 == 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;
bogdanm 0:9b334a45a8ff 306 /* If the operation is completed, disable the PG, PER and MER Bits */
bogdanm 0:9b334a45a8ff 307 CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER));
bogdanm 0:9b334a45a8ff 308
bogdanm 0:9b334a45a8ff 309 /* Check FLASH End of Operation flag */
bogdanm 0:9b334a45a8ff 310 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
bogdanm 0:9b334a45a8ff 311 {
bogdanm 0:9b334a45a8ff 312 /* Clear FLASH End of Operation pending bit */
bogdanm 0:9b334a45a8ff 313 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
bogdanm 0:9b334a45a8ff 314
bogdanm 0:9b334a45a8ff 315 if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
bogdanm 0:9b334a45a8ff 316 {
bogdanm 0:9b334a45a8ff 317 /* Nb of pages to erased can be decreased */
bogdanm 0:9b334a45a8ff 318 pFlash.DataRemaining--;
bogdanm 0:9b334a45a8ff 319
bogdanm 0:9b334a45a8ff 320 /* Indicate user which page address has been erased*/
bogdanm 0:9b334a45a8ff 321 HAL_FLASH_EndOfOperationCallback(pFlash.Address);
bogdanm 0:9b334a45a8ff 322
bogdanm 0:9b334a45a8ff 323 /* Check if there are still pages to erase*/
bogdanm 0:9b334a45a8ff 324 if(pFlash.DataRemaining != 0)
bogdanm 0:9b334a45a8ff 325 {
bogdanm 0:9b334a45a8ff 326 /* Increment page address to next page */
bogdanm 0:9b334a45a8ff 327 pFlash.Address += FLASH_PAGE_SIZE;
bogdanm 0:9b334a45a8ff 328 addresstmp = pFlash.Address;
bogdanm 0:9b334a45a8ff 329 FLASH_PageErase(addresstmp);
bogdanm 0:9b334a45a8ff 330 }
bogdanm 0:9b334a45a8ff 331 else
bogdanm 0:9b334a45a8ff 332 {
bogdanm 0:9b334a45a8ff 333 /*No more pages to Erase*/
bogdanm 0:9b334a45a8ff 334
bogdanm 0:9b334a45a8ff 335 /*Reset Address and stop Erase pages procedure*/
bogdanm 0:9b334a45a8ff 336 pFlash.Address = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 337 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 338 }
bogdanm 0:9b334a45a8ff 339 }
bogdanm 0:9b334a45a8ff 340 else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE)
bogdanm 0:9b334a45a8ff 341 {
bogdanm 0:9b334a45a8ff 342 /*MassErase ended. Return the selected bank*/
bogdanm 0:9b334a45a8ff 343 /* FLASH EOP interrupt user callback */
bogdanm 0:9b334a45a8ff 344 HAL_FLASH_EndOfOperationCallback(0);
bogdanm 0:9b334a45a8ff 345
bogdanm 0:9b334a45a8ff 346 /* Stop Mass Erase procedure*/
bogdanm 0:9b334a45a8ff 347 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 348 }
bogdanm 0:9b334a45a8ff 349 else
bogdanm 0:9b334a45a8ff 350 {
bogdanm 0:9b334a45a8ff 351 /* Nb of 16-bit data to program can be decreased */
bogdanm 0:9b334a45a8ff 352 pFlash.DataRemaining--;
bogdanm 0:9b334a45a8ff 353
bogdanm 0:9b334a45a8ff 354 /* Check if there are still 16-bit data to program */
bogdanm 0:9b334a45a8ff 355 if(pFlash.DataRemaining != 0)
bogdanm 0:9b334a45a8ff 356 {
bogdanm 0:9b334a45a8ff 357 /* Increment address to 16-bit */
bogdanm 0:9b334a45a8ff 358 pFlash.Address += 2;
bogdanm 0:9b334a45a8ff 359 addresstmp = pFlash.Address;
bogdanm 0:9b334a45a8ff 360
bogdanm 0:9b334a45a8ff 361 /* Shift to have next 16-bit data */
bogdanm 0:9b334a45a8ff 362 pFlash.Data = (pFlash.Data >> 16);
bogdanm 0:9b334a45a8ff 363
bogdanm 0:9b334a45a8ff 364 /*Program halfword (16-bit) at a specified address.*/
bogdanm 0:9b334a45a8ff 365 FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data);
bogdanm 0:9b334a45a8ff 366 }
bogdanm 0:9b334a45a8ff 367 else
bogdanm 0:9b334a45a8ff 368 {
bogdanm 0:9b334a45a8ff 369 /*Program ended. Return the selected address*/
bogdanm 0:9b334a45a8ff 370 /* FLASH EOP interrupt user callback */
bogdanm 0:9b334a45a8ff 371 if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD)
bogdanm 0:9b334a45a8ff 372 {
bogdanm 0:9b334a45a8ff 373 HAL_FLASH_EndOfOperationCallback(pFlash.Address);
bogdanm 0:9b334a45a8ff 374 }
bogdanm 0:9b334a45a8ff 375 else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD)
bogdanm 0:9b334a45a8ff 376 {
bogdanm 0:9b334a45a8ff 377 HAL_FLASH_EndOfOperationCallback(pFlash.Address-2);
bogdanm 0:9b334a45a8ff 378 }
bogdanm 0:9b334a45a8ff 379 else
bogdanm 0:9b334a45a8ff 380 {
bogdanm 0:9b334a45a8ff 381 HAL_FLASH_EndOfOperationCallback(pFlash.Address-6);
bogdanm 0:9b334a45a8ff 382 }
bogdanm 0:9b334a45a8ff 383
bogdanm 0:9b334a45a8ff 384 /* Reset Address and stop Program procedure*/
bogdanm 0:9b334a45a8ff 385 pFlash.Address = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 386 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 387 }
bogdanm 0:9b334a45a8ff 388 }
bogdanm 0:9b334a45a8ff 389 }
bogdanm 0:9b334a45a8ff 390
bogdanm 0:9b334a45a8ff 391 /* Check FLASH operation error flags */
bogdanm 0:9b334a45a8ff 392 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR))
bogdanm 0:9b334a45a8ff 393 {
bogdanm 0:9b334a45a8ff 394 /*Save the Error code*/
bogdanm 0:9b334a45a8ff 395 FLASH_SetErrorCode();
bogdanm 0:9b334a45a8ff 396
bogdanm 0:9b334a45a8ff 397 /* FLASH error interrupt user callback */
bogdanm 0:9b334a45a8ff 398 HAL_FLASH_OperationErrorCallback(pFlash.Address);
bogdanm 0:9b334a45a8ff 399
bogdanm 0:9b334a45a8ff 400 /* Clear FLASH error pending bits */
bogdanm 0:9b334a45a8ff 401 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
bogdanm 0:9b334a45a8ff 402
bogdanm 0:9b334a45a8ff 403 /* Reset address and stop the procedure ongoing*/
bogdanm 0:9b334a45a8ff 404 pFlash.Address = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 405 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
bogdanm 0:9b334a45a8ff 406 }
bogdanm 0:9b334a45a8ff 407
bogdanm 0:9b334a45a8ff 408 if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE)
bogdanm 0:9b334a45a8ff 409 {
bogdanm 0:9b334a45a8ff 410 /* Disable End of FLASH Operation and Error source interrupts */
bogdanm 0:9b334a45a8ff 411 __HAL_FLASH_DISABLE_IT((FLASH_IT_EOP | FLASH_IT_ERR));
bogdanm 0:9b334a45a8ff 412
bogdanm 0:9b334a45a8ff 413 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 414 __HAL_UNLOCK(&pFlash);
bogdanm 0:9b334a45a8ff 415 }
bogdanm 0:9b334a45a8ff 416 }
bogdanm 0:9b334a45a8ff 417
bogdanm 0:9b334a45a8ff 418
bogdanm 0:9b334a45a8ff 419 /**
bogdanm 0:9b334a45a8ff 420 * @brief FLASH end of operation interrupt callback
bogdanm 0:9b334a45a8ff 421 * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure
bogdanm 0:9b334a45a8ff 422 * - Mass Erase: No return value expected
bogdanm 0:9b334a45a8ff 423 * - Pages Erase: Address of the page which has been erased
bogdanm 0:9b334a45a8ff 424 * - Program: Address which was selected for data program
bogdanm 0:9b334a45a8ff 425 * @retval none
bogdanm 0:9b334a45a8ff 426 */
bogdanm 0:9b334a45a8ff 427 __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
bogdanm 0:9b334a45a8ff 428 {
bogdanm 0:9b334a45a8ff 429 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 430 the HAL_FLASH_EndOfOperationCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 431 */
bogdanm 0:9b334a45a8ff 432 }
bogdanm 0:9b334a45a8ff 433
bogdanm 0:9b334a45a8ff 434 /**
bogdanm 0:9b334a45a8ff 435 * @brief FLASH operation error interrupt callback
bogdanm 0:9b334a45a8ff 436 * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure
bogdanm 0:9b334a45a8ff 437 * - Mass Erase: No return value expected
bogdanm 0:9b334a45a8ff 438 * - Pages Erase: Address of the page which returned an error
bogdanm 0:9b334a45a8ff 439 * - Program: Address which was selected for data program
bogdanm 0:9b334a45a8ff 440 * @retval none
bogdanm 0:9b334a45a8ff 441 */
bogdanm 0:9b334a45a8ff 442 __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
bogdanm 0:9b334a45a8ff 443 {
bogdanm 0:9b334a45a8ff 444 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 445 the HAL_FLASH_OperationErrorCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 446 */
bogdanm 0:9b334a45a8ff 447 }
bogdanm 0:9b334a45a8ff 448
bogdanm 0:9b334a45a8ff 449 /**
bogdanm 0:9b334a45a8ff 450 * @}
bogdanm 0:9b334a45a8ff 451 */
bogdanm 0:9b334a45a8ff 452
bogdanm 0:9b334a45a8ff 453 /** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions
bogdanm 0:9b334a45a8ff 454 * @brief management functions
bogdanm 0:9b334a45a8ff 455 *
bogdanm 0:9b334a45a8ff 456 @verbatim
bogdanm 0:9b334a45a8ff 457 ===============================================================================
bogdanm 0:9b334a45a8ff 458 ##### Peripheral Control functions #####
bogdanm 0:9b334a45a8ff 459 ===============================================================================
bogdanm 0:9b334a45a8ff 460 [..]
bogdanm 0:9b334a45a8ff 461 This subsection provides a set of functions allowing to control the FLASH
bogdanm 0:9b334a45a8ff 462 memory operations.
bogdanm 0:9b334a45a8ff 463
bogdanm 0:9b334a45a8ff 464 @endverbatim
bogdanm 0:9b334a45a8ff 465 * @{
bogdanm 0:9b334a45a8ff 466 */
bogdanm 0:9b334a45a8ff 467
bogdanm 0:9b334a45a8ff 468 /**
bogdanm 0:9b334a45a8ff 469 * @brief Unlock the FLASH control register access
bogdanm 0:9b334a45a8ff 470 * @retval HAL Status
bogdanm 0:9b334a45a8ff 471 */
bogdanm 0:9b334a45a8ff 472 HAL_StatusTypeDef HAL_FLASH_Unlock(void)
bogdanm 0:9b334a45a8ff 473 {
bogdanm 0:9b334a45a8ff 474 if((READ_BIT(FLASH->CR, FLASH_CR_LOCK)) != RESET)
bogdanm 0:9b334a45a8ff 475 {
bogdanm 0:9b334a45a8ff 476 /* Authorize the FLASH Registers access */
bogdanm 0:9b334a45a8ff 477 WRITE_REG(FLASH->KEYR, FLASH_KEY1);
bogdanm 0:9b334a45a8ff 478 WRITE_REG(FLASH->KEYR, FLASH_KEY2);
bogdanm 0:9b334a45a8ff 479 }
bogdanm 0:9b334a45a8ff 480 else
bogdanm 0:9b334a45a8ff 481 {
bogdanm 0:9b334a45a8ff 482 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 483 }
bogdanm 0:9b334a45a8ff 484
bogdanm 0:9b334a45a8ff 485 return HAL_OK;
bogdanm 0:9b334a45a8ff 486 }
bogdanm 0:9b334a45a8ff 487
bogdanm 0:9b334a45a8ff 488 /**
bogdanm 0:9b334a45a8ff 489 * @brief Locks the FLASH control register access
bogdanm 0:9b334a45a8ff 490 * @retval HAL Status
bogdanm 0:9b334a45a8ff 491 */
bogdanm 0:9b334a45a8ff 492 HAL_StatusTypeDef HAL_FLASH_Lock(void)
bogdanm 0:9b334a45a8ff 493 {
bogdanm 0:9b334a45a8ff 494 /* Set the LOCK Bit to lock the FLASH Registers access */
bogdanm 0:9b334a45a8ff 495 SET_BIT(FLASH->CR, FLASH_CR_LOCK);
bogdanm 0:9b334a45a8ff 496
bogdanm 0:9b334a45a8ff 497 return HAL_OK;
bogdanm 0:9b334a45a8ff 498 }
bogdanm 0:9b334a45a8ff 499
bogdanm 0:9b334a45a8ff 500
bogdanm 0:9b334a45a8ff 501 /**
bogdanm 0:9b334a45a8ff 502 * @brief Unlock the FLASH Option Control Registers access.
bogdanm 0:9b334a45a8ff 503 * @retval HAL Status
bogdanm 0:9b334a45a8ff 504 */
bogdanm 0:9b334a45a8ff 505 HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
bogdanm 0:9b334a45a8ff 506 {
bogdanm 0:9b334a45a8ff 507 if((READ_BIT(FLASH->CR, FLASH_CR_OPTWRE)) == RESET)
bogdanm 0:9b334a45a8ff 508 {
bogdanm 0:9b334a45a8ff 509 /* Authorizes the Option Byte register programming */
bogdanm 0:9b334a45a8ff 510 WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1);
bogdanm 0:9b334a45a8ff 511 WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2);
bogdanm 0:9b334a45a8ff 512 }
bogdanm 0:9b334a45a8ff 513 else
bogdanm 0:9b334a45a8ff 514 {
bogdanm 0:9b334a45a8ff 515 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 516 }
bogdanm 0:9b334a45a8ff 517
bogdanm 0:9b334a45a8ff 518 return HAL_OK;
bogdanm 0:9b334a45a8ff 519 }
bogdanm 0:9b334a45a8ff 520
bogdanm 0:9b334a45a8ff 521 /**
bogdanm 0:9b334a45a8ff 522 * @brief Lock the FLASH Option Control Registers access.
bogdanm 0:9b334a45a8ff 523 * @retval HAL Status
bogdanm 0:9b334a45a8ff 524 */
bogdanm 0:9b334a45a8ff 525 HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
bogdanm 0:9b334a45a8ff 526 {
bogdanm 0:9b334a45a8ff 527 /* Clear the OPTWRE Bit to lock the FLASH Option Byte Registers access */
bogdanm 0:9b334a45a8ff 528 CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE);
bogdanm 0:9b334a45a8ff 529
bogdanm 0:9b334a45a8ff 530 return HAL_OK;
bogdanm 0:9b334a45a8ff 531 }
bogdanm 0:9b334a45a8ff 532
bogdanm 0:9b334a45a8ff 533 /**
bogdanm 0:9b334a45a8ff 534 * @brief Launch the option byte loading.
bogdanm 0:9b334a45a8ff 535 * @retval HAL status
bogdanm 0:9b334a45a8ff 536 */
bogdanm 0:9b334a45a8ff 537 HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
bogdanm 0:9b334a45a8ff 538 {
bogdanm 0:9b334a45a8ff 539 /* Set the bit to force the option byte reloading */
bogdanm 0:9b334a45a8ff 540 SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH);
bogdanm 0:9b334a45a8ff 541
bogdanm 0:9b334a45a8ff 542 /* Wait for last operation to be completed */
bogdanm 0:9b334a45a8ff 543 return(FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE));
bogdanm 0:9b334a45a8ff 544 }
bogdanm 0:9b334a45a8ff 545
bogdanm 0:9b334a45a8ff 546 /**
bogdanm 0:9b334a45a8ff 547 * @}
bogdanm 0:9b334a45a8ff 548 */
bogdanm 0:9b334a45a8ff 549
bogdanm 0:9b334a45a8ff 550
bogdanm 0:9b334a45a8ff 551 /** @defgroup FLASH_Exported_Functions_Group3 Peripheral State functions
bogdanm 0:9b334a45a8ff 552 * @brief Peripheral State functions
bogdanm 0:9b334a45a8ff 553 *
bogdanm 0:9b334a45a8ff 554 @verbatim
bogdanm 0:9b334a45a8ff 555 ===============================================================================
bogdanm 0:9b334a45a8ff 556 ##### Peripheral State functions #####
bogdanm 0:9b334a45a8ff 557 ===============================================================================
bogdanm 0:9b334a45a8ff 558 [..]
bogdanm 0:9b334a45a8ff 559 This subsection permit to get in run-time the status of the FLASH peripheral.
bogdanm 0:9b334a45a8ff 560
bogdanm 0:9b334a45a8ff 561 @endverbatim
bogdanm 0:9b334a45a8ff 562 * @{
bogdanm 0:9b334a45a8ff 563 */
bogdanm 0:9b334a45a8ff 564
bogdanm 0:9b334a45a8ff 565 /**
bogdanm 0:9b334a45a8ff 566 * @brief Get the specific FLASH error flag.
bogdanm 0:9b334a45a8ff 567 * @retval FLASH_ErrorCode: The returned value can be:
bogdanm 0:9b334a45a8ff 568 * @arg FLASH_ERROR_PG: FLASH Programming error flag
bogdanm 0:9b334a45a8ff 569 * @arg FLASH_ERROR_WRP: FLASH Write protected error flag
bogdanm 0:9b334a45a8ff 570 */
bogdanm 0:9b334a45a8ff 571 FLASH_ErrorTypeDef HAL_FLASH_GetError(void)
bogdanm 0:9b334a45a8ff 572 {
bogdanm 0:9b334a45a8ff 573 return pFlash.ErrorCode;
bogdanm 0:9b334a45a8ff 574 }
bogdanm 0:9b334a45a8ff 575
bogdanm 0:9b334a45a8ff 576 /**
bogdanm 0:9b334a45a8ff 577 * @}
bogdanm 0:9b334a45a8ff 578 */
bogdanm 0:9b334a45a8ff 579
bogdanm 0:9b334a45a8ff 580 /**
bogdanm 0:9b334a45a8ff 581 * @}
bogdanm 0:9b334a45a8ff 582 */
bogdanm 0:9b334a45a8ff 583
bogdanm 0:9b334a45a8ff 584 /** @addtogroup FLASH_Private_Functions FLASH Private Functions
bogdanm 0:9b334a45a8ff 585 * @{
bogdanm 0:9b334a45a8ff 586 */
bogdanm 0:9b334a45a8ff 587 /**
bogdanm 0:9b334a45a8ff 588 * @brief Program a half-word (16-bit) at a specified address.
bogdanm 0:9b334a45a8ff 589 * @param Address: specifies the address to be programmed.
bogdanm 0:9b334a45a8ff 590 * @param Data: specifies the data to be programmed.
bogdanm 0:9b334a45a8ff 591 * @retval None
bogdanm 0:9b334a45a8ff 592 */
bogdanm 0:9b334a45a8ff 593 static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)
bogdanm 0:9b334a45a8ff 594 {
bogdanm 0:9b334a45a8ff 595 /* Clear pending flags (if any) */
bogdanm 0:9b334a45a8ff 596 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
bogdanm 0:9b334a45a8ff 597
bogdanm 0:9b334a45a8ff 598 /* Proceed to program the new data */
bogdanm 0:9b334a45a8ff 599 SET_BIT(FLASH->CR, FLASH_CR_PG);
bogdanm 0:9b334a45a8ff 600
bogdanm 0:9b334a45a8ff 601 *(__IO uint16_t*)Address = Data;
bogdanm 0:9b334a45a8ff 602 }
bogdanm 0:9b334a45a8ff 603
bogdanm 0:9b334a45a8ff 604 /**
bogdanm 0:9b334a45a8ff 605 * @brief Wait for a FLASH operation to complete.
bogdanm 0:9b334a45a8ff 606 * @param Timeout: maximum flash operationtimeout
bogdanm 0:9b334a45a8ff 607 * @retval HAL_StatusTypeDef HAL Status
bogdanm 0:9b334a45a8ff 608 */
bogdanm 0:9b334a45a8ff 609 HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
bogdanm 0:9b334a45a8ff 610 {
bogdanm 0:9b334a45a8ff 611 /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
bogdanm 0:9b334a45a8ff 612 Even if the FLASH operation fails, the BUSY flag will be reset and an error
bogdanm 0:9b334a45a8ff 613 flag will be set */
bogdanm 0:9b334a45a8ff 614
bogdanm 0:9b334a45a8ff 615 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 616
bogdanm 0:9b334a45a8ff 617 while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
bogdanm 0:9b334a45a8ff 618 {
bogdanm 0:9b334a45a8ff 619 if (Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 620 {
bogdanm 0:9b334a45a8ff 621 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
bogdanm 0:9b334a45a8ff 622 {
bogdanm 0:9b334a45a8ff 623 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 624 }
bogdanm 0:9b334a45a8ff 625 }
bogdanm 0:9b334a45a8ff 626 }
bogdanm 0:9b334a45a8ff 627
bogdanm 0:9b334a45a8ff 628 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR))
bogdanm 0:9b334a45a8ff 629 {
bogdanm 0:9b334a45a8ff 630 /*Save the error code*/
bogdanm 0:9b334a45a8ff 631 FLASH_SetErrorCode();
bogdanm 0:9b334a45a8ff 632 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 633 }
bogdanm 0:9b334a45a8ff 634
bogdanm 0:9b334a45a8ff 635 /* If there is an error flag set */
bogdanm 0:9b334a45a8ff 636 return HAL_OK;
bogdanm 0:9b334a45a8ff 637
bogdanm 0:9b334a45a8ff 638 }
bogdanm 0:9b334a45a8ff 639
bogdanm 0:9b334a45a8ff 640 /**
bogdanm 0:9b334a45a8ff 641 * @brief Erase the specified FLASH memory page
bogdanm 0:9b334a45a8ff 642 * @param PageAddress: FLASH page to erase
bogdanm 0:9b334a45a8ff 643 * The value of this parameter depend on device used within the same series
bogdanm 0:9b334a45a8ff 644 *
bogdanm 0:9b334a45a8ff 645 * @retval None
bogdanm 0:9b334a45a8ff 646 */
bogdanm 0:9b334a45a8ff 647 void FLASH_PageErase(uint32_t PageAddress)
bogdanm 0:9b334a45a8ff 648 {
bogdanm 0:9b334a45a8ff 649 /* Clear pending flags (if any) */
bogdanm 0:9b334a45a8ff 650 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
bogdanm 0:9b334a45a8ff 651
bogdanm 0:9b334a45a8ff 652 /* Proceed to erase the page */
bogdanm 0:9b334a45a8ff 653 SET_BIT(FLASH->CR, FLASH_CR_PER);
bogdanm 0:9b334a45a8ff 654 WRITE_REG(FLASH->AR, PageAddress);
bogdanm 0:9b334a45a8ff 655 SET_BIT(FLASH->CR, FLASH_CR_STRT);
bogdanm 0:9b334a45a8ff 656 }
bogdanm 0:9b334a45a8ff 657
bogdanm 0:9b334a45a8ff 658 /**
bogdanm 0:9b334a45a8ff 659 * @brief Set the specific FLASH error flag.
bogdanm 0:9b334a45a8ff 660 * @retval None
bogdanm 0:9b334a45a8ff 661 */
bogdanm 0:9b334a45a8ff 662 static void FLASH_SetErrorCode(void)
bogdanm 0:9b334a45a8ff 663 {
bogdanm 0:9b334a45a8ff 664 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR))
bogdanm 0:9b334a45a8ff 665 {
bogdanm 0:9b334a45a8ff 666 pFlash.ErrorCode = FLASH_ERROR_WRP;
bogdanm 0:9b334a45a8ff 667 }
bogdanm 0:9b334a45a8ff 668 if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR))
bogdanm 0:9b334a45a8ff 669 {
bogdanm 0:9b334a45a8ff 670 pFlash.ErrorCode |= FLASH_ERROR_PG;
bogdanm 0:9b334a45a8ff 671 }
bogdanm 0:9b334a45a8ff 672 }
bogdanm 0:9b334a45a8ff 673
bogdanm 0:9b334a45a8ff 674 /**
bogdanm 0:9b334a45a8ff 675 * @}
bogdanm 0:9b334a45a8ff 676 */
bogdanm 0:9b334a45a8ff 677
bogdanm 0:9b334a45a8ff 678 #endif /* HAL_FLASH_MODULE_ENABLED */
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
bogdanm 0:9b334a45a8ff 688 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/