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