mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Oct 09 08:15:07 2014 +0100
Revision:
340:28d1f895c6fe
Synchronized with git revision b5a4c8e80393336b2656fb29ab46d405d3068602

Full URL: https://github.com/mbedmicro/mbed/commit/b5a4c8e80393336b2656fb29ab46d405d3068602/

HAL: nrf51822 - Few fixes for PWM and Serial

Who changed what in which revision?

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