mbed library with additional peripherals for ST F401 board

Fork of mbed-src by mbed official

This mbed LIB has additional peripherals for ST F401 board

  • UART2 : PA_3 rx, PA_2 tx
  • UART3 : PC_7 rx, PC_6 tx
  • I2C2 : PB_3 SDA, PB_10 SCL
  • I2C3 : PB_4 SDA, PA_8 SCL
Committer:
mbed_official
Date:
Wed Feb 26 09:45:12 2014 +0000
Revision:
106:ced8cbb51063
Parent:
87:085cde657901
Synchronized with git revision 4222735eff5868389433f0e9271976b39c8115cd

Full URL: https://github.com/mbedmicro/mbed/commit/4222735eff5868389433f0e9271976b39c8115cd/

[NUCLEO_xxx] Update STM32CubeF4 driver V1.0.0 + update license

Who changed what in which revision?

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