Subversion Repositories DashDisplay

Rev

Rev 50 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32l1xx_hal_flash.c
4
  * @author  MCD Application Team
5
  * @brief   FLASH HAL module driver.
6
  *          This file provides firmware functions to manage the following
7
  *          functionalities of the internal FLASH memory:
8
  *           + Program operations functions
9
  *           + Memory Control functions
10
  *           + Peripheral State functions
11
  *        
12
  @verbatim
13
  ==============================================================================
14
                        ##### FLASH peripheral features #####
15
  ==============================================================================
16
  [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses
17
       to the Flash memory. It implements the erase and program Flash memory operations
18
       and the read and write protection mechanisms.
19
 
20
  [..] The Flash memory interface accelerates code execution with a system of instruction
21
      prefetch.
22
 
23
  [..] The FLASH main features are:
24
      (+) Flash memory read operations
25
      (+) Flash memory program/erase operations
26
      (+) Read / write protections
27
      (+) Prefetch on I-Code
28
      (+) Option Bytes programming
29
 
30
 
31
                     ##### How to use this driver #####
32
  ==============================================================================
33
  [..]                            
34
      This driver provides functions and macros to configure and program the FLASH
35
      memory of all STM32L1xx devices.
36
 
37
      (#) FLASH Memory I/O Programming functions: this group includes all needed
38
          functions to erase and program the main memory:
39
        (++) Lock and Unlock the FLASH interface
40
        (++) Erase function: Erase page
41
        (++) Program functions: Fast Word and Half Page(should be
42
        executed from internal SRAM).
43
 
44
      (#) DATA EEPROM Programming functions: this group includes all
45
          needed functions to erase and program the DATA EEPROM memory:
46
        (++) Lock and Unlock the DATA EEPROM interface.
47
        (++) Erase function: Erase Byte, erase HalfWord, erase Word, erase
48
             Double Word (should be executed from internal SRAM).
49
        (++) Program functions: Fast Program Byte, Fast Program Half-Word,
50
             FastProgramWord, Program Byte, Program Half-Word,
51
             Program Word and Program Double-Word (should be executed
52
             from internal SRAM).
53
 
54
      (#) FLASH Option Bytes Programming functions: this group includes all needed
55
          functions to manage the Option Bytes:
56
        (++) Lock and Unlock the Option Bytes
57
        (++) Set/Reset the write protection
58
        (++) Set the Read protection Level
59
        (++) Program the user Option Bytes
60
        (++) Launch the Option Bytes loader
61
        (++) Set/Get the Read protection Level.
62
        (++) Set/Get the BOR level.
63
        (++) Get the Write protection.
64
        (++) Get the user option bytes.
65
 
66
      (#) Interrupts and flags management functions : this group
67
          includes all needed functions to:
68
        (++) Handle FLASH interrupts
69
        (++) Wait for last FLASH operation according to its status
70
        (++) Get error flag status
71
 
72
    (#) FLASH Interface configuration functions: this group includes
73
      the management of following features:
74
      (++) Enable/Disable the RUN PowerDown mode.
75
      (++) Enable/Disable the SLEEP PowerDown mode.  
76
 
77
    (#) FLASH Peripheral State methods: this group includes
78
      the management of following features:
79
      (++) Wait for the FLASH operation
80
      (++)  Get the specific FLASH error flag
81
 
82
  [..] In addition to these function, this driver includes a set of macros allowing
83
       to handle the following operations:
84
 
85
      (+) Set/Get the latency
86
      (+) Enable/Disable the prefetch buffer
87
      (+) Enable/Disable the 64 bit Read Access.
88
      (+) Enable/Disable the Flash power-down
89
      (+) Enable/Disable the FLASH interrupts
90
      (+) Monitor the FLASH flags status
91
 
92
                 ##### Programming operation functions #####
93
  ===============================================================================  
94
     [..]
95
     This subsection provides a set of functions allowing to manage the FLASH
96
     program operations.
97
 
98
    [..] The FLASH Memory Programming functions, includes the following functions:
99
     (+) HAL_FLASH_Unlock(void);
100
     (+) HAL_FLASH_Lock(void);
101
     (+) HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
102
     (+) HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
103
 
104
     [..] Any operation of erase or program should follow these steps:
105
     (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and
106
         program memory access.
107
     (#) Call the desired function to erase page or program data.
108
     (#) Call the HAL_FLASH_Lock() to disable the flash program memory access
109
        (recommended to protect the FLASH memory against possible unwanted operation).
110
 
111
               ##### Option Bytes Programming functions #####
112
   ==============================================================================  
113
 
114
     [..] The FLASH_Option Bytes Programming_functions, includes the following functions:
115
     (+) HAL_FLASH_OB_Unlock(void);
116
     (+) HAL_FLASH_OB_Lock(void);
117
     (+) HAL_FLASH_OB_Launch(void);
118
     (+) HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);
119
     (+) HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);
120
 
121
     [..] Any operation of erase or program should follow these steps:
122
     (#) Call the HAL_FLASH_OB_Unlock() function to enable the Flash option control
123
         register access.
124
     (#) Call the following functions to program the desired option bytes.
125
         (++) HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);      
126
     (#) Once all needed option bytes to be programmed are correctly written, call the
127
         HAL_FLASH_OB_Launch(void) function to launch the Option Bytes programming process.
128
     (#) Call the HAL_FLASH_OB_Lock() to disable the Flash option control register access (recommended
129
         to protect the option Bytes against possible unwanted operations).
130
 
131
    [..] Proprietary code Read Out Protection (PcROP):    
132
    (#) The PcROP sector is selected by using the same option bytes as the Write
133
        protection. As a result, these 2 options are exclusive each other.
134
    (#) To activate PCROP mode for Flash sectors(s), you need to follow the sequence below:
135
        (++) Use this function HAL_FLASHEx_AdvOBProgram with PCROPState = OB_PCROP_STATE_ENABLE.
136
 
137
  @endverbatim
138
  ******************************************************************************
139
  * @attention
140
  *
50 mjames 141
  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
142
  * All rights reserved.</center></h2>
30 mjames 143
  *
50 mjames 144
  * This software component is licensed by ST under BSD 3-Clause license,
145
  * the "License"; You may not use this file except in compliance with the
146
  * License. You may obtain a copy of the License at:
147
  *                        opensource.org/licenses/BSD-3-Clause
30 mjames 148
  *
50 mjames 149
  ******************************************************************************
30 mjames 150
  */
151
 
152
/* Includes ------------------------------------------------------------------*/
153
#include "stm32l1xx_hal.h"
154
 
155
/** @addtogroup STM32L1xx_HAL_Driver
156
  * @{
157
  */
158
 
159
#ifdef HAL_FLASH_MODULE_ENABLED
160
 
161
/** @defgroup FLASH FLASH
162
  * @brief FLASH HAL module driver
163
  * @{
164
  */
165
 
166
/* Private typedef -----------------------------------------------------------*/
167
/* Private define ------------------------------------------------------------*/
168
/** @defgroup FLASH_Private_Constants FLASH Private Constants
169
  * @{
170
  */
171
/**
172
  * @}
173
  */
174
 
175
/* Private macro ---------------------------- ---------------------------------*/
176
/** @defgroup FLASH_Private_Macros FLASH Private Macros
177
  * @{
178
  */
179
 
180
/**
181
  * @}
182
  */
183
 
184
/* Private variables ---------------------------------------------------------*/
185
/** @defgroup FLASH_Private_Variables FLASH Private Variables
186
  * @{
187
  */
188
/* Variables used for Erase pages under interruption*/
189
FLASH_ProcessTypeDef pFlash;
190
/**
191
  * @}
192
  */
193
 
194
/* Private function prototypes -----------------------------------------------*/
195
/** @defgroup FLASH_Private_Functions FLASH Private Functions
196
  * @{
197
  */
198
static  void   FLASH_SetErrorCode(void);
199
extern void    FLASH_PageErase(uint32_t PageAddress);
200
/**
201
  * @}
202
  */
203
 
204
/* Exported functions ---------------------------------------------------------*/
205
/** @defgroup FLASH_Exported_Functions FLASH Exported Functions
206
  * @{
207
  */
208
 
209
/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions
210
  *  @brief   Programming operation functions
211
  *
212
@verbatim  
213
@endverbatim
214
  * @{
215
  */
216
 
217
/**
218
  * @brief  Program word at a specified address
219
  * @note   To correctly run this function, the HAL_FLASH_Unlock() function
220
  *         must be called before.
221
  *         Call the HAL_FLASH_Lock() to disable the flash memory access
222
  *         (recommended to protect the FLASH memory against possible unwanted operation).
223
  *
50 mjames 224
  * @param  TypeProgram   Indicate the way to program at a specified address.
30 mjames 225
  *                       This parameter can be a value of @ref FLASH_Type_Program
50 mjames 226
  * @param  Address       Specifie the address to be programmed.
227
  * @param  Data          Specifie the data to be programmed
30 mjames 228
  *
229
  * @retval HAL_StatusTypeDef HAL Status
230
  */
231
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
232
{
233
  HAL_StatusTypeDef status = HAL_ERROR;
234
 
235
  /* Process Locked */
236
  __HAL_LOCK(&pFlash);
237
 
238
  /* Check the parameters */
239
  assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
240
  assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
241
 
242
  /* Wait for last operation to be completed */
243
  status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
244
 
245
  if(status == HAL_OK)
246
  {
247
    /* Clean the error context */
248
    pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
249
 
250
    /*Program word (32-bit) at a specified address.*/
251
    *(__IO uint32_t *)Address = Data;
252
 
253
    /* Wait for last operation to be completed */
254
    status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
255
  }
256
 
257
  /* Process Unlocked */
258
  __HAL_UNLOCK(&pFlash);
259
 
260
  return status;
261
}
262
 
263
/**
264
  * @brief   Program word at a specified address  with interrupt enabled.
265
  *
50 mjames 266
  * @param  TypeProgram  Indicate the way to program at a specified address.
30 mjames 267
  *                      This parameter can be a value of @ref FLASH_Type_Program
50 mjames 268
  * @param  Address      Specifie the address to be programmed.
269
  * @param  Data         Specifie the data to be programmed
30 mjames 270
  *
271
  * @retval HAL_StatusTypeDef HAL Status
272
  */
273
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
274
{
275
  HAL_StatusTypeDef status = HAL_OK;
276
 
277
  /* Process Locked */
278
  __HAL_LOCK(&pFlash);
279
 
280
  /* Check the parameters */
281
  assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
282
  assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
283
 
284
  /* Enable End of FLASH Operation and Error source interrupts */
285
  __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
286
 
287
  pFlash.Address = Address;
288
  pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM;
289
  /* Clean the error context */
290
  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
291
 
292
  if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
293
  {
294
    /* Program word (32-bit) at a specified address. */
295
    *(__IO uint32_t *)Address = Data;
296
  }
297
  return status;
298
}
299
 
300
/**
301
  * @brief This function handles FLASH interrupt request.
302
  * @retval None
303
  */
304
void HAL_FLASH_IRQHandler(void)
305
{
50 mjames 306
  uint32_t addresstmp = 0U;
30 mjames 307
 
308
  /* Check FLASH operation error flags */
309
  if( __HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)     ||
310
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)     ||
311
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)     ||
312
#if defined(FLASH_SR_RDERR)
313
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR)      ||
314
#endif /* FLASH_SR_RDERR */
315
#if defined(FLASH_SR_OPTVERRUSR)
316
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR) ||
317
#endif /* FLASH_SR_OPTVERRUSR */
318
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) )
319
  {
320
    if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
321
    {
322
      /* Return the faulty sector */
323
      addresstmp = pFlash.Page;
324
      pFlash.Page = 0xFFFFFFFFU;
325
    }
326
    else
327
    {
328
      /* Return the faulty address */
329
      addresstmp = pFlash.Address;
330
    }
331
    /* Save the Error code */
332
    FLASH_SetErrorCode();
333
 
334
    /* FLASH error interrupt user callback */
335
    HAL_FLASH_OperationErrorCallback(addresstmp);
336
 
337
    /* Stop the procedure ongoing */
338
    pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
339
  }
340
 
341
  /* Check FLASH End of Operation flag  */
342
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
343
  {
344
    /* Clear FLASH End of Operation pending bit */
345
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
346
 
347
    /* Process can continue only if no error detected */
348
    if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
349
    {
350
      if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
351
      {
352
        /* Nb of pages to erased can be decreased */
353
        pFlash.NbPagesToErase--;
354
 
355
        /* Check if there are still pages to erase */
50 mjames 356
        if(pFlash.NbPagesToErase != 0U)
30 mjames 357
        {
358
          addresstmp = pFlash.Page;
359
          /*Indicate user which sector has been erased */
360
          HAL_FLASH_EndOfOperationCallback(addresstmp);
361
 
362
          /*Increment sector number*/
363
          addresstmp = pFlash.Page + FLASH_PAGE_SIZE;
364
          pFlash.Page = addresstmp;
365
 
366
          /* If the erase operation is completed, disable the ERASE Bit */
367
          CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
368
 
369
          FLASH_PageErase(addresstmp);
370
        }
371
        else
372
        {
373
          /* No more pages to Erase, user callback can be called. */
374
          /* Reset Sector and stop Erase pages procedure */
375
          pFlash.Page = addresstmp = 0xFFFFFFFFU;
376
          pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
377
          /* FLASH EOP interrupt user callback */
378
          HAL_FLASH_EndOfOperationCallback(addresstmp);
379
        }
380
      }
381
      else
382
      {
383
          /* If the program operation is completed, disable the PROG Bit */
384
          CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
385
 
386
          /* Program ended. Return the selected address */
387
          /* FLASH EOP interrupt user callback */
388
          HAL_FLASH_EndOfOperationCallback(pFlash.Address);
389
 
390
          /* Reset Address and stop Program procedure */
391
          pFlash.Address = 0xFFFFFFFFU;
392
          pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
393
      }
394
    }
395
  }
396
 
397
 
398
  if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE)
399
  {
400
    /* Operation is completed, disable the PROG and ERASE */
401
    CLEAR_BIT(FLASH->PECR, (FLASH_PECR_ERASE | FLASH_PECR_PROG));
402
 
403
    /* Disable End of FLASH Operation and Error source interrupts */
404
    __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
405
 
406
    /* Process Unlocked */
407
    __HAL_UNLOCK(&pFlash);
408
  }
409
}
410
 
411
/**
412
  * @brief  FLASH end of operation interrupt callback
50 mjames 413
  * @param  ReturnValue The value saved in this parameter depends on the ongoing procedure
30 mjames 414
  *                 - Pages Erase: Address of the page which has been erased
415
  *                    (if 0xFFFFFFFF, it means that all the selected pages have been erased)
416
  *                 - Program: Address which was selected for data program
417
  * @retval none
418
  */
419
__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
420
{
421
  /* Prevent unused argument(s) compilation warning */
422
  UNUSED(ReturnValue);
423
 
424
  /* NOTE : This function Should not be modified, when the callback is needed,
425
            the HAL_FLASH_EndOfOperationCallback could be implemented in the user file
426
   */
427
}
428
 
429
/**
430
  * @brief  FLASH operation error interrupt callback
50 mjames 431
  * @param  ReturnValue The value saved in this parameter depends on the ongoing procedure
30 mjames 432
  *                 - Pages Erase: Address of the page which returned an error
433
  *                 - Program: Address which was selected for data program
434
  * @retval none
435
  */
436
__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
437
{
438
  /* Prevent unused argument(s) compilation warning */
439
  UNUSED(ReturnValue);
440
 
441
  /* NOTE : This function Should not be modified, when the callback is needed,
442
            the HAL_FLASH_OperationErrorCallback could be implemented in the user file
443
   */
444
}
445
 
446
/**
447
  * @}
448
  */
449
 
450
/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions
451
 *  @brief   management functions
452
 *
453
@verbatim  
454
 ===============================================================================
455
                      ##### Peripheral Control functions #####
456
 ===============================================================================  
457
    [..]
458
    This subsection provides a set of functions allowing to control the FLASH
459
    memory operations.
460
 
461
@endverbatim
462
  * @{
463
  */
464
 
465
/**
466
  * @brief  Unlock the FLASH control register access
467
  * @retval HAL Status
468
  */
469
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
470
{
471
  if (HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PRGLOCK))
472
  {
473
    /* Unlocking FLASH_PECR register access*/
474
    if(HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PELOCK))
475
    {  
476
      WRITE_REG(FLASH->PEKEYR, FLASH_PEKEY1);
477
      WRITE_REG(FLASH->PEKEYR, FLASH_PEKEY2);
50 mjames 478
 
479
      /* Verify that PELOCK is unlocked */
480
      if(HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PELOCK))
481
      {
482
        return HAL_ERROR;
483
      }
30 mjames 484
    }
485
 
486
    /* Unlocking the program memory access */
487
    WRITE_REG(FLASH->PRGKEYR, FLASH_PRGKEY1);
488
    WRITE_REG(FLASH->PRGKEYR, FLASH_PRGKEY2);  
50 mjames 489
 
490
    /* Verify that PRGLOCK is unlocked */
491
    if (HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PRGLOCK))
492
    {
493
      return HAL_ERROR;
494
    }
30 mjames 495
  }
50 mjames 496
 
30 mjames 497
  return HAL_OK;
498
}
499
 
500
/**
501
  * @brief  Locks the FLASH control register access
502
  * @retval HAL Status
503
  */
504
HAL_StatusTypeDef HAL_FLASH_Lock(void)
505
{
506
  /* Set the PRGLOCK Bit to lock the FLASH Registers access */
507
  SET_BIT(FLASH->PECR, FLASH_PECR_PRGLOCK);
508
 
509
  return HAL_OK;  
510
}
511
 
512
/**
513
  * @brief  Unlock the FLASH Option Control Registers access.
514
  * @retval HAL Status
515
  */
516
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
517
{
518
  if(HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_OPTLOCK))
519
  {
520
    /* Unlocking FLASH_PECR register access*/
521
    if(HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PELOCK))
522
    {  
523
      /* Unlocking FLASH_PECR register access*/
524
      WRITE_REG(FLASH->PEKEYR, FLASH_PEKEY1);
525
      WRITE_REG(FLASH->PEKEYR, FLASH_PEKEY2);
50 mjames 526
 
527
      /* Verify that PELOCK is unlocked */
528
      if(HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_PELOCK))
529
      {
530
        return HAL_ERROR;
531
      }
30 mjames 532
    }
533
 
534
    /* Unlocking the option bytes block access */
535
    WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1);
536
    WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2);
50 mjames 537
 
538
    /* Verify that OPTLOCK is unlocked */
539
    if (HAL_IS_BIT_SET(FLASH->PECR, FLASH_PECR_OPTLOCK))
540
    {
541
      return HAL_ERROR;
542
    }
30 mjames 543
  }
544
 
545
  return HAL_OK;  
546
}
547
 
548
/**
549
  * @brief  Lock the FLASH Option Control Registers access.
550
  * @retval HAL Status
551
  */
552
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
553
{
554
  /* Set the OPTLOCK Bit to lock the option bytes block access */
555
  SET_BIT(FLASH->PECR, FLASH_PECR_OPTLOCK);
556
 
557
  return HAL_OK;  
558
}
559
 
560
/**
561
  * @brief  Launch the option byte loading.
562
  * @note   This function will reset automatically the MCU.
563
  * @retval HAL Status
564
  */
565
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
566
{
567
  /* Set the OBL_Launch bit to launch the option byte loading */
568
  SET_BIT(FLASH->PECR, FLASH_PECR_OBL_LAUNCH);
569
 
570
  /* Wait for last operation to be completed */
571
  return(FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE));
572
}
573
 
574
/**
575
  * @}
576
  */  
577
 
578
/** @defgroup FLASH_Exported_Functions_Group3 Peripheral errors functions
579
 *  @brief    Peripheral errors functions
580
 *
581
@verbatim  
582
 ===============================================================================
583
                      ##### Peripheral Errors functions #####
584
 ===============================================================================  
585
    [..]
586
    This subsection permit to get in run-time errors of  the FLASH peripheral.
587
 
588
@endverbatim
589
  * @{
590
  */
591
 
592
/**
593
  * @brief  Get the specific FLASH error flag.
594
  * @retval FLASH_ErrorCode The returned value can be:
595
  *            @ref FLASH_Error_Codes
596
  */
597
uint32_t HAL_FLASH_GetError(void)
598
{
599
   return pFlash.ErrorCode;
600
}
601
 
602
/**
603
  * @}
604
  */
605
 
606
/**
607
  * @}
608
  */
609
 
610
/** @addtogroup FLASH_Private_Functions
611
 * @{
612
 */
613
 
614
/**
615
  * @brief  Wait for a FLASH operation to complete.
616
  * @param  Timeout  maximum flash operation timeout
617
  * @retval HAL Status
618
  */
619
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
620
{
621
  /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
622
     Even if the FLASH operation fails, the BUSY flag will be reset and an error
623
     flag will be set */
624
 
625
  uint32_t tickstart = HAL_GetTick();
626
 
627
  while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
628
  {
629
    if (Timeout != HAL_MAX_DELAY)
630
    {
50 mjames 631
      if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
30 mjames 632
      {
633
        return HAL_TIMEOUT;
634
      }
635
    }
636
  }
637
 
638
  /* Check FLASH End of Operation flag  */
639
  if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
640
  {
641
    /* Clear FLASH End of Operation pending bit */
642
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
643
  }
644
 
645
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)  ||
646
     __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) ||
647
#if defined(FLASH_SR_RDERR)
648
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) ||
649
#endif /* FLASH_SR_RDERR */
650
#if defined(FLASH_SR_OPTVERRUSR)
651
      __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR) ||
652
#endif /* FLASH_SR_OPTVERRUSR */
61 mjames 653
     __HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR) ||
30 mjames 654
     __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR))
655
  {
656
    /*Save the error code*/
657
    FLASH_SetErrorCode();
658
    return HAL_ERROR;
659
  }
660
 
661
  /* There is no error flag set */
662
  return HAL_OK;
663
}
664
 
665
 
666
/**
667
  * @brief  Set the specific FLASH error flag.
668
  * @retval None
669
  */
670
static void FLASH_SetErrorCode(void)
671
{
50 mjames 672
  uint32_t flags = 0U;
30 mjames 673
 
674
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR))
675
  {
676
    pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP;
677
    flags |= FLASH_FLAG_WRPERR;
678
  }
679
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR))
680
  {
681
    pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA;
682
    flags |= FLASH_FLAG_PGAERR;
683
  }
684
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR))
685
  {
686
    pFlash.ErrorCode |= HAL_FLASH_ERROR_OPTV;
687
    flags |= FLASH_FLAG_OPTVERR;
688
  }
689
 
690
#if defined(FLASH_SR_RDERR)
691
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR))
692
  {
693
    pFlash.ErrorCode |= HAL_FLASH_ERROR_RD;
694
    flags |= FLASH_FLAG_RDERR;
695
  }
696
#endif /* FLASH_SR_RDERR */
697
#if defined(FLASH_SR_OPTVERRUSR)
698
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERRUSR))
699
  {
700
    pFlash.ErrorCode |= HAL_FLASH_ERROR_OPTVUSR;
701
    flags |= FLASH_FLAG_OPTVERRUSR;
702
  }
703
#endif /* FLASH_SR_OPTVERRUSR */
61 mjames 704
  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR))
705
  {
706
    pFlash.ErrorCode |= HAL_FLASH_ERROR_SIZE;
707
    flags |= FLASH_FLAG_SIZERR;
708
  }
30 mjames 709
  /* Clear FLASH error pending bits */
710
  __HAL_FLASH_CLEAR_FLAG(flags);
61 mjames 711
}
30 mjames 712
/**
713
  * @}
714
  */
715
 
716
/**
717
  * @}
718
  */
719
 
720
#endif /* HAL_FLASH_MODULE_ENABLED */
721
 
722
/**
723
  * @}
724
  */
725
 
726
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/