2021-10-07 12:24 PM
My hardware design doesn't connect the BOOT0-Pin to a specific voltage level. That's why I need to write to the OPTR Register so that the BOOT0-Pin is not read at the boot sequence.
I check the OPTR Register:
FLASH->OPTR = ffeff8aa
RDP = aa
BOR_LEV = 0
nRST_STOP = 1
nRST_STDBY = 1
nRST_SHDW = 1
IWDG_SW = 1
IWDG_STOP = 1
IWDG_STDBY = 1
WWDG_SW = 1
BFB2 = 0
DBANK = 1
nBOOT1 = 1
SRAM_PE = 1
CCMSRAM_RST = 1
nSWBOOT0 = 1
nBOOT0 = 1
NRST_MODE = 3
IRHEN = 1
I need to clear the nSWBOOT0 so that the BOOT0-pin is not been evaluated anymore.
I wrote a code sequence to clear the nSWBOOT0...
FLASH_OBProgramInitTypeDef FLASH_OBInitStruct;
HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);
FLASH_OBInitStruct.OptionType = OPTIONBYTE_USER;
FLASH_OBInitStruct.USERType = OB_USER_nSWBOOT0;
CLEAR_BIT(FLASH_OBInitStruct.USERConfig, FLASH_OPTR_nSWBOOT0);
printf("FLASH_OBProgramInitTypeDef\n");
printf(" OptionType = %" PRIx32 "\n", FLASH_OBInitStruct.OptionType);
printf(" RDPLevel = %" PRIx32 "\n", FLASH_OBInitStruct.RDPLevel);
printf(" USERType = %" PRIx32 "\n", FLASH_OBInitStruct.USERType);
printf(" USERConfig = %" PRIx32 "\n", FLASH_OBInitStruct.USERConfig);
printf(" PCROPConfig = %" PRIx32 "\n", FLASH_OBInitStruct.PCROPConfig);
printf("\n");
/* Unlock the option bytes block access */
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
/* Launch the option byte loading */
HAL_FLASH_OB_Launch();
/* Locks the option bytes block access */
HAL_FLASH_OB_Lock();
... that outputs the right value...
FLASH_OBProgramInitTypeDef
OptionType = 4
RDPLevel = aa
USERType = 2000
USERConfig = fbeff800
PCROPConfig = 0
... but it goes to the HardFault_Handler:
My question: why?
Solved! Go to Solution.
2021-10-08 07:10 AM
I found something related here: Unlock readout protection
It first unlocks the Flash itself with HAL_FLASH_Unlock()
Now it works!
Here is the almost working example (it writes to OPTR Register but also reloads the program somehow):
FLASH_OBProgramInitTypeDef FLASH_OBInitStruct;
HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);
FLASH_OBInitStruct.OptionType = OPTIONBYTE_USER;
FLASH_OBInitStruct.USERType = OB_USER_nSWBOOT0;
CLEAR_BIT(FLASH_OBInitStruct.USERConfig, FLASH_OPTR_nSWBOOT0);
printf("FLASH_OBProgramInitTypeDef\n");
printf(" OptionType = %" PRIx32 "\n", FLASH_OBInitStruct.OptionType);
printf(" RDPLevel = %" PRIx32 "\n", FLASH_OBInitStruct.RDPLevel);
printf(" USERType = %" PRIx32 "\n", FLASH_OBInitStruct.USERType);
printf(" USERConfig = %" PRIx32 "\n", FLASH_OBInitStruct.USERConfig);
printf(" PCROPConfig = %" PRIx32 "\n", FLASH_OBInitStruct.PCROPConfig);
printf("\n");
/* Unlock the FLASH control register access */
HAL_FLASH_Unlock();
/* Unlock the option bytes block access */
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
/* Launch the option byte loading */
HAL_FLASH_OB_Launch();
/* Locks the option bytes block access */
HAL_FLASH_OB_Lock();
/* Lock the FLASH control register access */
HAL_FLASH_Lock();
Here is an other example from ST itself:
C:\Users\andreas\STM32Cube\Repository\STM32Cube_FW_G4_V1.4.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_WriteProtection\Src
For me the problem is solved!
2021-10-08 07:10 AM
I found something related here: Unlock readout protection
It first unlocks the Flash itself with HAL_FLASH_Unlock()
Now it works!
Here is the almost working example (it writes to OPTR Register but also reloads the program somehow):
FLASH_OBProgramInitTypeDef FLASH_OBInitStruct;
HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);
FLASH_OBInitStruct.OptionType = OPTIONBYTE_USER;
FLASH_OBInitStruct.USERType = OB_USER_nSWBOOT0;
CLEAR_BIT(FLASH_OBInitStruct.USERConfig, FLASH_OPTR_nSWBOOT0);
printf("FLASH_OBProgramInitTypeDef\n");
printf(" OptionType = %" PRIx32 "\n", FLASH_OBInitStruct.OptionType);
printf(" RDPLevel = %" PRIx32 "\n", FLASH_OBInitStruct.RDPLevel);
printf(" USERType = %" PRIx32 "\n", FLASH_OBInitStruct.USERType);
printf(" USERConfig = %" PRIx32 "\n", FLASH_OBInitStruct.USERConfig);
printf(" PCROPConfig = %" PRIx32 "\n", FLASH_OBInitStruct.PCROPConfig);
printf("\n");
/* Unlock the FLASH control register access */
HAL_FLASH_Unlock();
/* Unlock the option bytes block access */
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
/* Launch the option byte loading */
HAL_FLASH_OB_Launch();
/* Locks the option bytes block access */
HAL_FLASH_OB_Lock();
/* Lock the FLASH control register access */
HAL_FLASH_Lock();
Here is an other example from ST itself:
C:\Users\andreas\STM32Cube\Repository\STM32Cube_FW_G4_V1.4.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_WriteProtection\Src
For me the problem is solved!