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 #include "stm32h7xx_hal.h"
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 #ifdef HAL_FLASH_MODULE_ENABLED
0098
0099
0100
0101
0102
0103
0104 #define FLASH_TIMEOUT_VALUE 50000U
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 static void FLASH_MassErase(uint32_t VoltageRange, uint32_t Banks);
0117 static void FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks);
0118 static void FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Bank);
0119 static void FLASH_OB_GetWRP(uint32_t *WRPState, uint32_t *WRPSector, uint32_t Bank);
0120 static void FLASH_OB_RDPConfig(uint32_t RDPLevel);
0121 static uint32_t FLASH_OB_GetRDP(void);
0122 static void FLASH_OB_PCROPConfig(uint32_t PCROConfigRDP, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr, uint32_t Banks);
0123 static void FLASH_OB_GetPCROP(uint32_t *PCROPConfig, uint32_t *PCROPStartAddr,uint32_t *PCROPEndAddr, uint32_t Bank);
0124 static void FLASH_OB_BOR_LevelConfig(uint32_t Level);
0125 static uint32_t FLASH_OB_GetBOR(void);
0126 static void FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig);
0127 static uint32_t FLASH_OB_GetUser(void);
0128 static void FLASH_OB_BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1);
0129 static void FLASH_OB_GetBootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1);
0130 static void FLASH_OB_SecureAreaConfig(uint32_t SecureAreaConfig, uint32_t SecureAreaStartAddr, uint32_t SecureAreaEndAddr, uint32_t Banks);
0131 static void FLASH_OB_GetSecureArea(uint32_t *SecureAreaConfig, uint32_t *SecureAreaStartAddr, uint32_t *SecureAreaEndAddr, uint32_t Bank);
0132 static void FLASH_CRC_AddSector(uint32_t Sector, uint32_t Bank);
0133 static void FLASH_CRC_SelectAddress(uint32_t CRCStartAddr, uint32_t CRCEndAddr, uint32_t Bank);
0134
0135 #if defined (DUAL_CORE)
0136 static void FLASH_OB_CM4BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1);
0137 static void FLASH_OB_GetCM4BootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1);
0138 #endif
0139
0140 #if defined (FLASH_OTPBL_LOCKBL)
0141 static void FLASH_OB_OTP_LockConfig(uint32_t OTP_Block);
0142 static uint32_t FLASH_OB_OTP_GetLock(void);
0143 #endif
0144
0145 #if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
0146 static void FLASH_OB_SharedRAM_Config(uint32_t SharedRamConfig);
0147 static uint32_t FLASH_OB_SharedRAM_GetConfig(void);
0148 #endif
0149
0150 #if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
0151 static void FLASH_OB_CPUFreq_BoostConfig(uint32_t FreqBoost);
0152 static uint32_t FLASH_OB_CPUFreq_GetBoost(void);
0153 #endif
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
0191 {
0192 HAL_StatusTypeDef status = HAL_OK;
0193 uint32_t sector_index;
0194
0195
0196 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
0197 assert_param(IS_FLASH_BANK(pEraseInit->Banks));
0198
0199
0200 __HAL_LOCK(&pFlash);
0201
0202
0203 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
0204
0205
0206 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
0207 {
0208 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1) != HAL_OK)
0209 {
0210 status = HAL_ERROR;
0211 }
0212 }
0213
0214 #if defined (DUAL_BANK)
0215
0216 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
0217 {
0218 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2) != HAL_OK)
0219 {
0220 status = HAL_ERROR;
0221 }
0222 }
0223 #endif
0224
0225 if(status == HAL_OK)
0226 {
0227 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
0228 {
0229
0230 FLASH_MassErase(pEraseInit->VoltageRange, pEraseInit->Banks);
0231
0232
0233 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
0234 {
0235 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1) != HAL_OK)
0236 {
0237 status = HAL_ERROR;
0238 }
0239
0240 FLASH->CR1 &= (~FLASH_CR_BER);
0241 }
0242 #if defined (DUAL_BANK)
0243
0244 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
0245 {
0246 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2) != HAL_OK)
0247 {
0248 status = HAL_ERROR;
0249 }
0250
0251 FLASH->CR2 &= (~FLASH_CR_BER);
0252 }
0253 #endif
0254 }
0255 else
0256 {
0257
0258 *SectorError = 0xFFFFFFFFU;
0259
0260
0261 for(sector_index = pEraseInit->Sector; sector_index < (pEraseInit->NbSectors + pEraseInit->Sector); sector_index++)
0262 {
0263 FLASH_Erase_Sector(sector_index, pEraseInit->Banks, pEraseInit->VoltageRange);
0264
0265 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
0266 {
0267
0268 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1);
0269
0270
0271 FLASH->CR1 &= (~(FLASH_CR_SER | FLASH_CR_SNB));
0272 }
0273 #if defined (DUAL_BANK)
0274 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
0275 {
0276
0277 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2);
0278
0279
0280 FLASH->CR2 &= (~(FLASH_CR_SER | FLASH_CR_SNB));
0281 }
0282 #endif
0283
0284 if(status != HAL_OK)
0285 {
0286
0287 *SectorError = sector_index;
0288 break;
0289 }
0290 }
0291 }
0292 }
0293
0294
0295 __HAL_UNLOCK(&pFlash);
0296
0297 return status;
0298 }
0299
0300
0301
0302
0303
0304
0305
0306
0307 HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
0308 {
0309 HAL_StatusTypeDef status = HAL_OK;
0310
0311
0312 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
0313 assert_param(IS_FLASH_BANK(pEraseInit->Banks));
0314
0315
0316 __HAL_LOCK(&pFlash);
0317
0318
0319 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
0320
0321
0322 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
0323 {
0324 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1) != HAL_OK)
0325 {
0326 status = HAL_ERROR;
0327 }
0328 }
0329
0330 #if defined (DUAL_BANK)
0331
0332 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
0333 {
0334 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2) != HAL_OK)
0335 {
0336 status = HAL_ERROR;
0337 }
0338 }
0339 #endif
0340
0341 if (status != HAL_OK)
0342 {
0343
0344 __HAL_UNLOCK(&pFlash);
0345 }
0346 else
0347 {
0348 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
0349 {
0350
0351 #if defined (FLASH_CR_OPERRIE)
0352 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0353 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
0354 #else
0355 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
0356 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
0357 #endif
0358 }
0359 #if defined (DUAL_BANK)
0360 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
0361 {
0362
0363 #if defined (FLASH_CR_OPERRIE)
0364 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0365 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2 | FLASH_IT_OPERR_BANK2);
0366 #else
0367 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
0368 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2);
0369 #endif
0370 }
0371 #endif
0372
0373 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
0374 {
0375
0376 if(pEraseInit->Banks == FLASH_BANK_1)
0377 {
0378 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE_BANK1;
0379 }
0380 #if defined (DUAL_BANK)
0381 else if(pEraseInit->Banks == FLASH_BANK_2)
0382 {
0383 pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE_BANK2;
0384 }
0385 #endif
0386 else
0387 {
0388 pFlash.ProcedureOnGoing = FLASH_PROC_ALLBANK_MASSERASE;
0389 }
0390
0391 FLASH_MassErase(pEraseInit->VoltageRange, pEraseInit->Banks);
0392 }
0393 else
0394 {
0395
0396 #if defined (DUAL_BANK)
0397 if(pEraseInit->Banks == FLASH_BANK_1)
0398 {
0399 pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE_BANK1;
0400 }
0401 else
0402 {
0403 pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE_BANK2;
0404 }
0405 #else
0406 pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE_BANK1;
0407 #endif
0408
0409 pFlash.NbSectorsToErase = pEraseInit->NbSectors;
0410 pFlash.Sector = pEraseInit->Sector;
0411 pFlash.VoltageForErase = pEraseInit->VoltageRange;
0412
0413
0414 FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->Banks, pEraseInit->VoltageRange);
0415 }
0416 }
0417
0418 return status;
0419 }
0420
0421
0422
0423
0424
0425
0426
0427
0428 HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
0429 {
0430 HAL_StatusTypeDef status;
0431
0432
0433 assert_param(IS_OPTIONBYTE(pOBInit->OptionType));
0434
0435
0436 __HAL_LOCK(&pFlash);
0437
0438
0439 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
0440
0441
0442 if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1) != HAL_OK)
0443 {
0444 status = HAL_ERROR;
0445 }
0446 #if defined (DUAL_BANK)
0447 else if(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2) != HAL_OK)
0448 {
0449 status = HAL_ERROR;
0450 }
0451 #endif
0452 else
0453 {
0454 status = HAL_OK;
0455 }
0456
0457 if(status == HAL_OK)
0458 {
0459
0460 if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
0461 {
0462 assert_param(IS_WRPSTATE(pOBInit->WRPState));
0463
0464 if(pOBInit->WRPState == OB_WRPSTATE_ENABLE)
0465 {
0466
0467 FLASH_OB_EnableWRP(pOBInit->WRPSector,pOBInit->Banks);
0468 }
0469 else
0470 {
0471
0472 FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks);
0473 }
0474 }
0475
0476
0477 if((pOBInit->OptionType & OPTIONBYTE_RDP) != 0U)
0478 {
0479
0480 FLASH_OB_RDPConfig(pOBInit->RDPLevel);
0481 }
0482
0483
0484 if((pOBInit->OptionType & OPTIONBYTE_USER) != 0U)
0485 {
0486
0487 FLASH_OB_UserConfig(pOBInit->USERType, pOBInit->USERConfig);
0488 }
0489
0490
0491 if((pOBInit->OptionType & OPTIONBYTE_PCROP) != 0U)
0492 {
0493 assert_param(IS_FLASH_BANK(pOBInit->Banks));
0494
0495
0496 FLASH_OB_PCROPConfig(pOBInit->PCROPConfig, pOBInit->PCROPStartAddr, pOBInit->PCROPEndAddr, pOBInit->Banks);
0497 }
0498
0499
0500 if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
0501 {
0502 FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel);
0503 }
0504
0505 #if defined(DUAL_CORE)
0506
0507 if((pOBInit->OptionType & OPTIONBYTE_CM7_BOOTADD) == OPTIONBYTE_CM7_BOOTADD)
0508 {
0509 FLASH_OB_BootAddConfig(pOBInit->BootConfig, pOBInit->BootAddr0, pOBInit->BootAddr1);
0510 }
0511
0512
0513 if((pOBInit->OptionType & OPTIONBYTE_CM4_BOOTADD) == OPTIONBYTE_CM4_BOOTADD)
0514 {
0515 FLASH_OB_CM4BootAddConfig(pOBInit->CM4BootConfig, pOBInit->CM4BootAddr0, pOBInit->CM4BootAddr1);
0516 }
0517 #else
0518
0519 if((pOBInit->OptionType & OPTIONBYTE_BOOTADD) == OPTIONBYTE_BOOTADD)
0520 {
0521 FLASH_OB_BootAddConfig(pOBInit->BootConfig, pOBInit->BootAddr0, pOBInit->BootAddr1);
0522 }
0523 #endif
0524
0525
0526 if((pOBInit->OptionType & OPTIONBYTE_SECURE_AREA) == OPTIONBYTE_SECURE_AREA)
0527 {
0528 FLASH_OB_SecureAreaConfig(pOBInit->SecureAreaConfig, pOBInit->SecureAreaStartAddr, pOBInit->SecureAreaEndAddr,pOBInit->Banks);
0529 }
0530
0531 #if defined(FLASH_OTPBL_LOCKBL)
0532
0533 if((pOBInit->OptionType & OPTIONBYTE_OTP_LOCK) == OPTIONBYTE_OTP_LOCK)
0534 {
0535 FLASH_OB_OTP_LockConfig(pOBInit->OTPBlockLock);
0536 }
0537 #endif
0538
0539 #if defined(FLASH_OPTSR2_TCM_AXI_SHARED)
0540
0541 if((pOBInit->OptionType & OPTIONBYTE_SHARED_RAM) == OPTIONBYTE_SHARED_RAM)
0542 {
0543 FLASH_OB_SharedRAM_Config(pOBInit->SharedRamConfig);
0544 }
0545 #endif
0546
0547 #if defined(FLASH_OPTSR2_CPUFREQ_BOOST)
0548
0549 if((pOBInit->OptionType & OPTIONBYTE_FREQ_BOOST) == OPTIONBYTE_FREQ_BOOST)
0550 {
0551 FLASH_OB_CPUFreq_BoostConfig(pOBInit->FreqBoostState);
0552 }
0553 #endif
0554 }
0555
0556
0557 __HAL_UNLOCK(&pFlash);
0558
0559 return status;
0560 }
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571 void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
0572 {
0573 pOBInit->OptionType = (OPTIONBYTE_USER | OPTIONBYTE_RDP | OPTIONBYTE_BOR);
0574
0575
0576 pOBInit->RDPLevel = FLASH_OB_GetRDP();
0577
0578
0579 pOBInit->USERConfig = FLASH_OB_GetUser();
0580
0581
0582 pOBInit->BORLevel = FLASH_OB_GetBOR();
0583
0584 #if defined (DUAL_BANK)
0585 if ((pOBInit->Banks == FLASH_BANK_1) || (pOBInit->Banks == FLASH_BANK_2))
0586 #else
0587 if (pOBInit->Banks == FLASH_BANK_1)
0588 #endif
0589 {
0590 pOBInit->OptionType |= (OPTIONBYTE_WRP | OPTIONBYTE_PCROP | OPTIONBYTE_SECURE_AREA);
0591
0592
0593 FLASH_OB_GetWRP(&(pOBInit->WRPState), &(pOBInit->WRPSector), pOBInit->Banks);
0594
0595
0596 FLASH_OB_GetPCROP(&(pOBInit->PCROPConfig), &(pOBInit->PCROPStartAddr), &(pOBInit->PCROPEndAddr), pOBInit->Banks);
0597
0598
0599 FLASH_OB_GetSecureArea(&(pOBInit->SecureAreaConfig), &(pOBInit->SecureAreaStartAddr), &(pOBInit->SecureAreaEndAddr), pOBInit->Banks);
0600 }
0601
0602
0603 FLASH_OB_GetBootAdd(&(pOBInit->BootAddr0), &(pOBInit->BootAddr1));
0604 #if defined(DUAL_CORE)
0605 pOBInit->OptionType |= OPTIONBYTE_CM7_BOOTADD | OPTIONBYTE_CM4_BOOTADD;
0606
0607
0608 FLASH_OB_GetCM4BootAdd(&(pOBInit->CM4BootAddr0), &(pOBInit->CM4BootAddr1));
0609 #else
0610 pOBInit->OptionType |= OPTIONBYTE_BOOTADD;
0611 #endif
0612
0613 #if defined (FLASH_OTPBL_LOCKBL)
0614 pOBInit->OptionType |= OPTIONBYTE_OTP_LOCK;
0615
0616
0617 pOBInit->OTPBlockLock = FLASH_OB_OTP_GetLock();
0618 #endif
0619
0620 #if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
0621 pOBInit->OptionType |= OPTIONBYTE_SHARED_RAM;
0622
0623
0624 pOBInit->SharedRamConfig = FLASH_OB_SharedRAM_GetConfig();
0625 #endif
0626
0627 #if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
0628 pOBInit->OptionType |= OPTIONBYTE_FREQ_BOOST;
0629
0630
0631 pOBInit->FreqBoostState = FLASH_OB_CPUFreq_GetBoost();
0632 #endif
0633 }
0634
0635
0636
0637
0638
0639 HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank1(void)
0640 {
0641 if(READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
0642 {
0643
0644 WRITE_REG(FLASH->KEYR1, FLASH_KEY1);
0645 WRITE_REG(FLASH->KEYR1, FLASH_KEY2);
0646
0647
0648 if (READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
0649 {
0650 return HAL_ERROR;
0651 }
0652 }
0653
0654 return HAL_OK;
0655 }
0656
0657
0658
0659
0660
0661 HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank1(void)
0662 {
0663
0664 SET_BIT(FLASH->CR1, FLASH_CR_LOCK);
0665 return HAL_OK;
0666 }
0667
0668 #if defined (DUAL_BANK)
0669
0670
0671
0672
0673 HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank2(void)
0674 {
0675 if(READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
0676 {
0677
0678 WRITE_REG(FLASH->KEYR2, FLASH_KEY1);
0679 WRITE_REG(FLASH->KEYR2, FLASH_KEY2);
0680
0681
0682 if (READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
0683 {
0684 return HAL_ERROR;
0685 }
0686 }
0687
0688 return HAL_OK;
0689 }
0690
0691
0692
0693
0694
0695 HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank2(void)
0696 {
0697
0698 SET_BIT(FLASH->CR2, FLASH_CR_LOCK);
0699 return HAL_OK;
0700 }
0701 #endif
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714 HAL_StatusTypeDef HAL_FLASHEx_ComputeCRC(FLASH_CRCInitTypeDef *pCRCInit, uint32_t *CRC_Result)
0715 {
0716 HAL_StatusTypeDef status;
0717 uint32_t sector_index;
0718
0719
0720 assert_param(IS_FLASH_BANK_EXCLUSIVE(pCRCInit->Bank));
0721 assert_param(IS_FLASH_TYPECRC(pCRCInit->TypeCRC));
0722
0723
0724 status = FLASH_OB_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
0725
0726 if (status == HAL_OK)
0727 {
0728 if (pCRCInit->Bank == FLASH_BANK_1)
0729 {
0730
0731 FLASH->CR1 |= FLASH_CR_CRC_EN;
0732
0733
0734 FLASH->CCR1 |= (FLASH_CCR_CLR_CRCEND | FLASH_CCR_CLR_CRCRDERR);
0735
0736
0737 FLASH->CRCCR1 |= FLASH_CRCCR_CLEAN_CRC | pCRCInit->BurstSize | pCRCInit->TypeCRC;
0738
0739 if (pCRCInit->TypeCRC == FLASH_CRC_SECTORS)
0740 {
0741
0742 FLASH->CRCCR1 |= FLASH_CRCCR_CLEAN_SECT;
0743
0744
0745 for(sector_index = pCRCInit->Sector; sector_index < (pCRCInit->NbSectors + pCRCInit->Sector); sector_index++)
0746 {
0747 FLASH_CRC_AddSector(sector_index, FLASH_BANK_1);
0748 }
0749 }
0750 else if (pCRCInit->TypeCRC == FLASH_CRC_BANK)
0751 {
0752
0753 FLASH->CRCCR1 |= FLASH_CRCCR_ALL_BANK;
0754 }
0755 else
0756 {
0757
0758 FLASH_CRC_SelectAddress(pCRCInit->CRCStartAddr, pCRCInit->CRCEndAddr, FLASH_BANK_1);
0759 }
0760
0761
0762 FLASH->CRCCR1 |= FLASH_CRCCR_START_CRC;
0763
0764
0765 status = FLASH_CRC_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_1);
0766
0767
0768 (*CRC_Result) = FLASH->CRCDATA;
0769
0770
0771 FLASH->CR1 &= (~FLASH_CR_CRC_EN);
0772
0773
0774 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_CRCEND_BANK1 | FLASH_FLAG_CRCRDERR_BANK1);
0775 }
0776 #if defined (DUAL_BANK)
0777 else
0778 {
0779
0780 FLASH->CR2 |= FLASH_CR_CRC_EN;
0781
0782
0783 FLASH->CCR2 |= (FLASH_CCR_CLR_CRCEND | FLASH_CCR_CLR_CRCRDERR);
0784
0785
0786 FLASH->CRCCR2 |= FLASH_CRCCR_CLEAN_CRC | pCRCInit->BurstSize | pCRCInit->TypeCRC;
0787
0788 if (pCRCInit->TypeCRC == FLASH_CRC_SECTORS)
0789 {
0790
0791 FLASH->CRCCR2 |= FLASH_CRCCR_CLEAN_SECT;
0792
0793
0794 for(sector_index = pCRCInit->Sector; sector_index < (pCRCInit->NbSectors + pCRCInit->Sector); sector_index++)
0795 {
0796 FLASH_CRC_AddSector(sector_index, FLASH_BANK_2);
0797 }
0798 }
0799 else if (pCRCInit->TypeCRC == FLASH_CRC_BANK)
0800 {
0801
0802 FLASH->CRCCR2 |= FLASH_CRCCR_ALL_BANK;
0803 }
0804 else
0805 {
0806
0807 FLASH_CRC_SelectAddress(pCRCInit->CRCStartAddr, pCRCInit->CRCEndAddr, FLASH_BANK_2);
0808 }
0809
0810
0811 FLASH->CRCCR2 |= FLASH_CRCCR_START_CRC;
0812
0813
0814 status = FLASH_CRC_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE, FLASH_BANK_2);
0815
0816
0817 (*CRC_Result) = FLASH->CRCDATA;
0818
0819
0820 FLASH->CR2 &= (~FLASH_CR_CRC_EN);
0821
0822
0823 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_CRCEND_BANK2 | FLASH_FLAG_CRCRDERR_BANK2);
0824 }
0825 #endif
0826 }
0827
0828 return status;
0829 }
0830
0831
0832
0833
0834
0835 #if (USE_FLASH_ECC == 1U)
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856 void HAL_FLASHEx_EnableEccCorrectionInterrupt(void)
0857 {
0858 __HAL_FLASH_ENABLE_IT(FLASH_IT_SNECCERR_BANK1);
0859
0860 #if defined (DUAL_BANK)
0861 __HAL_FLASH_ENABLE_IT(FLASH_IT_SNECCERR_BANK2);
0862 #endif
0863 }
0864
0865
0866
0867
0868
0869
0870 void HAL_FLASHEx_DisableEccCorrectionInterrupt(void)
0871 {
0872 __HAL_FLASH_DISABLE_IT(FLASH_IT_SNECCERR_BANK1);
0873
0874 #if defined (DUAL_BANK)
0875 __HAL_FLASH_DISABLE_IT(FLASH_IT_SNECCERR_BANK2);
0876 #endif
0877 }
0878
0879
0880
0881
0882
0883
0884 void HAL_FLASHEx_EnableEccCorrectionInterrupt_Bank1(void)
0885 {
0886 __HAL_FLASH_ENABLE_IT(FLASH_IT_SNECCERR_BANK1);
0887 }
0888
0889
0890
0891
0892
0893
0894 void HAL_FLASHEx_DisableEccCorrectionInterrupt_Bank1(void)
0895 {
0896 __HAL_FLASH_DISABLE_IT(FLASH_IT_SNECCERR_BANK1);
0897 }
0898
0899 #if defined (DUAL_BANK)
0900
0901
0902
0903
0904
0905 void HAL_FLASHEx_EnableEccCorrectionInterrupt_Bank2(void)
0906 {
0907 __HAL_FLASH_ENABLE_IT(FLASH_IT_SNECCERR_BANK2);
0908 }
0909
0910
0911
0912
0913
0914
0915 void HAL_FLASHEx_DisableEccCorrectionInterrupt_Bank2(void)
0916 {
0917 __HAL_FLASH_DISABLE_IT(FLASH_IT_SNECCERR_BANK2);
0918 }
0919 #endif
0920
0921
0922
0923
0924
0925
0926 void HAL_FLASHEx_EnableEccDetectionInterrupt(void)
0927 {
0928 __HAL_FLASH_ENABLE_IT(FLASH_IT_DBECCERR_BANK1);
0929
0930 #if defined (DUAL_BANK)
0931 __HAL_FLASH_ENABLE_IT(FLASH_IT_DBECCERR_BANK2);
0932 #endif
0933 }
0934
0935
0936
0937
0938
0939
0940 void HAL_FLASHEx_DisableEccDetectionInterrupt(void)
0941 {
0942 __HAL_FLASH_DISABLE_IT(FLASH_IT_DBECCERR_BANK1);
0943
0944 #if defined (DUAL_BANK)
0945 __HAL_FLASH_DISABLE_IT(FLASH_IT_DBECCERR_BANK2);
0946 #endif
0947 }
0948
0949
0950
0951
0952
0953
0954 void HAL_FLASHEx_EnableEccDetectionInterrupt_Bank1(void)
0955 {
0956 __HAL_FLASH_ENABLE_IT(FLASH_IT_DBECCERR_BANK1);
0957 }
0958
0959
0960
0961
0962
0963
0964 void HAL_FLASHEx_DisableEccDetectionInterrupt_Bank1(void)
0965 {
0966 __HAL_FLASH_DISABLE_IT(FLASH_IT_DBECCERR_BANK1);
0967 }
0968
0969 #if defined (DUAL_BANK)
0970
0971
0972
0973
0974
0975 void HAL_FLASHEx_EnableEccDetectionInterrupt_Bank2(void)
0976 {
0977 __HAL_FLASH_ENABLE_IT(FLASH_IT_DBECCERR_BANK2);
0978 }
0979
0980
0981
0982
0983
0984
0985 void HAL_FLASHEx_DisableEccDetectionInterrupt_Bank2(void)
0986 {
0987 __HAL_FLASH_DISABLE_IT(FLASH_IT_DBECCERR_BANK2);
0988 }
0989 #endif
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999 void HAL_FLASHEx_GetEccInfo(FLASH_EccInfoTypeDef *pData)
1000 {
1001 uint32_t errorflag;
1002
1003
1004 errorflag = FLASH->SR1 & (FLASH_FLAG_SNECCERR_BANK1 | FLASH_FLAG_DBECCERR_BANK1);
1005 if(errorflag != 0U)
1006 {
1007 pData->Area = FLASH_ECC_AREA_USER_BANK1;
1008 pData->Address = ((((FLASH->ECC_FA1 & FLASH_ECC_FA_FAIL_ECC_ADDR))* FLASH_NB_32BITWORD_IN_FLASHWORD * 4) + FLASH_BANK1_BASE);
1009 }
1010 #if defined (DUAL_BANK)
1011
1012 errorflag = FLASH->SR2 & (FLASH_FLAG_SNECCERR_BANK2 | FLASH_FLAG_DBECCERR_BANK2);
1013 if(errorflag != 0U)
1014 {
1015 pData->Area = FLASH_ECC_AREA_USER_BANK2;
1016 pData->Address = ((((FLASH->ECC_FA2 & FLASH_ECC_FA_FAIL_ECC_ADDR))* FLASH_NB_32BITWORD_IN_FLASHWORD * 4) + FLASH_BANK2_BASE);
1017 }
1018 #endif
1019 }
1020
1021
1022
1023
1024
1025 void HAL_FLASHEx_BusFault_IRQHandler(void)
1026 {
1027
1028 if ((FLASH->SR1 & FLASH_FLAG_DBECCERR_BANK1) != 0)
1029 {
1030
1031 HAL_FLASHEx_EccDetectionCallback();
1032
1033
1034
1035
1036 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_DBECCERR_BANK1);
1037 }
1038 #if defined (DUAL_BANK)
1039
1040 if ((FLASH->SR2 & FLASH_FLAG_DBECCERR_BANK2) != 0)
1041 {
1042
1043 HAL_FLASHEx_EccDetectionCallback();
1044
1045
1046
1047
1048 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_DBECCERR_BANK2);
1049 }
1050 #endif
1051 }
1052
1053
1054
1055
1056
1057 __weak void HAL_FLASHEx_EccCorrectionCallback(void)
1058 {
1059
1060
1061
1062 }
1063
1064
1065
1066
1067
1068 __weak void HAL_FLASHEx_EccDetectionCallback(void)
1069 {
1070
1071
1072
1073 }
1074
1075
1076
1077
1078 #endif
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107 static void FLASH_MassErase(uint32_t VoltageRange, uint32_t Banks)
1108 {
1109
1110 #if defined (FLASH_CR_PSIZE)
1111 assert_param(IS_VOLTAGERANGE(VoltageRange));
1112 #else
1113 UNUSED(VoltageRange);
1114 #endif
1115 assert_param(IS_FLASH_BANK(Banks));
1116
1117 #if defined (DUAL_BANK)
1118
1119 if((Banks & FLASH_BANK_BOTH) == FLASH_BANK_BOTH)
1120 {
1121 #if defined (FLASH_CR_PSIZE)
1122
1123 FLASH->CR1 &= (~FLASH_CR_PSIZE);
1124 FLASH->CR2 &= (~FLASH_CR_PSIZE);
1125
1126
1127 FLASH->CR1 |= VoltageRange;
1128 FLASH->CR2 |= VoltageRange;
1129 #endif
1130
1131
1132 FLASH->OPTCR |= FLASH_OPTCR_MER;
1133 }
1134 else
1135 #endif
1136 {
1137
1138 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1139 {
1140 #if defined (FLASH_CR_PSIZE)
1141
1142 FLASH->CR1 &= (~FLASH_CR_PSIZE);
1143 FLASH->CR1 |= VoltageRange;
1144 #endif
1145
1146
1147 FLASH->CR1 |= (FLASH_CR_BER | FLASH_CR_START);
1148 }
1149
1150 #if defined (DUAL_BANK)
1151 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1152 {
1153 #if defined (FLASH_CR_PSIZE)
1154
1155 FLASH->CR2 &= (~FLASH_CR_PSIZE);
1156 FLASH->CR2 |= VoltageRange;
1157 #endif
1158
1159
1160 FLASH->CR2 |= (FLASH_CR_BER | FLASH_CR_START);
1161 }
1162 #endif
1163 }
1164 }
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184 void FLASH_Erase_Sector(uint32_t Sector, uint32_t Banks, uint32_t VoltageRange)
1185 {
1186 assert_param(IS_FLASH_SECTOR(Sector));
1187 assert_param(IS_FLASH_BANK_EXCLUSIVE(Banks));
1188 #if defined (FLASH_CR_PSIZE)
1189 assert_param(IS_VOLTAGERANGE(VoltageRange));
1190 #else
1191 UNUSED(VoltageRange);
1192 #endif
1193
1194 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1195 {
1196 #if defined (FLASH_CR_PSIZE)
1197
1198 FLASH->CR1 &= ~(FLASH_CR_PSIZE | FLASH_CR_SNB);
1199
1200 FLASH->CR1 |= (FLASH_CR_SER | VoltageRange | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
1201 #else
1202
1203 FLASH->CR1 &= ~(FLASH_CR_SNB);
1204
1205 FLASH->CR1 |= (FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
1206 #endif
1207 }
1208
1209 #if defined (DUAL_BANK)
1210 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1211 {
1212 #if defined (FLASH_CR_PSIZE)
1213
1214 FLASH->CR2 &= ~(FLASH_CR_PSIZE | FLASH_CR_SNB);
1215
1216 FLASH->CR2 |= (FLASH_CR_SER | VoltageRange | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
1217 #else
1218
1219 FLASH->CR2 &= ~(FLASH_CR_SNB);
1220
1221 FLASH->CR2 |= (FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
1222 #endif
1223 }
1224 #endif
1225 }
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 static void FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks)
1242 {
1243
1244 assert_param(IS_OB_WRP_SECTOR(WRPSector));
1245 assert_param(IS_FLASH_BANK(Banks));
1246
1247 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1248 {
1249
1250 FLASH->WPSN_PRG1 &= (~(WRPSector & FLASH_WPSN_WRPSN));
1251 }
1252
1253 #if defined (DUAL_BANK)
1254 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1255 {
1256
1257 FLASH->WPSN_PRG2 &= (~(WRPSector & FLASH_WPSN_WRPSN));
1258 }
1259 #endif
1260 }
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276 static void FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks)
1277 {
1278
1279 assert_param(IS_OB_WRP_SECTOR(WRPSector));
1280 assert_param(IS_FLASH_BANK(Banks));
1281
1282 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1283 {
1284
1285 FLASH->WPSN_PRG1 |= (WRPSector & FLASH_WPSN_WRPSN);
1286 }
1287
1288 #if defined (DUAL_BANK)
1289 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1290 {
1291
1292 FLASH->WPSN_PRG2 |= (WRPSector & FLASH_WPSN_WRPSN);
1293 }
1294 #endif
1295 }
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315 static void FLASH_OB_GetWRP(uint32_t *WRPState, uint32_t *WRPSector, uint32_t Bank)
1316 {
1317 uint32_t regvalue = 0U;
1318
1319 if(Bank == FLASH_BANK_1)
1320 {
1321 regvalue = FLASH->WPSN_CUR1;
1322 }
1323
1324 #if defined (DUAL_BANK)
1325 if(Bank == FLASH_BANK_2)
1326 {
1327 regvalue = FLASH->WPSN_CUR2;
1328 }
1329 #endif
1330
1331 (*WRPSector) = (~regvalue) & FLASH_WPSN_WRPSN;
1332
1333 if(*WRPSector == 0U)
1334 {
1335 (*WRPState) = OB_WRPSTATE_DISABLE;
1336 }
1337 else
1338 {
1339 (*WRPState) = OB_WRPSTATE_ENABLE;
1340 }
1341 }
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361 static void FLASH_OB_RDPConfig(uint32_t RDPLevel)
1362 {
1363
1364 assert_param(IS_OB_RDP_LEVEL(RDPLevel));
1365
1366
1367 MODIFY_REG(FLASH->OPTSR_PRG, FLASH_OPTSR_RDP, RDPLevel);
1368 }
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378 static uint32_t FLASH_OB_GetRDP(void)
1379 {
1380 uint32_t rdp_level = READ_BIT(FLASH->OPTSR_CUR, FLASH_OPTSR_RDP);
1381
1382 if ((rdp_level != OB_RDP_LEVEL_0) && (rdp_level != OB_RDP_LEVEL_2))
1383 {
1384 return (OB_RDP_LEVEL_1);
1385 }
1386 else
1387 {
1388 return rdp_level;
1389 }
1390 }
1391
1392 #if defined(DUAL_CORE)
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413 #else
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433 #endif
1434 static void FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig)
1435 {
1436 uint32_t optr_reg_val = 0;
1437 uint32_t optr_reg_mask = 0;
1438
1439
1440 assert_param(IS_OB_USER_TYPE(UserType));
1441
1442 if((UserType & OB_USER_IWDG1_SW) != 0U)
1443 {
1444
1445 assert_param(IS_OB_IWDG1_SOURCE(UserConfig & FLASH_OPTSR_IWDG1_SW));
1446
1447
1448 optr_reg_val |= (UserConfig & FLASH_OPTSR_IWDG1_SW);
1449 optr_reg_mask |= FLASH_OPTSR_IWDG1_SW;
1450 }
1451 #if defined(DUAL_CORE)
1452 if((UserType & OB_USER_IWDG2_SW) != 0U)
1453 {
1454
1455 assert_param(IS_OB_IWDG2_SOURCE(UserConfig & FLASH_OPTSR_IWDG2_SW));
1456
1457
1458 optr_reg_val |= (UserConfig & FLASH_OPTSR_IWDG2_SW);
1459 optr_reg_mask |= FLASH_OPTSR_IWDG2_SW;
1460 }
1461 #endif
1462 if((UserType & OB_USER_NRST_STOP_D1) != 0U)
1463 {
1464
1465 assert_param(IS_OB_STOP_D1_RESET(UserConfig & FLASH_OPTSR_NRST_STOP_D1));
1466
1467
1468 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STOP_D1);
1469 optr_reg_mask |= FLASH_OPTSR_NRST_STOP_D1;
1470 }
1471
1472 if((UserType & OB_USER_NRST_STDBY_D1) != 0U)
1473 {
1474
1475 assert_param(IS_OB_STDBY_D1_RESET(UserConfig & FLASH_OPTSR_NRST_STBY_D1));
1476
1477
1478 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STBY_D1);
1479 optr_reg_mask |= FLASH_OPTSR_NRST_STBY_D1;
1480 }
1481
1482 if((UserType & OB_USER_IWDG_STOP) != 0U)
1483 {
1484
1485 assert_param(IS_OB_USER_IWDG_STOP(UserConfig & FLASH_OPTSR_FZ_IWDG_STOP));
1486
1487
1488 optr_reg_val |= (UserConfig & FLASH_OPTSR_FZ_IWDG_STOP);
1489 optr_reg_mask |= FLASH_OPTSR_FZ_IWDG_STOP;
1490 }
1491
1492 if((UserType & OB_USER_IWDG_STDBY) != 0U)
1493 {
1494
1495 assert_param(IS_OB_USER_IWDG_STDBY(UserConfig & FLASH_OPTSR_FZ_IWDG_SDBY));
1496
1497
1498 optr_reg_val |= (UserConfig & FLASH_OPTSR_FZ_IWDG_SDBY);
1499 optr_reg_mask |= FLASH_OPTSR_FZ_IWDG_SDBY;
1500 }
1501
1502 if((UserType & OB_USER_ST_RAM_SIZE) != 0U)
1503 {
1504
1505 assert_param(IS_OB_USER_ST_RAM_SIZE(UserConfig & FLASH_OPTSR_ST_RAM_SIZE));
1506
1507
1508 optr_reg_val |= (UserConfig & FLASH_OPTSR_ST_RAM_SIZE);
1509 optr_reg_mask |= FLASH_OPTSR_ST_RAM_SIZE;
1510 }
1511
1512 if((UserType & OB_USER_SECURITY) != 0U)
1513 {
1514
1515 assert_param(IS_OB_USER_SECURITY(UserConfig & FLASH_OPTSR_SECURITY));
1516
1517
1518 optr_reg_val |= (UserConfig & FLASH_OPTSR_SECURITY);
1519 optr_reg_mask |= FLASH_OPTSR_SECURITY;
1520 }
1521
1522 #if defined(DUAL_CORE)
1523 if((UserType & OB_USER_BCM4) != 0U)
1524 {
1525
1526 assert_param(IS_OB_USER_BCM4(UserConfig & FLASH_OPTSR_BCM4));
1527
1528
1529 optr_reg_val |= (UserConfig & FLASH_OPTSR_BCM4);
1530 optr_reg_mask |= FLASH_OPTSR_BCM4;
1531 }
1532
1533 if((UserType & OB_USER_BCM7) != 0U)
1534 {
1535
1536 assert_param(IS_OB_USER_BCM7(UserConfig & FLASH_OPTSR_BCM7));
1537
1538
1539 optr_reg_val |= (UserConfig & FLASH_OPTSR_BCM7);
1540 optr_reg_mask |= FLASH_OPTSR_BCM7;
1541 }
1542 #endif
1543
1544 #if defined (FLASH_OPTSR_NRST_STOP_D2)
1545 if((UserType & OB_USER_NRST_STOP_D2) != 0U)
1546 {
1547
1548 assert_param(IS_OB_STOP_D2_RESET(UserConfig & FLASH_OPTSR_NRST_STOP_D2));
1549
1550
1551 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STOP_D2);
1552 optr_reg_mask |= FLASH_OPTSR_NRST_STOP_D2;
1553 }
1554
1555 if((UserType & OB_USER_NRST_STDBY_D2) != 0U)
1556 {
1557
1558 assert_param(IS_OB_STDBY_D2_RESET(UserConfig & FLASH_OPTSR_NRST_STBY_D2));
1559
1560
1561 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STBY_D2);
1562 optr_reg_mask |= FLASH_OPTSR_NRST_STBY_D2;
1563 }
1564 #endif
1565
1566 #if defined (DUAL_BANK)
1567 if((UserType & OB_USER_SWAP_BANK) != 0U)
1568 {
1569
1570 assert_param(IS_OB_USER_SWAP_BANK(UserConfig & FLASH_OPTSR_SWAP_BANK_OPT));
1571
1572
1573 optr_reg_val |= (UserConfig & FLASH_OPTSR_SWAP_BANK_OPT);
1574 optr_reg_mask |= FLASH_OPTSR_SWAP_BANK_OPT;
1575 }
1576 #endif
1577
1578 if((UserType & OB_USER_IOHSLV) != 0U)
1579 {
1580
1581 assert_param(IS_OB_USER_IOHSLV(UserConfig & FLASH_OPTSR_IO_HSLV));
1582
1583
1584 optr_reg_val |= (UserConfig & FLASH_OPTSR_IO_HSLV);
1585 optr_reg_mask |= FLASH_OPTSR_IO_HSLV;
1586 }
1587
1588 #if defined (FLASH_OPTSR_VDDMMC_HSLV)
1589 if((UserType & OB_USER_VDDMMC_HSLV) != 0U)
1590 {
1591
1592 assert_param(IS_OB_USER_VDDMMC_HSLV(UserConfig & FLASH_OPTSR_VDDMMC_HSLV));
1593
1594
1595 optr_reg_val |= (UserConfig & FLASH_OPTSR_VDDMMC_HSLV);
1596 optr_reg_mask |= FLASH_OPTSR_VDDMMC_HSLV;
1597 }
1598 #endif
1599
1600
1601 MODIFY_REG(FLASH->OPTSR_PRG, optr_reg_mask, optr_reg_val);
1602 }
1603
1604 #if defined(DUAL_CORE)
1605
1606
1607
1608
1609
1610
1611
1612
1613 #else
1614
1615
1616
1617
1618
1619
1620
1621 #endif
1622 static uint32_t FLASH_OB_GetUser(void)
1623 {
1624 uint32_t userConfig = READ_REG(FLASH->OPTSR_CUR);
1625 userConfig &= (~(FLASH_OPTSR_BOR_LEV | FLASH_OPTSR_RDP));
1626
1627 return userConfig;
1628 }
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656 static void FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr, uint32_t Banks)
1657 {
1658
1659 assert_param(IS_FLASH_BANK(Banks));
1660 assert_param(IS_OB_PCROP_RDP(PCROPConfig));
1661
1662 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1663 {
1664 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(PCROPStartAddr));
1665 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(PCROPEndAddr));
1666
1667
1668 FLASH->PRAR_PRG1 = ((PCROPStartAddr - FLASH_BANK1_BASE) >> 8) | \
1669 (((PCROPEndAddr - FLASH_BANK1_BASE) >> 8) << FLASH_PRAR_PROT_AREA_END_Pos) | \
1670 PCROPConfig;
1671 }
1672
1673 #if defined (DUAL_BANK)
1674 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1675 {
1676 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(PCROPStartAddr));
1677 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(PCROPEndAddr));
1678
1679
1680 FLASH->PRAR_PRG2 = ((PCROPStartAddr - FLASH_BANK2_BASE) >> 8) | \
1681 (((PCROPEndAddr - FLASH_BANK2_BASE) >> 8) << FLASH_PRAR_PROT_AREA_END_Pos) | \
1682 PCROPConfig;
1683 }
1684 #endif
1685 }
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 static void FLASH_OB_GetPCROP(uint32_t *PCROPConfig, uint32_t *PCROPStartAddr, uint32_t *PCROPEndAddr, uint32_t Bank)
1706 {
1707 uint32_t regvalue = 0;
1708 uint32_t bankBase = 0;
1709
1710 if(Bank == FLASH_BANK_1)
1711 {
1712 regvalue = FLASH->PRAR_CUR1;
1713 bankBase = FLASH_BANK1_BASE;
1714 }
1715
1716 #if defined (DUAL_BANK)
1717 if(Bank == FLASH_BANK_2)
1718 {
1719 regvalue = FLASH->PRAR_CUR2;
1720 bankBase = FLASH_BANK2_BASE;
1721 }
1722 #endif
1723
1724 (*PCROPConfig) = (regvalue & FLASH_PRAR_DMEP);
1725
1726 (*PCROPStartAddr) = ((regvalue & FLASH_PRAR_PROT_AREA_START) << 8) + bankBase;
1727 (*PCROPEndAddr) = (regvalue & FLASH_PRAR_PROT_AREA_END) >> FLASH_PRAR_PROT_AREA_END_Pos;
1728 (*PCROPEndAddr) = ((*PCROPEndAddr) << 8) + bankBase;
1729 }
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741 static void FLASH_OB_BOR_LevelConfig(uint32_t Level)
1742 {
1743 assert_param(IS_OB_BOR_LEVEL(Level));
1744
1745
1746 MODIFY_REG(FLASH->OPTSR_PRG, FLASH_OPTSR_BOR_LEV, Level);
1747 }
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758 static uint32_t FLASH_OB_GetBOR(void)
1759 {
1760 return (FLASH->OPTSR_CUR & FLASH_OPTSR_BOR_LEV);
1761 }
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773 static void FLASH_OB_BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1)
1774 {
1775
1776 assert_param(IS_OB_BOOT_ADD_OPTION(BootOption));
1777
1778 if((BootOption & OB_BOOT_ADD0) == OB_BOOT_ADD0)
1779 {
1780
1781 assert_param(IS_BOOT_ADDRESS(BootAddress0));
1782
1783
1784 #if defined(DUAL_CORE)
1785 MODIFY_REG(FLASH->BOOT7_PRG, FLASH_BOOT7_BCM7_ADD0, (BootAddress0 >> 16));
1786 #else
1787 MODIFY_REG(FLASH->BOOT_PRG, FLASH_BOOT_ADD0, (BootAddress0 >> 16));
1788 #endif
1789 }
1790
1791 if((BootOption & OB_BOOT_ADD1) == OB_BOOT_ADD1)
1792 {
1793
1794 assert_param(IS_BOOT_ADDRESS(BootAddress1));
1795
1796
1797 #if defined(DUAL_CORE)
1798 MODIFY_REG(FLASH->BOOT7_PRG, FLASH_BOOT7_BCM7_ADD1, BootAddress1);
1799 #else
1800 MODIFY_REG(FLASH->BOOT_PRG, FLASH_BOOT_ADD1, BootAddress1);
1801 #endif
1802 }
1803 }
1804
1805
1806
1807
1808
1809
1810
1811 static void FLASH_OB_GetBootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1)
1812 {
1813 uint32_t regvalue;
1814
1815 #if defined(DUAL_CORE)
1816 regvalue = FLASH->BOOT7_CUR;
1817
1818 (*BootAddress0) = (regvalue & FLASH_BOOT7_BCM7_ADD0) << 16;
1819 (*BootAddress1) = (regvalue & FLASH_BOOT7_BCM7_ADD1);
1820 #else
1821 regvalue = FLASH->BOOT_CUR;
1822
1823 (*BootAddress0) = (regvalue & FLASH_BOOT_ADD0) << 16;
1824 (*BootAddress1) = (regvalue & FLASH_BOOT_ADD1);
1825 #endif
1826 }
1827
1828 #if defined(DUAL_CORE)
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839 static void FLASH_OB_CM4BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1)
1840 {
1841
1842 assert_param(IS_OB_BOOT_ADD_OPTION(BootOption));
1843
1844 if((BootOption & OB_BOOT_ADD0) == OB_BOOT_ADD0)
1845 {
1846
1847 assert_param(IS_BOOT_ADDRESS(BootAddress0));
1848
1849
1850 MODIFY_REG(FLASH->BOOT4_PRG, FLASH_BOOT4_BCM4_ADD0, (BootAddress0 >> 16));
1851
1852 }
1853
1854 if((BootOption & OB_BOOT_ADD1) == OB_BOOT_ADD1)
1855 {
1856
1857 assert_param(IS_BOOT_ADDRESS(BootAddress1));
1858
1859
1860 MODIFY_REG(FLASH->BOOT4_PRG, FLASH_BOOT4_BCM4_ADD1, BootAddress1);
1861 }
1862 }
1863
1864
1865
1866
1867
1868
1869
1870 static void FLASH_OB_GetCM4BootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1)
1871 {
1872 uint32_t regvalue;
1873
1874 regvalue = FLASH->BOOT4_CUR;
1875
1876 (*BootAddress0) = (regvalue & FLASH_BOOT4_BCM4_ADD0) << 16;
1877 (*BootAddress1) = (regvalue & FLASH_BOOT4_BCM4_ADD1);
1878 }
1879 #endif
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895 static void FLASH_OB_SecureAreaConfig(uint32_t SecureAreaConfig, uint32_t SecureAreaStartAddr, uint32_t SecureAreaEndAddr, uint32_t Banks)
1896 {
1897
1898 assert_param(IS_FLASH_BANK(Banks));
1899 assert_param(IS_OB_SECURE_RDP(SecureAreaConfig));
1900
1901 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1902 {
1903
1904 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(SecureAreaStartAddr));
1905 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(SecureAreaEndAddr));
1906
1907
1908 FLASH->SCAR_PRG1 = ((SecureAreaStartAddr - FLASH_BANK1_BASE) >> 8) | \
1909 (((SecureAreaEndAddr - FLASH_BANK1_BASE) >> 8) << FLASH_SCAR_SEC_AREA_END_Pos) | \
1910 (SecureAreaConfig & FLASH_SCAR_DMES);
1911 }
1912
1913 #if defined (DUAL_BANK)
1914 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1915 {
1916
1917 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(SecureAreaStartAddr));
1918 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(SecureAreaEndAddr));
1919
1920
1921 FLASH->SCAR_PRG2 = ((SecureAreaStartAddr - FLASH_BANK2_BASE) >> 8) | \
1922 (((SecureAreaEndAddr - FLASH_BANK2_BASE) >> 8) << FLASH_SCAR_SEC_AREA_END_Pos) | \
1923 (SecureAreaConfig & FLASH_SCAR_DMES);
1924 }
1925 #endif
1926 }
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937 static void FLASH_OB_GetSecureArea(uint32_t *SecureAreaConfig, uint32_t *SecureAreaStartAddr, uint32_t *SecureAreaEndAddr, uint32_t Bank)
1938 {
1939 uint32_t regvalue = 0;
1940 uint32_t bankBase = 0;
1941
1942
1943 if(Bank == FLASH_BANK_1)
1944 {
1945 regvalue = FLASH->SCAR_CUR1;
1946 bankBase = FLASH_BANK1_BASE;
1947 }
1948
1949 #if defined (DUAL_BANK)
1950 if(Bank == FLASH_BANK_2)
1951 {
1952 regvalue = FLASH->SCAR_CUR2;
1953 bankBase = FLASH_BANK2_BASE;
1954 }
1955 #endif
1956
1957
1958 (*SecureAreaConfig) = (regvalue & FLASH_SCAR_DMES);
1959 (*SecureAreaStartAddr) = ((regvalue & FLASH_SCAR_SEC_AREA_START) << 8) + bankBase;
1960 (*SecureAreaEndAddr) = (regvalue & FLASH_SCAR_SEC_AREA_END) >> FLASH_SCAR_SEC_AREA_END_Pos;
1961 (*SecureAreaEndAddr) = ((*SecureAreaEndAddr) << 8) + bankBase;
1962 }
1963
1964
1965
1966
1967
1968
1969
1970 static void FLASH_CRC_AddSector(uint32_t Sector, uint32_t Bank)
1971 {
1972
1973 assert_param(IS_FLASH_SECTOR(Sector));
1974
1975 if (Bank == FLASH_BANK_1)
1976 {
1977
1978 FLASH->CRCCR1 &= (~FLASH_CRCCR_CRC_SECT);
1979
1980
1981 FLASH->CRCCR1 |= Sector | FLASH_CRCCR_ADD_SECT;
1982 }
1983 #if defined (DUAL_BANK)
1984 else
1985 {
1986
1987 FLASH->CRCCR2 &= (~FLASH_CRCCR_CRC_SECT);
1988
1989
1990 FLASH->CRCCR2 |= Sector | FLASH_CRCCR_ADD_SECT;
1991 }
1992 #endif
1993 }
1994
1995
1996
1997
1998
1999
2000
2001
2002 static void FLASH_CRC_SelectAddress(uint32_t CRCStartAddr, uint32_t CRCEndAddr, uint32_t Bank)
2003 {
2004 if (Bank == FLASH_BANK_1)
2005 {
2006 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(CRCStartAddr));
2007 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(CRCEndAddr));
2008
2009
2010 FLASH->CRCSADD1 = CRCStartAddr;
2011 FLASH->CRCEADD1 = CRCEndAddr;
2012 }
2013 #if defined (DUAL_BANK)
2014 else
2015 {
2016 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(CRCStartAddr));
2017 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(CRCEndAddr));
2018
2019
2020 FLASH->CRCSADD2 = CRCStartAddr;
2021 FLASH->CRCEADD2 = CRCEndAddr;
2022 }
2023 #endif
2024 }
2025
2026
2027
2028
2029 #if defined (FLASH_OTPBL_LOCKBL)
2030
2031
2032
2033
2034
2035
2036 static void FLASH_OB_OTP_LockConfig(uint32_t OTP_Block)
2037 {
2038
2039 assert_param(IS_OTP_BLOCK(OTP_Block));
2040
2041
2042 FLASH->OTPBL_PRG |= (OTP_Block & FLASH_OTPBL_LOCKBL);
2043 }
2044
2045
2046
2047
2048
2049
2050 static uint32_t FLASH_OB_OTP_GetLock(void)
2051 {
2052 return (FLASH->OTPBL_CUR);
2053 }
2054 #endif
2055
2056 #if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
2057
2058
2059
2060
2061
2062
2063 static void FLASH_OB_SharedRAM_Config(uint32_t SharedRamConfig)
2064 {
2065
2066 assert_param(IS_OB_USER_TCM_AXI_SHARED(SharedRamConfig));
2067
2068
2069 MODIFY_REG(FLASH->OPTSR2_PRG, FLASH_OPTSR2_TCM_AXI_SHARED, SharedRamConfig);
2070 }
2071
2072
2073
2074
2075
2076
2077 static uint32_t FLASH_OB_SharedRAM_GetConfig(void)
2078 {
2079 return (FLASH->OPTSR2_CUR & FLASH_OPTSR2_TCM_AXI_SHARED);
2080 }
2081 #endif
2082
2083 #if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
2084
2085
2086
2087
2088
2089
2090 static void FLASH_OB_CPUFreq_BoostConfig(uint32_t FreqBoost)
2091 {
2092
2093 assert_param(IS_OB_USER_CPUFREQ_BOOST(FreqBoost));
2094
2095
2096 MODIFY_REG(FLASH->OPTSR2_PRG, FLASH_OPTSR2_CPUFREQ_BOOST, FreqBoost);
2097 }
2098
2099
2100
2101
2102
2103
2104 static uint32_t FLASH_OB_CPUFreq_GetBoost(void)
2105 {
2106 return (FLASH->OPTSR2_CUR & FLASH_OPTSR2_CPUFREQ_BOOST);
2107 }
2108 #endif
2109
2110 #endif
2111
2112
2113
2114
2115
2116
2117
2118
2119