81#define assert_param(expr) ((void)0)
92#define HAL_FLASH_MODULE_ENABLED
94#ifdef HAL_FLASH_MODULE_ENABLED
101#define FLASH_TIMEOUT_VALUE 50000U
115static void FLASH_OB_GetWRP(uint32_t *WRPState, uint32_t *WRPSector, uint32_t Bank);
118static void FLASH_OB_PCROPConfig(uint32_t PCROConfigRDP, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr, uint32_t Banks);
119static void FLASH_OB_GetPCROP(uint32_t *PCROPConfig, uint32_t *PCROPStartAddr,uint32_t *PCROPEndAddr, uint32_t Bank);
126static void FLASH_OB_SecureAreaConfig(uint32_t SecureAreaConfig, uint32_t SecureAreaStartAddr, uint32_t SecureAreaEndAddr, uint32_t Banks);
127static void FLASH_OB_GetSecureArea(uint32_t *SecureAreaConfig, uint32_t *SecureAreaStartAddr, uint32_t *SecureAreaEndAddr, uint32_t Bank);
131#if defined (DUAL_CORE)
136#if defined (FLASH_OTPBL_LOCKBL)
141#if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
146#if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
184HAL_StatusTypeDef
HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
186 HAL_StatusTypeDef status = HAL_OK;
187 uint32_t sector_index;
190 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
191 assert_param(IS_FLASH_BANK(pEraseInit->Banks));
200 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
208#if defined (DUAL_BANK)
210 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
221 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
227 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
234 FLASH->CR1 &= (~FLASH_CR_BER);
236#if defined (DUAL_BANK)
238 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
245 FLASH->CR2 &= (~FLASH_CR_BER);
252 *SectorError = 0xFFFFFFFFU;
255 for(sector_index = pEraseInit->Sector; sector_index < (pEraseInit->NbSectors + pEraseInit->Sector); sector_index++)
259 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
265 FLASH->CR1 &= (~(FLASH_CR_SER | FLASH_CR_SNB));
267#if defined (DUAL_BANK)
268 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
274 FLASH->CR2 &= (~(FLASH_CR_SER | FLASH_CR_SNB));
281 *SectorError = sector_index;
303 HAL_StatusTypeDef status = HAL_OK;
306 assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));
307 assert_param(IS_FLASH_BANK(pEraseInit->Banks));
316 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
324#if defined (DUAL_BANK)
326 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
335 if (status != HAL_OK)
342 if((pEraseInit->Banks & FLASH_BANK_1) == FLASH_BANK_1)
345#if defined (FLASH_CR_OPERRIE)
346 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
347 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
349 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
350 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
353#if defined (DUAL_BANK)
354 if((pEraseInit->Banks & FLASH_BANK_2) == FLASH_BANK_2)
357#if defined (FLASH_CR_OPERRIE)
358 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
359 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2 | FLASH_IT_OPERR_BANK2);
361 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
362 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2);
367 if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)
370 if(pEraseInit->Banks == FLASH_BANK_1)
374#if defined (DUAL_BANK)
375 else if(pEraseInit->Banks == FLASH_BANK_2)
390#if defined (DUAL_BANK)
391 if(pEraseInit->Banks == FLASH_BANK_1)
424 HAL_StatusTypeDef status;
427 assert_param(IS_OPTIONBYTE(pOBInit->
OptionType));
440#if defined (DUAL_BANK)
454 if((pOBInit->
OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP)
456 assert_param(IS_WRPSTATE(pOBInit->
WRPState));
458 if(pOBInit->
WRPState == OB_WRPSTATE_ENABLE)
471 if((pOBInit->
OptionType & OPTIONBYTE_RDP) != 0U)
478 if((pOBInit->
OptionType & OPTIONBYTE_USER) != 0U)
485 if((pOBInit->
OptionType & OPTIONBYTE_PCROP) != 0U)
487 assert_param(IS_FLASH_BANK(pOBInit->
Banks));
494 if((pOBInit->
OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR)
499#if defined(DUAL_CORE)
501 if((pOBInit->
OptionType & OPTIONBYTE_CM7_BOOTADD) == OPTIONBYTE_CM7_BOOTADD)
507 if((pOBInit->
OptionType & OPTIONBYTE_CM4_BOOTADD) == OPTIONBYTE_CM4_BOOTADD)
513 if((pOBInit->
OptionType & OPTIONBYTE_BOOTADD) == OPTIONBYTE_BOOTADD)
520 if((pOBInit->
OptionType & OPTIONBYTE_SECURE_AREA) == OPTIONBYTE_SECURE_AREA)
525#if defined(FLASH_OTPBL_LOCKBL)
527 if((pOBInit->
OptionType & OPTIONBYTE_OTP_LOCK) == OPTIONBYTE_OTP_LOCK)
533#if defined(FLASH_OPTSR2_TCM_AXI_SHARED)
535 if((pOBInit->
OptionType & OPTIONBYTE_SHARED_RAM) == OPTIONBYTE_SHARED_RAM)
541#if defined(FLASH_OPTSR2_CPUFREQ_BOOST)
543 if((pOBInit->
OptionType & OPTIONBYTE_FREQ_BOOST) == OPTIONBYTE_FREQ_BOOST)
567 pOBInit->
OptionType = (OPTIONBYTE_USER | OPTIONBYTE_RDP | OPTIONBYTE_BOR);
578#if defined (DUAL_BANK)
579 if ((pOBInit->
Banks == FLASH_BANK_1) || (pOBInit->
Banks == FLASH_BANK_2))
581 if (pOBInit->
Banks == FLASH_BANK_1)
584 pOBInit->
OptionType |= (OPTIONBYTE_WRP | OPTIONBYTE_PCROP | OPTIONBYTE_SECURE_AREA);
598#if defined(DUAL_CORE)
599 pOBInit->
OptionType |= OPTIONBYTE_CM7_BOOTADD | OPTIONBYTE_CM4_BOOTADD;
607#if defined (FLASH_OTPBL_LOCKBL)
614#if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
621#if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
635 if(READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
638 WRITE_REG(FLASH->KEYR1, FLASH_KEY1);
639 WRITE_REG(FLASH->KEYR1, FLASH_KEY2);
642 if (READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
658 SET_BIT(FLASH->CR1, FLASH_CR_LOCK);
662#if defined (DUAL_BANK)
669 if(READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
672 WRITE_REG(FLASH->KEYR2, FLASH_KEY1);
673 WRITE_REG(FLASH->KEYR2, FLASH_KEY2);
676 if (READ_BIT(FLASH->CR2, FLASH_CR_LOCK) != 0U)
692 SET_BIT(FLASH->CR2, FLASH_CR_LOCK);
710 HAL_StatusTypeDef status;
711 uint32_t sector_index;
714 assert_param(IS_FLASH_BANK_EXCLUSIVE(pCRCInit->
Bank));
715 assert_param(IS_FLASH_TYPECRC(pCRCInit->
TypeCRC));
720 if (status == HAL_OK)
722 if (pCRCInit->
Bank == FLASH_BANK_1)
725 FLASH->CR1 |= FLASH_CR_CRC_EN;
728 FLASH->CCR1 |= (FLASH_CCR_CLR_CRCEND | FLASH_CCR_CLR_CRCRDERR);
731 FLASH->CRCCR1 |= FLASH_CRCCR_CLEAN_CRC | pCRCInit->
BurstSize | pCRCInit->
TypeCRC;
733 if (pCRCInit->
TypeCRC == FLASH_CRC_SECTORS)
736 FLASH->CRCCR1 |= FLASH_CRCCR_CLEAN_SECT;
739 for(sector_index = pCRCInit->
Sector; sector_index < (pCRCInit->
NbSectors + pCRCInit->
Sector); sector_index++)
744 else if (pCRCInit->
TypeCRC == FLASH_CRC_BANK)
747 FLASH->CRCCR1 |= FLASH_CRCCR_ALL_BANK;
756 FLASH->CRCCR1 |= FLASH_CRCCR_START_CRC;
762 (*CRC_Result) = FLASH->CRCDATA;
765 FLASH->CR1 &= (~FLASH_CR_CRC_EN);
768 __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_CRCEND_BANK1 | FLASH_FLAG_CRCRDERR_BANK1);
770#if defined (DUAL_BANK)
774 FLASH->CR2 |= FLASH_CR_CRC_EN;
777 FLASH->CCR2 |= (FLASH_CCR_CLR_CRCEND | FLASH_CCR_CLR_CRCRDERR);
780 FLASH->CRCCR2 |= FLASH_CRCCR_CLEAN_CRC | pCRCInit->
BurstSize | pCRCInit->
TypeCRC;
782 if (pCRCInit->
TypeCRC == FLASH_CRC_SECTORS)
785 FLASH->CRCCR2 |= FLASH_CRCCR_CLEAN_SECT;
788 for(sector_index = pCRCInit->
Sector; sector_index < (pCRCInit->
NbSectors + pCRCInit->
Sector); sector_index++)
793 else if (pCRCInit->
TypeCRC == FLASH_CRC_BANK)
796 FLASH->CRCCR2 |= FLASH_CRCCR_ALL_BANK;
805 FLASH->CRCCR2 |= FLASH_CRCCR_START_CRC;
811 (*CRC_Result) = FLASH->CRCDATA;
814 FLASH->CR2 &= (~FLASH_CR_CRC_EN);
817 __HAL_FLASH_CLEAR_FLAG_BANK2(FLASH_FLAG_CRCEND_BANK2 | FLASH_FLAG_CRCRDERR_BANK2);
859#if defined (FLASH_CR_PSIZE)
860 assert_param(IS_VOLTAGERANGE(VoltageRange));
864 assert_param(IS_FLASH_BANK(Banks));
866#if defined (DUAL_BANK)
868 if((Banks & FLASH_BANK_BOTH) == FLASH_BANK_BOTH)
870#if defined (FLASH_CR_PSIZE)
872 FLASH->CR1 &= (~FLASH_CR_PSIZE);
873 FLASH->CR2 &= (~FLASH_CR_PSIZE);
876 FLASH->CR1 |= VoltageRange;
877 FLASH->CR2 |= VoltageRange;
881 FLASH->OPTCR |= FLASH_OPTCR_MER;
887 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
889#if defined (FLASH_CR_PSIZE)
891 FLASH->CR1 &= (~FLASH_CR_PSIZE);
892 FLASH->CR1 |= VoltageRange;
896 FLASH->CR1 |= (FLASH_CR_BER | FLASH_CR_START);
899#if defined (DUAL_BANK)
900 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
902#if defined (FLASH_CR_PSIZE)
904 FLASH->CR2 &= (~FLASH_CR_PSIZE);
905 FLASH->CR2 |= VoltageRange;
909 FLASH->CR2 |= (FLASH_CR_BER | FLASH_CR_START);
935 assert_param(IS_FLASH_SECTOR(Sector));
936 assert_param(IS_FLASH_BANK_EXCLUSIVE(Banks));
937#if defined (FLASH_CR_PSIZE)
938 assert_param(IS_VOLTAGERANGE(VoltageRange));
943 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
945#if defined (FLASH_CR_PSIZE)
947 FLASH->CR1 &= ~(FLASH_CR_PSIZE | FLASH_CR_SNB);
949 FLASH->CR1 |= (FLASH_CR_SER | VoltageRange | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
952 FLASH->CR1 &= ~(FLASH_CR_SNB);
954 FLASH->CR1 |= (FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
958#if defined (DUAL_BANK)
959 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
961#if defined (FLASH_CR_PSIZE)
963 FLASH->CR2 &= ~(FLASH_CR_PSIZE | FLASH_CR_SNB);
965 FLASH->CR2 |= (FLASH_CR_SER | VoltageRange | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
968 FLASH->CR2 &= ~(FLASH_CR_SNB);
970 FLASH->CR2 |= (FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos) | FLASH_CR_START);
993 assert_param(IS_OB_WRP_SECTOR(WRPSector));
994 assert_param(IS_FLASH_BANK(Banks));
996 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
999 FLASH->WPSN_PRG1 &= (~(WRPSector & FLASH_WPSN_WRPSN));
1002#if defined (DUAL_BANK)
1003 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1006 FLASH->WPSN_PRG2 &= (~(WRPSector & FLASH_WPSN_WRPSN));
1028 assert_param(IS_OB_WRP_SECTOR(WRPSector));
1029 assert_param(IS_FLASH_BANK(Banks));
1031 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1034 FLASH->WPSN_PRG1 |= (WRPSector & FLASH_WPSN_WRPSN);
1037#if defined (DUAL_BANK)
1038 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1041 FLASH->WPSN_PRG2 |= (WRPSector & FLASH_WPSN_WRPSN);
1066 uint32_t regvalue = 0U;
1068 if(Bank == FLASH_BANK_1)
1070 regvalue = FLASH->WPSN_CUR1;
1073#if defined (DUAL_BANK)
1074 if(Bank == FLASH_BANK_2)
1076 regvalue = FLASH->WPSN_CUR2;
1080 (*WRPSector) = (~regvalue) & FLASH_WPSN_WRPSN;
1082 if(*WRPSector == 0U)
1084 (*WRPState) = OB_WRPSTATE_DISABLE;
1088 (*WRPState) = OB_WRPSTATE_ENABLE;
1113 assert_param(IS_OB_RDP_LEVEL(RDPLevel));
1116 MODIFY_REG(FLASH->OPTSR_PRG, FLASH_OPTSR_RDP, RDPLevel);
1129 uint32_t rdp_level = READ_BIT(FLASH->OPTSR_CUR, FLASH_OPTSR_RDP);
1131 if ((rdp_level != OB_RDP_LEVEL_0) && (rdp_level != OB_RDP_LEVEL_2))
1133 return (OB_RDP_LEVEL_1);
1141#if defined(DUAL_CORE)
1185 uint32_t optr_reg_val = 0;
1186 uint32_t optr_reg_mask = 0;
1189 assert_param(IS_OB_USER_TYPE(UserType));
1191 if((UserType & OB_USER_IWDG1_SW) != 0U)
1194 assert_param(IS_OB_IWDG1_SOURCE(UserConfig & FLASH_OPTSR_IWDG1_SW));
1197 optr_reg_val |= (UserConfig & FLASH_OPTSR_IWDG1_SW);
1198 optr_reg_mask |= FLASH_OPTSR_IWDG1_SW;
1200#if defined(DUAL_CORE)
1201 if((UserType & OB_USER_IWDG2_SW) != 0U)
1204 assert_param(IS_OB_IWDG2_SOURCE(UserConfig & FLASH_OPTSR_IWDG2_SW));
1207 optr_reg_val |= (UserConfig & FLASH_OPTSR_IWDG2_SW);
1208 optr_reg_mask |= FLASH_OPTSR_IWDG2_SW;
1211 if((UserType & OB_USER_NRST_STOP_D1) != 0U)
1214 assert_param(IS_OB_STOP_D1_RESET(UserConfig & FLASH_OPTSR_NRST_STOP_D1));
1217 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STOP_D1);
1218 optr_reg_mask |= FLASH_OPTSR_NRST_STOP_D1;
1221 if((UserType & OB_USER_NRST_STDBY_D1) != 0U)
1224 assert_param(IS_OB_STDBY_D1_RESET(UserConfig & FLASH_OPTSR_NRST_STBY_D1));
1227 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STBY_D1);
1228 optr_reg_mask |= FLASH_OPTSR_NRST_STBY_D1;
1231 if((UserType & OB_USER_IWDG_STOP) != 0U)
1234 assert_param(IS_OB_USER_IWDG_STOP(UserConfig & FLASH_OPTSR_FZ_IWDG_STOP));
1237 optr_reg_val |= (UserConfig & FLASH_OPTSR_FZ_IWDG_STOP);
1238 optr_reg_mask |= FLASH_OPTSR_FZ_IWDG_STOP;
1241 if((UserType & OB_USER_IWDG_STDBY) != 0U)
1244 assert_param(IS_OB_USER_IWDG_STDBY(UserConfig & FLASH_OPTSR_FZ_IWDG_SDBY));
1247 optr_reg_val |= (UserConfig & FLASH_OPTSR_FZ_IWDG_SDBY);
1248 optr_reg_mask |= FLASH_OPTSR_FZ_IWDG_SDBY;
1251 if((UserType & OB_USER_ST_RAM_SIZE) != 0U)
1254 assert_param(IS_OB_USER_ST_RAM_SIZE(UserConfig & FLASH_OPTSR_ST_RAM_SIZE));
1257 optr_reg_val |= (UserConfig & FLASH_OPTSR_ST_RAM_SIZE);
1258 optr_reg_mask |= FLASH_OPTSR_ST_RAM_SIZE;
1261 if((UserType & OB_USER_SECURITY) != 0U)
1264 assert_param(IS_OB_USER_SECURITY(UserConfig & FLASH_OPTSR_SECURITY));
1267 optr_reg_val |= (UserConfig & FLASH_OPTSR_SECURITY);
1268 optr_reg_mask |= FLASH_OPTSR_SECURITY;
1271#if defined(DUAL_CORE)
1272 if((UserType & OB_USER_BCM4) != 0U)
1275 assert_param(IS_OB_USER_BCM4(UserConfig & FLASH_OPTSR_BCM4));
1278 optr_reg_val |= (UserConfig & FLASH_OPTSR_BCM4);
1279 optr_reg_mask |= FLASH_OPTSR_BCM4;
1282 if((UserType & OB_USER_BCM7) != 0U)
1285 assert_param(IS_OB_USER_BCM7(UserConfig & FLASH_OPTSR_BCM7));
1288 optr_reg_val |= (UserConfig & FLASH_OPTSR_BCM7);
1289 optr_reg_mask |= FLASH_OPTSR_BCM7;
1293#if defined (FLASH_OPTSR_NRST_STOP_D2)
1294 if((UserType & OB_USER_NRST_STOP_D2) != 0U)
1297 assert_param(IS_OB_STOP_D2_RESET(UserConfig & FLASH_OPTSR_NRST_STOP_D2));
1300 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STOP_D2);
1301 optr_reg_mask |= FLASH_OPTSR_NRST_STOP_D2;
1304 if((UserType & OB_USER_NRST_STDBY_D2) != 0U)
1307 assert_param(IS_OB_STDBY_D2_RESET(UserConfig & FLASH_OPTSR_NRST_STBY_D2));
1310 optr_reg_val |= (UserConfig & FLASH_OPTSR_NRST_STBY_D2);
1311 optr_reg_mask |= FLASH_OPTSR_NRST_STBY_D2;
1315#if defined (DUAL_BANK)
1316 if((UserType & OB_USER_SWAP_BANK) != 0U)
1319 assert_param(IS_OB_USER_SWAP_BANK(UserConfig & FLASH_OPTSR_SWAP_BANK_OPT));
1322 optr_reg_val |= (UserConfig & FLASH_OPTSR_SWAP_BANK_OPT);
1323 optr_reg_mask |= FLASH_OPTSR_SWAP_BANK_OPT;
1327 if((UserType & OB_USER_IOHSLV) != 0U)
1330 assert_param(IS_OB_USER_IOHSLV(UserConfig & FLASH_OPTSR_IO_HSLV));
1333 optr_reg_val |= (UserConfig & FLASH_OPTSR_IO_HSLV);
1334 optr_reg_mask |= FLASH_OPTSR_IO_HSLV;
1337#if defined (FLASH_OPTSR_VDDMMC_HSLV)
1338 if((UserType & OB_USER_VDDMMC_HSLV) != 0U)
1341 assert_param(IS_OB_USER_VDDMMC_HSLV(UserConfig & FLASH_OPTSR_VDDMMC_HSLV));
1344 optr_reg_val |= (UserConfig & FLASH_OPTSR_VDDMMC_HSLV);
1345 optr_reg_mask |= FLASH_OPTSR_VDDMMC_HSLV;
1350 MODIFY_REG(FLASH->OPTSR_PRG, optr_reg_mask, optr_reg_val);
1353#if defined(DUAL_CORE)
1373 uint32_t userConfig = READ_REG(FLASH->OPTSR_CUR);
1374 userConfig &= (~(FLASH_OPTSR_BOR_LEV | FLASH_OPTSR_RDP));
1405static void FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr, uint32_t Banks)
1408 assert_param(IS_FLASH_BANK(Banks));
1409 assert_param(IS_OB_PCROP_RDP(PCROPConfig));
1411 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1413 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(PCROPStartAddr));
1414 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(PCROPEndAddr));
1417 FLASH->PRAR_PRG1 = ((PCROPStartAddr - FLASH_BANK1_BASE) >> 8) | \
1418 (((PCROPEndAddr - FLASH_BANK1_BASE) >> 8) << FLASH_PRAR_PROT_AREA_END_Pos) | \
1422#if defined (DUAL_BANK)
1423 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1425 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(PCROPStartAddr));
1426 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(PCROPEndAddr));
1429 FLASH->PRAR_PRG2 = ((PCROPStartAddr - FLASH_BANK2_BASE) >> 8) | \
1430 (((PCROPEndAddr - FLASH_BANK2_BASE) >> 8) << FLASH_PRAR_PROT_AREA_END_Pos) | \
1454static void FLASH_OB_GetPCROP(uint32_t *PCROPConfig, uint32_t *PCROPStartAddr, uint32_t *PCROPEndAddr, uint32_t Bank)
1456 uint32_t regvalue = 0;
1457 uint32_t bankBase = 0;
1459 if(Bank == FLASH_BANK_1)
1461 regvalue = FLASH->PRAR_CUR1;
1462 bankBase = FLASH_BANK1_BASE;
1465#if defined (DUAL_BANK)
1466 if(Bank == FLASH_BANK_2)
1468 regvalue = FLASH->PRAR_CUR2;
1469 bankBase = FLASH_BANK2_BASE;
1473 (*PCROPConfig) = (regvalue & FLASH_PRAR_DMEP);
1475 (*PCROPStartAddr) = ((regvalue & FLASH_PRAR_PROT_AREA_START) << 8) + bankBase;
1476 (*PCROPEndAddr) = (regvalue & FLASH_PRAR_PROT_AREA_END) >> FLASH_PRAR_PROT_AREA_END_Pos;
1477 (*PCROPEndAddr) = ((*PCROPEndAddr) << 8) + bankBase;
1492 assert_param(IS_OB_BOR_LEVEL(Level));
1495 MODIFY_REG(FLASH->OPTSR_PRG, FLASH_OPTSR_BOR_LEV, Level);
1509 return (FLASH->OPTSR_CUR & FLASH_OPTSR_BOR_LEV);
1525 assert_param(IS_OB_BOOT_ADD_OPTION(BootOption));
1527 if((BootOption & OB_BOOT_ADD0) == OB_BOOT_ADD0)
1530 assert_param(IS_BOOT_ADDRESS(BootAddress0));
1533#if defined(DUAL_CORE)
1534 MODIFY_REG(FLASH->BOOT7_PRG, FLASH_BOOT7_BCM7_ADD0, (BootAddress0 >> 16));
1536 MODIFY_REG(FLASH->BOOT_PRG, FLASH_BOOT_ADD0, (BootAddress0 >> 16));
1540 if((BootOption & OB_BOOT_ADD1) == OB_BOOT_ADD1)
1543 assert_param(IS_BOOT_ADDRESS(BootAddress1));
1546#if defined(DUAL_CORE)
1547 MODIFY_REG(FLASH->BOOT7_PRG, FLASH_BOOT7_BCM7_ADD1, BootAddress1);
1549 MODIFY_REG(FLASH->BOOT_PRG, FLASH_BOOT_ADD1, BootAddress1);
1564#if defined(DUAL_CORE)
1565 regvalue = FLASH->BOOT7_CUR;
1567 (*BootAddress0) = (regvalue & FLASH_BOOT7_BCM7_ADD0) << 16;
1568 (*BootAddress1) = (regvalue & FLASH_BOOT7_BCM7_ADD1);
1570 regvalue = FLASH->BOOT_CUR;
1572 (*BootAddress0) = (regvalue & FLASH_BOOT_ADD0) << 16;
1573 (*BootAddress1) = (regvalue & FLASH_BOOT_ADD1);
1577#if defined(DUAL_CORE)
1591 assert_param(IS_OB_BOOT_ADD_OPTION(BootOption));
1593 if((BootOption & OB_BOOT_ADD0) == OB_BOOT_ADD0)
1596 assert_param(IS_BOOT_ADDRESS(BootAddress0));
1599 MODIFY_REG(FLASH->BOOT4_PRG, FLASH_BOOT4_BCM4_ADD0, (BootAddress0 >> 16));
1603 if((BootOption & OB_BOOT_ADD1) == OB_BOOT_ADD1)
1606 assert_param(IS_BOOT_ADDRESS(BootAddress1));
1609 MODIFY_REG(FLASH->BOOT4_PRG, FLASH_BOOT4_BCM4_ADD1, BootAddress1);
1623 regvalue = FLASH->BOOT4_CUR;
1625 (*BootAddress0) = (regvalue & FLASH_BOOT4_BCM4_ADD0) << 16;
1626 (*BootAddress1) = (regvalue & FLASH_BOOT4_BCM4_ADD1);
1647 assert_param(IS_FLASH_BANK(Banks));
1648 assert_param(IS_OB_SECURE_RDP(SecureAreaConfig));
1650 if((Banks & FLASH_BANK_1) == FLASH_BANK_1)
1653 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(SecureAreaStartAddr));
1654 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(SecureAreaEndAddr));
1657 FLASH->SCAR_PRG1 = ((SecureAreaStartAddr - FLASH_BANK1_BASE) >> 8) | \
1658 (((SecureAreaEndAddr - FLASH_BANK1_BASE) >> 8) << FLASH_SCAR_SEC_AREA_END_Pos) | \
1659 (SecureAreaConfig & FLASH_SCAR_DMES);
1662#if defined (DUAL_BANK)
1663 if((Banks & FLASH_BANK_2) == FLASH_BANK_2)
1666 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(SecureAreaStartAddr));
1667 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(SecureAreaEndAddr));
1670 FLASH->SCAR_PRG2 = ((SecureAreaStartAddr - FLASH_BANK2_BASE) >> 8) | \
1671 (((SecureAreaEndAddr - FLASH_BANK2_BASE) >> 8) << FLASH_SCAR_SEC_AREA_END_Pos) | \
1672 (SecureAreaConfig & FLASH_SCAR_DMES);
1686static void FLASH_OB_GetSecureArea(uint32_t *SecureAreaConfig, uint32_t *SecureAreaStartAddr, uint32_t *SecureAreaEndAddr, uint32_t Bank)
1688 uint32_t regvalue = 0;
1689 uint32_t bankBase = 0;
1692 if(Bank == FLASH_BANK_1)
1694 regvalue = FLASH->SCAR_CUR1;
1695 bankBase = FLASH_BANK1_BASE;
1698#if defined (DUAL_BANK)
1699 if(Bank == FLASH_BANK_2)
1701 regvalue = FLASH->SCAR_CUR2;
1702 bankBase = FLASH_BANK2_BASE;
1707 (*SecureAreaConfig) = (regvalue & FLASH_SCAR_DMES);
1708 (*SecureAreaStartAddr) = ((regvalue & FLASH_SCAR_SEC_AREA_START) << 8) + bankBase;
1709 (*SecureAreaEndAddr) = (regvalue & FLASH_SCAR_SEC_AREA_END) >> FLASH_SCAR_SEC_AREA_END_Pos;
1710 (*SecureAreaEndAddr) = ((*SecureAreaEndAddr) << 8) + bankBase;
1722 assert_param(IS_FLASH_SECTOR(Sector));
1724 if (Bank == FLASH_BANK_1)
1727 FLASH->CRCCR1 &= (~FLASH_CRCCR_CRC_SECT);
1730 FLASH->CRCCR1 |= Sector | FLASH_CRCCR_ADD_SECT;
1732#if defined (DUAL_BANK)
1736 FLASH->CRCCR2 &= (~FLASH_CRCCR_CRC_SECT);
1739 FLASH->CRCCR2 |= Sector | FLASH_CRCCR_ADD_SECT;
1753 if (Bank == FLASH_BANK_1)
1755 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(CRCStartAddr));
1756 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK1(CRCEndAddr));
1759 FLASH->CRCSADD1 = CRCStartAddr;
1760 FLASH->CRCEADD1 = CRCEndAddr;
1762#if defined (DUAL_BANK)
1765 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(CRCStartAddr));
1766 assert_param(IS_FLASH_PROGRAM_ADDRESS_BANK2(CRCEndAddr));
1769 FLASH->CRCSADD2 = CRCStartAddr;
1770 FLASH->CRCEADD2 = CRCEndAddr;
1778#if defined (FLASH_OTPBL_LOCKBL)
1788 assert_param(IS_OTP_BLOCK(OTP_Block));
1791 FLASH->OTPBL_PRG |= (OTP_Block & FLASH_OTPBL_LOCKBL);
1801 return (FLASH->OTPBL_CUR);
1805#if defined (FLASH_OPTSR2_TCM_AXI_SHARED)
1815 assert_param(IS_OB_USER_TCM_AXI_SHARED(SharedRamConfig));
1818 MODIFY_REG(FLASH->OPTSR2_PRG, FLASH_OPTSR2_TCM_AXI_SHARED, SharedRamConfig);
1828 return (FLASH->OPTSR2_CUR & FLASH_OPTSR2_TCM_AXI_SHARED);;
1832#if defined (FLASH_OPTSR2_CPUFREQ_BOOST)
1842 assert_param(IS_OB_USER_CPUFREQ_BOOST(FreqBoost));
1845 MODIFY_REG(FLASH->OPTSR2_PRG, FLASH_OPTSR2_CPUFREQ_BOOST, FreqBoost);
1855 return (FLASH->OPTSR2_CUR & FLASH_OPTSR2_CPUFREQ_BOOST);;
HAL_StatusTypeDef FLASH_CRC_WaitForLastOperation(uint32_t Timeout, uint32_t Bank)
Wait for a FLASH CRC computation to complete.
HAL_StatusTypeDef FLASH_OB_WaitForLastOperation(uint32_t Timeout)
Wait for a FLASH Option Bytes change operation to complete.
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
Wait for a FLASH operation to complete.
FLASH_ProcessTypeDef pFlash
HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)
Program option bytes.
HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank2(void)
Locks the FLASH Bank2 control registers access.
HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank2(void)
Unlock the FLASH Bank2 control registers access.
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
Perform a mass erase or erase the specified FLASH memory sectors.
void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
Get the Option byte configuration.
HAL_StatusTypeDef HAL_FLASHEx_ComputeCRC(FLASH_CRCInitTypeDef *pCRCInit, uint32_t *CRC_Result)
HAL_StatusTypeDef HAL_FLASHEx_Unlock_Bank1(void)
Unlock the FLASH Bank1 control registers access.
HAL_StatusTypeDef HAL_FLASHEx_Lock_Bank1(void)
Locks the FLASH Bank1 control registers access.
HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)
Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled.
static void FLASH_OB_OTP_LockConfig(uint32_t OTP_Block)
Configure the OTP Block Lock.
static uint32_t FLASH_OB_CPUFreq_GetBoost(void)
Get the CPU Frequency Boost state.
static void FLASH_MassErase(uint32_t VoltageRange, uint32_t Banks)
Mass erase of FLASH memory.
static void FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig)
Program the FLASH User Option Byte.
static void FLASH_OB_RDPConfig(uint32_t RDPLevel)
Set the read protection level.
static void FLASH_OB_GetCM4BootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1)
Get CM4 Boot address.
static void FLASH_OB_GetBootAdd(uint32_t *BootAddress0, uint32_t *BootAddress1)
Get Boot address.
static void FLASH_OB_GetSecureArea(uint32_t *SecureAreaConfig, uint32_t *SecureAreaStartAddr, uint32_t *SecureAreaEndAddr, uint32_t Bank)
Get secure area configuration.
static void FLASH_OB_CM4BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1)
Set CM4 Boot address.
static void FLASH_CRC_SelectAddress(uint32_t CRCStartAddr, uint32_t CRCEndAddr, uint32_t Bank)
Select CRC start and end memory addresses on which the CRC will be calculated.
static void FLASH_OB_CPUFreq_BoostConfig(uint32_t FreqBoost)
Configure the CPU Frequency Boost.
static void FLASH_OB_BOR_LevelConfig(uint32_t Level)
Set the BOR Level.
static uint16_t FLASH_OB_GetWRP(void)
Return the FLASH Write Protection Option Bytes value.
static void FLASH_OB_BootAddConfig(uint32_t BootOption, uint32_t BootAddress0, uint32_t BootAddress1)
Set Boot address.
static void FLASH_OB_SharedRAM_Config(uint32_t SharedRamConfig)
Configure the TCM / AXI Shared RAM.
static uint32_t FLASH_OB_OTP_GetLock(void)
Get the OTP Block Lock.
static void FLASH_CRC_AddSector(uint32_t Sector, uint32_t Bank)
Add a CRC sector to the list of sectors on which the CRC will be calculated.
static uint32_t FLASH_OB_GetPCROP(void)
Return the FLASH PCROP Protection Option Bytes value.
void FLASH_Erase_Sector(uint32_t Sector, uint32_t Banks, uint32_t VoltageRange)
Erase the specified FLASH memory sector.
static void FLASH_OB_PCROPConfig(uint32_t PCROConfigRDP, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr, uint32_t Banks)
Configure the Proprietary code readout protection of the desired addresses.
static void FLASH_OB_SecureAreaConfig(uint32_t SecureAreaConfig, uint32_t SecureAreaStartAddr, uint32_t SecureAreaEndAddr, uint32_t Banks)
Set secure area configuration.
static uint32_t FLASH_OB_SharedRAM_GetConfig(void)
Get the TCM / AXI Shared RAM configurtion.
UNUSED(samplingTimeSeconds)
Header file of FLASH HAL module.
static void FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Bank)
Disable the write protection of the desired bank1 or bank 2 sectors.
static uint32_t FLASH_OB_GetRDP(void)
Get the read protection level.
static uint32_t FLASH_OB_GetUser(void)
Return the FLASH User Option Byte value.
static void FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks)
Enable the write protection of the desired bank1 or bank 2 sectors.
static uint32_t FLASH_OB_GetBOR(void)
Get the BOR Level.
Header file of FLASH HAL module.
FLASH Erase structure definition.
FLASH Option Bytes Program structure definition.
uint32_t SecureAreaConfig
uint32_t SecureAreaStartAddr
uint32_t SecureAreaEndAddr
__IO uint32_t NbSectorsToErase
__IO uint8_t VoltageForErase
__IO FLASH_ProcedureTypeDef ProcedureOnGoing