초보의 아웅다웅 설계하기/STM32

STM32L4xx에서 Brownout, ReadOut Protection 설정

로망와니 2018. 6. 26. 13:34




#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);

}