File indexing completed on 2025-05-11 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087 #include "stm32h7xx_hal.h"
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099 #ifdef HAL_FLASH_MODULE_ENABLED
0100
0101
0102
0103
0104
0105
0106 #define FLASH_TIMEOUT_VALUE 50000U
0107
0108
0109
0110
0111
0112
0113
0114
0115 FLASH_ProcessTypeDef pFlash;
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t FlashAddress, uint32_t DataAddress)
0158 {
0159 HAL_StatusTypeDef status;
0160 __IO uint32_t *dest_addr = (__IO uint32_t *)FlashAddress;
0161 __IO uint32_t *src_addr = (__IO uint32_t*)DataAddress;
0162 uint32_t bank;
0163 uint8_t row_index = FLASH_NB_32BITWORD_IN_FLASHWORD;
0164
0165
0166 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
0167 assert_param(IS_FLASH_PROGRAM_ADDRESS(FlashAddress));
0168
0169
0170 __HAL_LOCK(&pFlash);
0171
0172 #if defined (FLASH_OPTCR_PG_OTP)
0173 if((IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress)) || (IS_FLASH_PROGRAM_ADDRESS_OTP(FlashAddress)))
0174 #else
0175 if(IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress))
0176 #endif
0177 {
0178 bank = FLASH_BANK_1;
0179
0180 UNUSED(TypeProgram);
0181 }
0182 #if defined (DUAL_BANK)
0183 else if(IS_FLASH_PROGRAM_ADDRESS_BANK2(FlashAddress))
0184 {
0185 bank = FLASH_BANK_2;
0186 }
0187 #endif
0188 else
0189 {
0190 return HAL_ERROR;
0191 }
0192
0193
0194 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
0195
0196
0197 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, bank);
0198
0199 if(status == HAL_OK)
0200 {
0201 #if defined (DUAL_BANK)
0202 if(bank == FLASH_BANK_1)
0203 {
0204 #if defined (FLASH_OPTCR_PG_OTP)
0205 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0206 {
0207
0208 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0209 }
0210 else
0211 #endif
0212 {
0213
0214 SET_BIT(FLASH->CR1, FLASH_CR_PG);
0215 }
0216 }
0217 else
0218 {
0219
0220 SET_BIT(FLASH->CR2, FLASH_CR_PG);
0221 }
0222 #else
0223 #if defined (FLASH_OPTCR_PG_OTP)
0224 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0225 {
0226
0227 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0228 }
0229 else
0230 #endif
0231 {
0232
0233 SET_BIT(FLASH->CR1, FLASH_CR_PG);
0234 }
0235 #endif
0236
0237 __ISB();
0238 __DSB();
0239
0240 #if defined (FLASH_OPTCR_PG_OTP)
0241 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0242 {
0243
0244 *(__IO uint16_t *)FlashAddress = *(__IO uint16_t*)DataAddress;
0245 }
0246 else
0247 #endif
0248 {
0249
0250 do
0251 {
0252 *dest_addr = *src_addr;
0253 dest_addr++;
0254 src_addr++;
0255 row_index--;
0256 } while (row_index != 0U);
0257 }
0258
0259 __ISB();
0260 __DSB();
0261
0262
0263 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, bank);
0264
0265 #if defined (DUAL_BANK)
0266 #if defined (FLASH_OPTCR_PG_OTP)
0267 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0268 {
0269
0270 CLEAR_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0271 }
0272 else
0273 #endif
0274 {
0275 if(bank == FLASH_BANK_1)
0276 {
0277
0278 CLEAR_BIT(FLASH->CR1, FLASH_CR_PG);
0279 }
0280 else
0281 {
0282
0283 CLEAR_BIT(FLASH->CR2, FLASH_CR_PG);
0284 }
0285 }
0286 #else
0287 #if defined (FLASH_OPTCR_PG_OTP)
0288 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0289 {
0290
0291 CLEAR_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0292 }
0293 else
0294 #endif
0295 {
0296
0297 CLEAR_BIT(FLASH->CR1, FLASH_CR_PG);
0298 }
0299 #endif
0300 }
0301
0302
0303 __HAL_UNLOCK(&pFlash);
0304
0305 return status;
0306 }
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322 HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t FlashAddress, uint32_t DataAddress)
0323 {
0324 HAL_StatusTypeDef status;
0325 __IO uint32_t *dest_addr = (__IO uint32_t*)FlashAddress;
0326 __IO uint32_t *src_addr = (__IO uint32_t*)DataAddress;
0327 uint32_t bank;
0328 uint8_t row_index = FLASH_NB_32BITWORD_IN_FLASHWORD;
0329
0330
0331 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
0332 assert_param(IS_FLASH_PROGRAM_ADDRESS(FlashAddress));
0333
0334
0335 __HAL_LOCK(&pFlash);
0336
0337
0338 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
0339
0340 #if defined (FLASH_OPTCR_PG_OTP)
0341 if((IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress)) || (IS_FLASH_PROGRAM_ADDRESS_OTP(FlashAddress)))
0342 #else
0343 if(IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress))
0344 #endif
0345 {
0346 bank = FLASH_BANK_1;
0347
0348 UNUSED(TypeProgram);
0349 }
0350 #if defined (DUAL_BANK)
0351 else if(IS_FLASH_PROGRAM_ADDRESS_BANK2(FlashAddress))
0352 {
0353 bank = FLASH_BANK_2;
0354 }
0355 #endif
0356 else
0357 {
0358 return HAL_ERROR;
0359 }
0360
0361
0362 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, bank);
0363
0364 if (status != HAL_OK)
0365 {
0366
0367 __HAL_UNLOCK(&pFlash);
0368 }
0369 else
0370 {
0371 pFlash.Address = FlashAddress;
0372
0373 #if defined (DUAL_BANK)
0374 if(bank == FLASH_BANK_1)
0375 {
0376
0377 pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM_BANK1;
0378
0379 #if defined (FLASH_OPTCR_PG_OTP)
0380 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0381 {
0382
0383 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0384 }
0385 else
0386 #endif
0387 {
0388
0389 SET_BIT(FLASH->CR1, FLASH_CR_PG);
0390 }
0391
0392
0393 #if defined (FLASH_CR_OPERRIE)
0394 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0395 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
0396 #else
0397 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0398 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
0399 #endif
0400 }
0401 else
0402 {
0403
0404 pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM_BANK2;
0405
0406
0407 SET_BIT(FLASH->CR2, FLASH_CR_PG);
0408
0409
0410 #if defined (FLASH_CR_OPERRIE)
0411 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0412 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2 | FLASH_IT_OPERR_BANK2);
0413 #else
0414 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0415 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2);
0416 #endif
0417 }
0418 #else
0419
0420 pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM_BANK1;
0421
0422 #if defined (FLASH_OPTCR_PG_OTP)
0423 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0424 {
0425
0426 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
0427 }
0428 else
0429 #endif
0430 {
0431
0432 SET_BIT(FLASH->CR1, FLASH_CR_PG);
0433 }
0434
0435
0436 #if defined (FLASH_CR_OPERRIE)
0437 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0438 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
0439 #else
0440 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0441 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
0442 #endif
0443 #endif
0444
0445 __ISB();
0446 __DSB();
0447
0448 #if defined (FLASH_OPTCR_PG_OTP)
0449 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
0450 {
0451
0452 *(__IO uint16_t *)FlashAddress = *(__IO uint16_t*)DataAddress;
0453 }
0454 else
0455 #endif
0456 {
0457
0458 do
0459 {
0460 *dest_addr = *src_addr;
0461 dest_addr++;
0462 src_addr++;
0463 row_index--;
0464 } while (row_index != 0U);
0465 }
0466
0467 __ISB();
0468 __DSB();
0469 }
0470
0471 return status;
0472 }
0473
0474
0475
0476
0477
0478 void HAL_FLASH_IRQHandler(void)
0479 {
0480 uint32_t temp;
0481 uint32_t errorflag;
0482 FLASH_ProcedureTypeDef procedure;
0483
0484
0485 if(__HAL_FLASH_GET_FLAG_BANK1(FLASH_SR_EOP) != RESET)
0486 {
0487 if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE_BANK1)
0488 {
0489
0490 pFlash.NbSectorsToErase--;
0491
0492
0493 if(pFlash.NbSectorsToErase != 0U)
0494 {
0495
0496 HAL_FLASH_EndOfOperationCallback(pFlash.Sector);
0497
0498
0499 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_EOP_BANK1);
0500
0501
0502 pFlash.Sector++;
0503 temp = pFlash.Sector;
0504 FLASH_Erase_Sector(temp, FLASH_BANK_1, pFlash.VoltageForErase);
0505 }
0506 else
0507 {
0508
0509
0510 pFlash.Sector = 0xFFFFFFFFU;
0511 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0512
0513
0514 HAL_FLASH_EndOfOperationCallback(pFlash.Sector);
0515
0516
0517 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_EOP_BANK1);
0518 }
0519 }
0520 else
0521 {
0522 procedure = pFlash.ProcedureOnGoing;
0523
0524 if((procedure == FLASH_PROC_MASSERASE_BANK1) || (procedure == FLASH_PROC_ALLBANK_MASSERASE))
0525 {
0526
0527
0528 HAL_FLASH_EndOfOperationCallback(FLASH_BANK_1);
0529 }
0530 else if(procedure == FLASH_PROC_PROGRAM_BANK1)
0531 {
0532
0533
0534 HAL_FLASH_EndOfOperationCallback(pFlash.Address);
0535 }
0536 else
0537 {
0538
0539 }
0540
0541 if((procedure != FLASH_PROC_SECTERASE_BANK2) && \
0542 (procedure != FLASH_PROC_MASSERASE_BANK2) && \
0543 (procedure != FLASH_PROC_PROGRAM_BANK2))
0544 {
0545 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0546
0547 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_EOP_BANK1);
0548 }
0549 }
0550 }
0551
0552 #if defined (DUAL_BANK)
0553
0554 if(__HAL_FLASH_GET_FLAG_BANK2(FLASH_SR_EOP) != RESET)
0555 {
0556 if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE_BANK2)
0557 {
0558
0559 pFlash.NbSectorsToErase--;
0560
0561
0562 if(pFlash.NbSectorsToErase != 0U)
0563 {
0564
0565 HAL_FLASH_EndOfOperationCallback(pFlash.Sector);
0566
0567
0568 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_EOP_BANK2);
0569
0570
0571 pFlash.Sector++;
0572 temp = pFlash.Sector;
0573 FLASH_Erase_Sector(temp, FLASH_BANK_2, pFlash.VoltageForErase);
0574 }
0575 else
0576 {
0577
0578
0579 pFlash.Sector = 0xFFFFFFFFU;
0580 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0581
0582
0583 HAL_FLASH_EndOfOperationCallback(pFlash.Sector);
0584
0585
0586 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_EOP_BANK2);
0587 }
0588 }
0589 else
0590 {
0591 procedure = pFlash.ProcedureOnGoing;
0592
0593 if((procedure == FLASH_PROC_MASSERASE_BANK2) || (procedure == FLASH_PROC_ALLBANK_MASSERASE))
0594 {
0595
0596
0597 HAL_FLASH_EndOfOperationCallback(FLASH_BANK_2);
0598 }
0599 else if(procedure == FLASH_PROC_PROGRAM_BANK2)
0600 {
0601
0602
0603 HAL_FLASH_EndOfOperationCallback(pFlash.Address);
0604 }
0605 else
0606 {
0607
0608 }
0609
0610 if((procedure != FLASH_PROC_SECTERASE_BANK1) && \
0611 (procedure != FLASH_PROC_MASSERASE_BANK1) && \
0612 (procedure != FLASH_PROC_PROGRAM_BANK1))
0613 {
0614 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0615
0616 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_EOP_BANK2);
0617 }
0618 }
0619 }
0620 #endif
0621
0622
0623 #if defined (FLASH_SR_OPERR)
0624 errorflag = FLASH->SR1 & (FLASH_FLAG_WRPERR_BANK1 | FLASH_FLAG_PGSERR_BANK1 | FLASH_FLAG_STRBERR_BANK1 | \
0625 FLASH_FLAG_INCERR_BANK1 | FLASH_FLAG_OPERR_BANK1);
0626 #else
0627 errorflag = FLASH->SR1 & (FLASH_FLAG_WRPERR_BANK1 | FLASH_FLAG_PGSERR_BANK1 | FLASH_FLAG_STRBERR_BANK1 | \
0628 FLASH_FLAG_INCERR_BANK1);
0629 #endif
0630
0631 if(errorflag != 0U)
0632 {
0633
0634 pFlash.ErrorCode |= errorflag;
0635
0636
0637 __HAL_FLASH_CLEAR_FLAG_BANK1(errorflag);
0638
0639 procedure = pFlash.ProcedureOnGoing;
0640
0641 if(procedure == FLASH_PROC_SECTERASE_BANK1)
0642 {
0643
0644 temp = pFlash.Sector;
0645 pFlash.Sector = 0xFFFFFFFFU;
0646 }
0647 else if((procedure == FLASH_PROC_MASSERASE_BANK1) || (procedure == FLASH_PROC_ALLBANK_MASSERASE))
0648 {
0649
0650 temp = FLASH_BANK_1;
0651 }
0652 else
0653 {
0654
0655 temp = pFlash.Address;
0656 }
0657
0658
0659 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0660
0661
0662 HAL_FLASH_OperationErrorCallback(temp);
0663 }
0664
0665 #if (USE_FLASH_ECC == 1U)
0666
0667 errorflag = FLASH->SR1 & FLASH_FLAG_SNECCERR_BANK1;
0668
0669 if(errorflag != 0U)
0670 {
0671
0672 pFlash.ErrorCode |= errorflag;
0673
0674
0675 HAL_FLASHEx_EccCorrectionCallback();
0676
0677
0678 __HAL_FLASH_CLEAR_FLAG_BANK1(errorflag);
0679 }
0680
0681
0682 errorflag = FLASH->SR1 & FLASH_FLAG_DBECCERR_BANK1;
0683
0684 if(errorflag != 0U)
0685 {
0686
0687 pFlash.ErrorCode |= errorflag;
0688
0689
0690 HAL_FLASHEx_EccDetectionCallback();
0691
0692
0693 __HAL_FLASH_CLEAR_FLAG_BANK1(errorflag);
0694 }
0695 #endif
0696
0697 #if defined (DUAL_BANK)
0698
0699 #if defined (FLASH_SR_OPERR)
0700 errorflag = FLASH->SR2 & ((FLASH_FLAG_WRPERR_BANK2 | FLASH_FLAG_PGSERR_BANK2 | FLASH_FLAG_STRBERR_BANK2 | \
0701 FLASH_FLAG_INCERR_BANK2 | FLASH_FLAG_OPERR_BANK2) & 0x7FFFFFFFU);
0702 #else
0703 errorflag = FLASH->SR2 & ((FLASH_FLAG_WRPERR_BANK2 | FLASH_FLAG_PGSERR_BANK2 | FLASH_FLAG_STRBERR_BANK2 | \
0704 FLASH_FLAG_INCERR_BANK2) & 0x7FFFFFFFU);
0705 #endif
0706
0707 if(errorflag != 0U)
0708 {
0709
0710 pFlash.ErrorCode |= (errorflag | 0x80000000U);
0711
0712
0713 __HAL_FLASH_CLEAR_FLAG_BANK2(errorflag);
0714
0715 procedure = pFlash.ProcedureOnGoing;
0716
0717 if(procedure== FLASH_PROC_SECTERASE_BANK2)
0718 {
0719
0720 temp = pFlash.Sector;
0721 pFlash.Sector = 0xFFFFFFFFU;
0722 }
0723 else if((procedure == FLASH_PROC_MASSERASE_BANK2) || (procedure == FLASH_PROC_ALLBANK_MASSERASE))
0724 {
0725
0726 temp = FLASH_BANK_2;
0727 }
0728 else
0729 {
0730
0731 temp = pFlash.Address;
0732 }
0733
0734
0735 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
0736
0737
0738 HAL_FLASH_OperationErrorCallback(temp);
0739 }
0740
0741 #if (USE_FLASH_ECC == 1U)
0742
0743 errorflag = FLASH->SR2 & FLASH_FLAG_SNECCERR_BANK2;
0744
0745 if(errorflag != 0U)
0746 {
0747
0748 pFlash.ErrorCode |= (errorflag | 0x80000000U);
0749
0750
0751 HAL_FLASHEx_EccCorrectionCallback();
0752
0753
0754 __HAL_FLASH_CLEAR_FLAG_BANK2(errorflag);
0755 }
0756
0757
0758 errorflag = FLASH->SR2 & FLASH_FLAG_DBECCERR_BANK2;
0759
0760 if(errorflag != 0U)
0761 {
0762
0763 pFlash.ErrorCode |= (errorflag | 0x80000000U);
0764
0765
0766 HAL_FLASHEx_EccDetectionCallback();
0767
0768
0769 __HAL_FLASH_CLEAR_FLAG_BANK2(errorflag);
0770 }
0771
0772 #endif
0773 #endif
0774
0775 if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE)
0776 {
0777 #if defined (FLASH_CR_OPERRIE)
0778
0779 __HAL_FLASH_DISABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0780 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
0781
0782 #if defined (DUAL_BANK)
0783
0784 __HAL_FLASH_DISABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0785 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2 | FLASH_IT_OPERR_BANK2);
0786 #endif
0787 #else
0788
0789 __HAL_FLASH_DISABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0790 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
0791
0792 #if defined (DUAL_BANK)
0793
0794 __HAL_FLASH_DISABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0795 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2);
0796 #endif
0797 #endif
0798
0799
0800 __HAL_UNLOCK(&pFlash);
0801 }
0802 }
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813 __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
0814 {
0815
0816 UNUSED(ReturnValue);
0817
0818
0819
0820
0821 }
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831 __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
0832 {
0833
0834 UNUSED(ReturnValue);
0835
0836
0837
0838
0839 }
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865 HAL_StatusTypeDef HAL_FLASH_Unlock(void)
0866 {
0867 if(READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
0868 {
0869
0870 WRITE_REG(FLASH->KEYR1, FLASH_KEY1);
0871 WRITE_REG(FLASH->KEYR1, FLASH_KEY2);
0872
0873
0874 if (READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
0875 {
0876 return HAL_ERROR;
0877 }
0878 }
0879
0880 #if defined (DUAL_BANK)
0881 if(READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
0882 {
0883
0884 WRITE_REG(FLASH->KEYR2, FLASH_KEY1);
0885 WRITE_REG(FLASH->KEYR2, FLASH_KEY2);
0886
0887
0888 if (READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
0889 {
0890 return HAL_ERROR;
0891 }
0892 }
0893 #endif
0894
0895 return HAL_OK;
0896 }
0897
0898
0899
0900
0901
0902 HAL_StatusTypeDef HAL_FLASH_Lock(void)
0903 {
0904
0905 SET_BIT(FLASH->CR1, FLASH_CR_LOCK);
0906
0907
0908 if (READ_BIT(FLASH->CR1, FLASH_CR_LOCK) == 0U)
0909 {
0910 return HAL_ERROR;
0911 }
0912
0913 #if defined (DUAL_BANK)
0914
0915 SET_BIT(FLASH->CR2, FLASH_CR_LOCK);
0916
0917
0918 if (READ_BIT(FLASH->CR2, FLASH_CR_LOCK) == 0U)
0919 {
0920 return HAL_ERROR;
0921 }
0922 #endif
0923
0924 return HAL_OK;
0925 }
0926
0927
0928
0929
0930
0931 HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
0932 {
0933 if(READ_BIT(FLASH->OPTCR, FLASH_OPTCR_OPTLOCK) != 0U)
0934 {
0935
0936 WRITE_REG(FLASH->OPTKEYR, FLASH_OPT_KEY1);
0937 WRITE_REG(FLASH->OPTKEYR, FLASH_OPT_KEY2);
0938
0939
0940 if (READ_BIT(FLASH->OPTCR, FLASH_OPTCR_OPTLOCK) != 0U)
0941 {
0942 return HAL_ERROR;
0943 }
0944 }
0945
0946 return HAL_OK;
0947 }
0948
0949
0950
0951
0952
0953 HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
0954 {
0955
0956 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_OPTLOCK);
0957
0958
0959 if (READ_BIT(FLASH->OPTCR, FLASH_OPTCR_OPTLOCK) == 0U)
0960 {
0961 return HAL_ERROR;
0962 }
0963
0964 return HAL_OK;
0965 }
0966
0967
0968
0969
0970
0971 HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
0972 {
0973 HAL_StatusTypeDef status;
0974
0975
0976 if (FLASH_CRC_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1) != HAL_OK)
0977 {
0978 status = HAL_ERROR;
0979 }
0980 #if defined (DUAL_BANK)
0981 else if (FLASH_CRC_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2) != HAL_OK)
0982 {
0983 status = HAL_ERROR;
0984 }
0985 #endif
0986 else
0987 {
0988 status = HAL_OK;
0989 }
0990
0991 if (status == HAL_OK)
0992 {
0993
0994 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_OPTSTART);
0995
0996
0997 status = FLASH_OB_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
0998 }
0999
1000 return status;
1001 }
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050 uint32_t HAL_FLASH_GetError(void)
1051 {
1052 return pFlash.ErrorCode;
1053 }
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075 HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout, uint32_t Bank)
1076 {
1077
1078
1079
1080
1081 uint32_t bsyflag = FLASH_FLAG_QW_BANK1;
1082 uint32_t errorflag = 0;
1083 uint32_t tickstart = HAL_GetTick();
1084
1085 assert_param(IS_FLASH_BANK_EXCLUSIVE(Bank));
1086
1087 #if defined (DUAL_BANK)
1088
1089 if (Bank == FLASH_BANK_2)
1090 {
1091
1092 bsyflag = FLASH_FLAG_QW_BANK2;
1093 }
1094 #endif
1095
1096 while(__HAL_FLASH_GET_FLAG(bsyflag))
1097 {
1098 if(Timeout != HAL_MAX_DELAY)
1099 {
1100 if(((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1101 {
1102 return HAL_TIMEOUT;
1103 }
1104 }
1105 }
1106
1107
1108 if (Bank == FLASH_BANK_1)
1109 {
1110 errorflag = FLASH->SR1 & FLASH_FLAG_ALL_ERRORS_BANK1;
1111 }
1112 #if defined (DUAL_BANK)
1113 else
1114 {
1115 errorflag = (FLASH->SR2 & FLASH_FLAG_ALL_ERRORS_BANK2) | 0x80000000U;
1116 }
1117 #endif
1118
1119
1120 if((errorflag & 0x7FFFFFFFU) != 0U)
1121 {
1122
1123 pFlash.ErrorCode |= errorflag;
1124
1125
1126 __HAL_FLASH_CLEAR_FLAG(errorflag);
1127
1128 return HAL_ERROR;
1129 }
1130
1131
1132 if(Bank == FLASH_BANK_1)
1133 {
1134 if (__HAL_FLASH_GET_FLAG_BANK1(FLASH_FLAG_EOP_BANK1))
1135 {
1136
1137 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_EOP_BANK1);
1138 }
1139 }
1140 #if defined (DUAL_BANK)
1141 else
1142 {
1143 if (__HAL_FLASH_GET_FLAG_BANK2(FLASH_FLAG_EOP_BANK2))
1144 {
1145
1146 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_EOP_BANK2);
1147 }
1148 }
1149 #endif
1150
1151 return HAL_OK;
1152 }
1153
1154
1155
1156
1157
1158
1159 HAL_StatusTypeDef FLASH_OB_WaitForLastOperation(uint32_t Timeout)
1160 {
1161
1162 uint32_t tickstart = HAL_GetTick();
1163
1164
1165 while(READ_BIT(FLASH->OPTSR_CUR, FLASH_OPTSR_OPT_BUSY) != 0U)
1166 {
1167 if(Timeout != HAL_MAX_DELAY)
1168 {
1169 if(((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1170 {
1171 return HAL_TIMEOUT;
1172 }
1173 }
1174 }
1175
1176
1177 if(READ_BIT(FLASH->OPTSR_CUR, FLASH_OPTSR_OPTCHANGEERR) != 0U)
1178 {
1179
1180 pFlash.ErrorCode |= HAL_FLASH_ERROR_OB_CHANGE;
1181
1182
1183 FLASH->OPTCCR |= FLASH_OPTCCR_CLR_OPTCHANGEERR;
1184
1185 return HAL_ERROR;
1186 }
1187
1188
1189 return HAL_OK;
1190 }
1191
1192
1193
1194
1195
1196
1197
1198 HAL_StatusTypeDef FLASH_CRC_WaitForLastOperation(uint32_t Timeout, uint32_t Bank)
1199 {
1200 uint32_t bsyflag;
1201 uint32_t tickstart = HAL_GetTick();
1202
1203 assert_param(IS_FLASH_BANK_EXCLUSIVE(Bank));
1204
1205
1206 if(Bank == FLASH_BANK_1)
1207 {
1208 bsyflag = FLASH_FLAG_CRC_BUSY_BANK1;
1209 }
1210 else
1211 {
1212 bsyflag = FLASH_FLAG_CRC_BUSY_BANK2;
1213 }
1214
1215
1216 while(__HAL_FLASH_GET_FLAG(bsyflag))
1217 {
1218 if(Timeout != HAL_MAX_DELAY)
1219 {
1220 if(((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1221 {
1222 return HAL_TIMEOUT;
1223 }
1224 }
1225 }
1226
1227
1228 if(Bank == FLASH_BANK_1)
1229 {
1230 if (__HAL_FLASH_GET_FLAG_BANK1(FLASH_FLAG_CRCRDERR_BANK1))
1231 {
1232
1233 pFlash.ErrorCode |= HAL_FLASH_ERROR_CRCRD_BANK1;
1234
1235
1236 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_CRCRDERR_BANK1);
1237
1238 return HAL_ERROR;
1239 }
1240 }
1241 #if defined (DUAL_BANK)
1242 else
1243 {
1244 if (__HAL_FLASH_GET_FLAG_BANK2(FLASH_FLAG_CRCRDERR_BANK2))
1245 {
1246
1247 pFlash.ErrorCode |= HAL_FLASH_ERROR_CRCRD_BANK2;
1248
1249
1250 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_CRCRDERR_BANK2);
1251
1252 return HAL_ERROR;
1253 }
1254 }
1255 #endif
1256
1257
1258 return HAL_OK;
1259 }
1260
1261
1262
1263
1264
1265 #endif
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275