Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 5 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | /** |
1 | /** |
| 2 | ****************************************************************************** |
2 | ****************************************************************************** |
| 3 | * @file stm32f1xx_hal_flash.c |
3 | * @file stm32f1xx_hal_flash.c |
| 4 | * @author MCD Application Team |
4 | * @author MCD Application Team |
| 5 | * @version V1.0.1 |
5 | * @version V1.0.4 |
| 6 | * @date 31-July-2015 |
6 | * @date 29-April-2016 |
| 7 | * @brief FLASH HAL module driver. |
7 | * @brief FLASH HAL module driver. |
| 8 | * This file provides firmware functions to manage the following |
8 | * This file provides firmware functions to manage the following |
| 9 | * functionalities of the internal FLASH memory: |
9 | * functionalities of the internal FLASH memory: |
| 10 | * + Program operations functions |
10 | * + Program operations functions |
| 11 | * + Memory Control functions |
11 | * + Memory Control functions |
| Line 61... | Line 61... | ||
| 61 | (++) Get error flag status |
61 | (++) Get error flag status |
| 62 | 62 | ||
| 63 | [..] In addition to these function, this driver includes a set of macros allowing |
63 | [..] In addition to these function, this driver includes a set of macros allowing |
| 64 | to handle the following operations: |
64 | to handle the following operations: |
| 65 | |
65 | |
| 66 | (+) Set the latency |
66 | (+) Set/Get the latency |
| 67 | (+) Enable/Disable the prefetch buffer |
67 | (+) Enable/Disable the prefetch buffer |
| 68 | (+) Enable/Disable the half cycle access |
68 | (+) Enable/Disable the half cycle access |
| 69 | (+) Enable/Disable the FLASH interrupts |
69 | (+) Enable/Disable the FLASH interrupts |
| 70 | (+) Monitor the FLASH flags status |
70 | (+) Monitor the FLASH flags status |
| 71 | |
71 | |
| 72 | @endverbatim |
72 | @endverbatim |
| 73 | ****************************************************************************** |
73 | ****************************************************************************** |
| 74 | * @attention |
74 | * @attention |
| 75 | * |
75 | * |
| 76 | * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> |
76 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
| 77 | * |
77 | * |
| 78 | * Redistribution and use in source and binary forms, with or without modification, |
78 | * Redistribution and use in source and binary forms, with or without modification, |
| 79 | * are permitted provided that the following conditions are met: |
79 | * are permitted provided that the following conditions are met: |
| 80 | * 1. Redistributions of source code must retain the above copyright notice, |
80 | * 1. Redistributions of source code must retain the above copyright notice, |
| 81 | * this list of conditions and the following disclaimer. |
81 | * this list of conditions and the following disclaimer. |
| Line 173... | Line 173... | ||
| 173 | * @note If an erase and a program operations are requested simultaneously, |
173 | * @note If an erase and a program operations are requested simultaneously, |
| 174 | * the erase operation is performed before the program one. |
174 | * the erase operation is performed before the program one. |
| 175 | * |
175 | * |
| 176 | * @note FLASH should be previously erased before new programmation (only exception to this |
176 | * @note FLASH should be previously erased before new programmation (only exception to this |
| 177 | * is when 0x0000 is programmed) |
177 | * is when 0x0000 is programmed) |
| 178 | * |
178 | * |
| 179 | * @param TypeProgram: Indicate the way to program at a specified address. |
179 | * @param TypeProgram: Indicate the way to program at a specified address. |
| 180 | * This parameter can be a value of @ref FLASH_Type_Program |
180 | * This parameter can be a value of @ref FLASH_Type_Program |
| 181 | * @param Address: Specifies the address to be programmed. |
181 | * @param Address: Specifies the address to be programmed. |
| 182 | * @param Data: Specifies the data to be programmed |
182 | * @param Data: Specifies the data to be programmed |
| 183 | * |
183 | * |
| Line 272... | Line 272... | ||
| 272 | * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface |
272 | * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface |
| 273 | * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface |
273 | * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface |
| 274 | * |
274 | * |
| 275 | * @note If an erase and a program operations are requested simultaneously, |
275 | * @note If an erase and a program operations are requested simultaneously, |
| 276 | * the erase operation is performed before the program one. |
276 | * the erase operation is performed before the program one. |
| 277 | * |
277 | * |
| 278 | * @param TypeProgram: Indicate the way to program at a specified address. |
278 | * @param TypeProgram: Indicate the way to program at a specified address. |
| 279 | * This parameter can be a value of @ref FLASH_Type_Program |
279 | * This parameter can be a value of @ref FLASH_Type_Program |
| 280 | * @param Address: Specifies the address to be programmed. |
280 | * @param Address: Specifies the address to be programmed. |
| 281 | * @param Data: Specifies the data to be programmed |
281 | * @param Data: Specifies the data to be programmed |
| 282 | * |
282 | * |
| Line 357... | Line 357... | ||
| 357 | (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK2) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK2))) |
357 | (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK2) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK2))) |
| 358 | #else |
358 | #else |
| 359 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) |
359 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) |
| 360 | #endif /* FLASH_BANK2_END */ |
360 | #endif /* FLASH_BANK2_END */ |
| 361 | { |
361 | { |
| - | 362 | /*return the faulty address*/ |
|
| - | 363 | addresstmp = pFlash.Address; |
|
| - | 364 | /* Reset address */ |
|
| - | 365 | pFlash.Address = 0xFFFFFFFF; |
|
| - | 366 | ||
| 362 | /*Save the Error code*/ |
367 | /*Save the Error code*/ |
| 363 | FLASH_SetErrorCode(); |
368 | FLASH_SetErrorCode(); |
| 364 | 369 | ||
| 365 | /* FLASH error interrupt user callback */ |
370 | /* FLASH error interrupt user callback */ |
| 366 | HAL_FLASH_OperationErrorCallback(pFlash.Address); |
371 | HAL_FLASH_OperationErrorCallback(addresstmp); |
| 367 | 372 | ||
| 368 | /* Reset address and stop the procedure ongoing*/ |
373 | /* Stop the procedure ongoing*/ |
| 369 | pFlash.Address = 0xFFFFFFFF; |
- | |
| 370 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
374 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
| 371 | } |
375 | } |
| 372 | 376 | ||
| 373 | /* Check FLASH End of Operation flag */ |
377 | /* Check FLASH End of Operation flag */ |
| 374 | #if defined(FLASH_BANK2_END) |
378 | #if defined(FLASH_BANK2_END) |
| Line 389... | Line 393... | ||
| 389 | if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) |
393 | if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) |
| 390 | { |
394 | { |
| 391 | /* Nb of pages to erased can be decreased */ |
395 | /* Nb of pages to erased can be decreased */ |
| 392 | pFlash.DataRemaining--; |
396 | pFlash.DataRemaining--; |
| 393 | 397 | ||
| 394 | /* Indicate user which page address has been erased*/ |
- | |
| 395 | HAL_FLASH_EndOfOperationCallback(pFlash.Address); |
- | |
| 396 | - | ||
| 397 | /* Check if there are still pages to erase*/ |
398 | /* Check if there are still pages to erase*/ |
| 398 | if(pFlash.DataRemaining != 0) |
399 | if(pFlash.DataRemaining != 0) |
| 399 | { |
400 | { |
| 400 | /* Increment page address to next page */ |
- | |
| 401 | pFlash.Address += FLASH_PAGE_SIZE; |
- | |
| 402 | addresstmp = pFlash.Address; |
401 | addresstmp = pFlash.Address; |
| - | 402 | /*Indicate user which sector has been erased*/ |
|
| - | 403 | HAL_FLASH_EndOfOperationCallback(addresstmp); |
|
| 403 | 404 | ||
| - | 405 | /*Increment sector number*/ |
|
| - | 406 | addresstmp = pFlash.Address + FLASH_PAGE_SIZE; |
|
| - | 407 | pFlash.Address = addresstmp; |
|
| - | 408 | ||
| 404 | /* Operation is completed, disable the PER Bit */ |
409 | /* If the erase operation is completed, disable the PER Bit */ |
| 405 | CLEAR_BIT(FLASH->CR, FLASH_CR_PER); |
410 | CLEAR_BIT(FLASH->CR, FLASH_CR_PER); |
| 406 | 411 | ||
| 407 | FLASH_PageErase(addresstmp); |
412 | FLASH_PageErase(addresstmp); |
| 408 | } |
413 | } |
| 409 | else |
414 | else |
| 410 | { |
415 | { |
| 411 | /*No more pages to Erase*/ |
416 | /*No more pages to Erase, user callback can be called.*/ |
| 412 | - | ||
| 413 | /*Reset Address and stop Erase pages procedure*/ |
417 | /*Reset Sector and stop Erase pages procedure*/ |
| 414 | pFlash.Address = 0xFFFFFFFF; |
418 | pFlash.Address = addresstmp = 0xFFFFFFFF; |
| 415 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
419 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
| - | 420 | /* FLASH EOP interrupt user callback */ |
|
| - | 421 | HAL_FLASH_EndOfOperationCallback(addresstmp); |
|
| 416 | } |
422 | } |
| 417 | } |
423 | } |
| 418 | else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) |
424 | else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) |
| 419 | { |
425 | { |
| 420 | /* Operation is completed, disable the MER Bit */ |
426 | /* Operation is completed, disable the MER Bit */ |
| Line 494... | Line 500... | ||
| 494 | if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) |
500 | if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) |
| 495 | { |
501 | { |
| 496 | /* Nb of pages to erased can be decreased */ |
502 | /* Nb of pages to erased can be decreased */ |
| 497 | pFlash.DataRemaining--; |
503 | pFlash.DataRemaining--; |
| 498 | 504 | ||
| 499 | /* Indicate user which page address has been erased*/ |
- | |
| 500 | HAL_FLASH_EndOfOperationCallback(pFlash.Address); |
- | |
| 501 | - | ||
| 502 | /* Check if there are still pages to erase*/ |
505 | /* Check if there are still pages to erase*/ |
| 503 | if(pFlash.DataRemaining != 0) |
506 | if(pFlash.DataRemaining != 0) |
| 504 | { |
507 | { |
| - | 508 | /* Indicate user which page address has been erased*/ |
|
| - | 509 | HAL_FLASH_EndOfOperationCallback(pFlash.Address); |
|
| - | 510 | ||
| 505 | /* Increment page address to next page */ |
511 | /* Increment page address to next page */ |
| 506 | pFlash.Address += FLASH_PAGE_SIZE; |
512 | pFlash.Address += FLASH_PAGE_SIZE; |
| 507 | addresstmp = pFlash.Address; |
513 | addresstmp = pFlash.Address; |
| 508 | 514 | ||
| 509 | /* Operation is completed, disable the PER Bit */ |
515 | /* Operation is completed, disable the PER Bit */ |
| Line 516... | Line 522... | ||
| 516 | /*No more pages to Erase*/ |
522 | /*No more pages to Erase*/ |
| 517 | 523 | ||
| 518 | /*Reset Address and stop Erase pages procedure*/ |
524 | /*Reset Address and stop Erase pages procedure*/ |
| 519 | pFlash.Address = 0xFFFFFFFF; |
525 | pFlash.Address = 0xFFFFFFFF; |
| 520 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
526 | pFlash.ProcedureOnGoing = FLASH_PROC_NONE; |
| - | 527 | ||
| - | 528 | /* FLASH EOP interrupt user callback */ |
|
| - | 529 | HAL_FLASH_EndOfOperationCallback(pFlash.Address); |
|
| 521 | } |
530 | } |
| 522 | } |
531 | } |
| 523 | else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) |
532 | else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) |
| 524 | { |
533 | { |
| 525 | /* Operation is completed, disable the MER Bit */ |
534 | /* Operation is completed, disable the MER Bit */ |
| Line 607... | Line 616... | ||
| 607 | /** |
616 | /** |
| 608 | * @brief FLASH end of operation interrupt callback |
617 | * @brief FLASH end of operation interrupt callback |
| 609 | * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure |
618 | * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure |
| 610 | * - Mass Erase: No return value expected |
619 | * - Mass Erase: No return value expected |
| 611 | * - Pages Erase: Address of the page which has been erased |
620 | * - Pages Erase: Address of the page which has been erased |
| - | 621 | * (if 0xFFFFFFFF, it means that all the selected pages have been erased) |
|
| 612 | * - Program: Address which was selected for data program |
622 | * - Program: Address which was selected for data program |
| 613 | * @retval none |
623 | * @retval none |
| 614 | */ |
624 | */ |
| 615 | __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) |
625 | __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) |
| 616 | { |
626 | { |
| - | 627 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 628 | UNUSED(ReturnValue); |
|
| 617 | /* NOTE : This function Should not be modified, when the callback is needed, |
629 | /* NOTE : This function Should not be modified, when the callback is needed, |
| 618 | the HAL_FLASH_EndOfOperationCallback could be implemented in the user file |
630 | the HAL_FLASH_EndOfOperationCallback could be implemented in the user file |
| 619 | */ |
631 | */ |
| 620 | } |
632 | } |
| 621 | 633 | ||
| Line 627... | Line 639... | ||
| 627 | * - Program: Address which was selected for data program |
639 | * - Program: Address which was selected for data program |
| 628 | * @retval none |
640 | * @retval none |
| 629 | */ |
641 | */ |
| 630 | __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) |
642 | __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) |
| 631 | { |
643 | { |
| - | 644 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 645 | UNUSED(ReturnValue); |
|
| 632 | /* NOTE : This function Should not be modified, when the callback is needed, |
646 | /* NOTE : This function Should not be modified, when the callback is needed, |
| 633 | the HAL_FLASH_OperationErrorCallback could be implemented in the user file |
647 | the HAL_FLASH_OperationErrorCallback could be implemented in the user file |
| 634 | */ |
648 | */ |
| 635 | } |
649 | } |
| 636 | 650 | ||
| Line 785... | Line 799... | ||
| 785 | */ |
799 | */ |
| 786 | 800 | ||
| 787 | /** @addtogroup FLASH_Private_Functions |
801 | /** @addtogroup FLASH_Private_Functions |
| 788 | * @{ |
802 | * @{ |
| 789 | */ |
803 | */ |
| - | 804 | ||
| 790 | /** |
805 | /** |
| 791 | * @brief Program a half-word (16-bit) at a specified address. |
806 | * @brief Program a half-word (16-bit) at a specified address. |
| 792 | * @param Address: specifies the address to be programmed. |
807 | * @param Address: specifies the address to be programmed. |
| 793 | * @param Data: specifies the data to be programmed. |
808 | * @param Data: specifies the data to be programmed. |
| 794 | * @retval None |
809 | * @retval None |
| Line 817... | Line 832... | ||
| 817 | *(__IO uint16_t*)Address = Data; |
832 | *(__IO uint16_t*)Address = Data; |
| 818 | } |
833 | } |
| 819 | 834 | ||
| 820 | /** |
835 | /** |
| 821 | * @brief Wait for a FLASH operation to complete. |
836 | * @brief Wait for a FLASH operation to complete. |
| 822 | * @param Timeout: maximum flash operationtimeout |
837 | * @param Timeout: maximum flash operation timeout |
| 823 | * @retval HAL_StatusTypeDef HAL Status |
838 | * @retval HAL_StatusTypeDef HAL Status |
| 824 | */ |
839 | */ |
| 825 | HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) |
840 | HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) |
| 826 | { |
841 | { |
| 827 | /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. |
842 | /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. |
| Line 846... | Line 861... | ||
| 846 | { |
861 | { |
| 847 | /* Clear FLASH End of Operation pending bit */ |
862 | /* Clear FLASH End of Operation pending bit */ |
| 848 | __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
863 | __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
| 849 | } |
864 | } |
| 850 | 865 | ||
| 851 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR) || \ |
866 | if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || |
| - | 867 | __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) || |
|
| 852 | __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR)) |
868 | __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) |
| 853 | { |
869 | { |
| 854 | /*Save the error code*/ |
870 | /*Save the error code*/ |
| 855 | FLASH_SetErrorCode(); |
871 | FLASH_SetErrorCode(); |
| 856 | return HAL_ERROR; |
872 | return HAL_ERROR; |
| 857 | } |
873 | } |
| 858 | 874 | ||
| 859 | /* If there is no error flag set */ |
875 | /* If there is no error flag set */ |
| 860 | return HAL_OK; |
876 | return HAL_OK; |
| 861 | - | ||
| 862 | } |
877 | } |
| 863 | 878 | ||
| 864 | #if defined(FLASH_BANK2_END) |
879 | #if defined(FLASH_BANK2_END) |
| 865 | /** |
880 | /** |
| 866 | * @brief Wait for a FLASH BANK2 operation to complete. |
881 | * @brief Wait for a FLASH BANK2 operation to complete. |