#define USRCONFIGMASK 0xFFFFF8FF
#define BORLEVELMASK 0x00000700
#define BORLEVEL OB_BOR_LEVEL_1
#define BOR_FLAG_TIMEOUT 1000
#define RDPLEVEL OB_RDP_LEVEL_1
/*******************************************************************************
* Function Name :
* Parameters : None
* Return : None
* Description :
*******************************************************************************/
void Config_BOR(void)
{
FLASH_OBProgramInitTypeDef FLASH_Handle;
uint32_t BORTimeout = BOR_FLAG_TIMEOUT;
HAL_FLASHEx_OBGetConfig(&FLASH_Handle);
if(Get_BORConfig() != BORLEVEL){
FLASH_Handle.USERConfig = (Get_USRConfig() | BORLEVEL);
FLASH_Handle.USERType = OB_USER_BOR_LEV;
FLASH_Handle.OptionType = OPTIONBYTE_USER;
while (HAL_FLASH_Unlock() != HAL_OK){
if((BORTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_Unlock\r\n");
}
BORTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_OB_Unlock() != HAL_OK){
if((BORTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_OB_Unlock\r\n");
}
DEBUGPRINT("%X\r\n", FLASH_Handle.USERConfig);
BORTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASHEx_OBProgram(&FLASH_Handle) != HAL_OK){
if((BORTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASHEx_OBProgram\r\n");
}
BORTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_OB_Lock() != HAL_OK){
if((BORTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_OB_Lock\r\n");
}
BORTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_Lock() != HAL_OK){
if((BORTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_Lock\r\n");
}
}
}
/*******************************************************************************
* Function Name :
* Parameters : None
* Return : None
* Description :
*******************************************************************************/
void Config_RDP(void)
{
FLASH_OBProgramInitTypeDef FLASH_Handle;
uint32_t RDPTimeout = BOR_FLAG_TIMEOUT;
HAL_FLASHEx_OBGetConfig(&FLASH_Handle);
if(Get_RDPConfig() != RDPLEVEL){
FLASH_Handle.RDPLevel = RDPLEVEL;
FLASH_Handle.OptionType = OPTIONBYTE_RDP;
while (HAL_FLASH_Unlock() != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_Unlock\r\n");
}
RDPTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_OB_Unlock() != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_OB_Unlock\r\n");
}
DEBUGPRINT("%X\r\n", FLASH_Handle.PCROPConfig);
RDPTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASHEx_OBProgram(&FLASH_Handle) != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASHEx_OBProgram\r\n");
}
RDPTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_OB_Launch() != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_OB_Launch\r\n");
}
RDPTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_OB_Lock() != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_OB_Lock\r\n");
}
RDPTimeout = BOR_FLAG_TIMEOUT;
while (HAL_FLASH_Lock() != HAL_OK){
if((RDPTimeout--) == 0){break;}
DEBUGPRINT("HAL_FLASH_Lock\r\n");
}
}
}
/*******************************************************************************
* Function Name :
* Parameters : None
* Return : None
* Description :
*******************************************************************************/
uint32_t Get_USRConfig(void)
{
FLASH_OBProgramInitTypeDef FLASH_Handle;
/* Read option bytes */
HAL_FLASHEx_OBGetConfig(&FLASH_Handle);
return (FLASH_Handle.USERConfig & USRCONFIGMASK);
}
/*******************************************************************************
* Function Name :
* Parameters : None
* Return : None
* Description :
*******************************************************************************/
uint32_t Get_BORConfig(void)
{
FLASH_OBProgramInitTypeDef FLASH_Handle;
/* Read option bytes */
HAL_FLASHEx_OBGetConfig(&FLASH_Handle);
return (FLASH_Handle.USERConfig & BORLEVELMASK);
}
/*******************************************************************************
* Function Name :
* Parameters : None
* Return : None
* Description :
*******************************************************************************/
uint32_t Get_RDPConfig(void)
{
FLASH_OBProgramInitTypeDef FLASH_Handle;
/* Read option bytes */
HAL_FLASHEx_OBGetConfig(&FLASH_Handle);
return (FLASH_Handle.RDPLevel);
}
'초보의 아웅다웅 설계하기 > STM32' 카테고리의 다른 글
IAR 에서 고정 영역 SRAM과 ROM 사용 (0) | 2018.07.06 |
---|---|
STM32L432 Read Protection 버그인가? (0) | 2018.06.28 |
STM32L4 ADC Low Layer Driver (1) | 2018.05.30 |
WWDG에서 Watchdog 발생시 클리어 처리 (0) | 2018.05.17 |
변수 선언시 __IO의 사용 (0) | 2018.04.21 |