fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
83:a036322b8637
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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