fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue Apr 19 11:15:15 2016 +0100
Revision:
113:b3775bf36a83
Parent:
0:9b334a45a8ff
Synchronized with git revision 896981126b34b6d9441e3eea77881c67a1ae3dbd

Full URL: https://github.com/mbedmicro/mbed/commit/896981126b34b6d9441e3eea77881c67a1ae3dbd/

Exporter tool addition for e2 studio

Who changed what in which revision?

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