Skip to main content
Associate III
October 5, 2023
Solved

Jump from application code to system memory bootloader on STM32WB15CC

  • October 5, 2023
  • 1 reply
  • 1596 views

Hello, I'm trying to flash my STM32WB15CC using UART1 without using pin BOOT0(PH3). I'm using a NUCLEO-WB15CC. For that I know that I've to set some bits in OPTR register and jump from application code to memory system bootloader and then connect to UART1.
I've found how to do it using STM32CubeProgrammer by setting the bits SWBOOT0 = 0, BOOT0 = 0 and BOOT1 = 1.

But when I'm trying to jump from application code to the system memory bootloader by setting these bits that doesn't work and I can't find a way to do it. Anybody know how to do that ?

This is my code

 

FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;

//Clear OPTLOCK option lock bit
CLEAR_BIT(FLASH->CR, FLASH_CR_OPTLOCK_Msk);

//Check Flash memory is not busy
while ((FLASH->SR & FLASH_SR_BSY) != 0) {}

//Write the desired options value in the options registers
CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_nSWBOOT0_Msk);
CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_nBOOT0_Msk);
SET_BIT(FLASH->OPTR, FLASH_OPTR_nBOOT1_Msk);

//Set the Options Start bit OPTSTRT
SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT_Msk);

//Check Flash memory is not busy
while ((FLASH->SR & FLASH_SR_BSY) != 0) {}

SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH_Msk);

 

Thank you in advance for your help
 

This topic has been closed for replies.
Best answer by Coco

Hello Pierre, thanks for you answer and I had already read this application note.
In the meantime, I was able to resolve my issue by running the code below.

 

void goto_system_memory_bootloader() {
	/* Unlock the FLASH control register access */
	HAL_FLASH_Unlock();
	/* Unlocks the option bytes block access */
	HAL_FLASH_OB_Unlock();

	FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

	FLASH_OBProgramInitTypeDef OBInitStruct;

	HAL_FLASHEx_OBGetConfig(&OBInitStruct);

	OBInitStruct.OptionType = OPTIONBYTE_USER;
	OBInitStruct.UserType = OB_USER_nSWBOOT0;

	CLEAR_BIT(OBInitStruct.UserConfig, FLASH_OPTR_nSWBOOT0);
	SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

	/* Unlock the FLASH control register access */
	HAL_FLASH_Unlock();

	/* Unlock the option bytes block access */
	HAL_FLASH_OB_Unlock();

	HAL_FLASHEx_OBProgram(&OBInitStruct);

	FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

	/* 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();
}

 

1 reply

Pierre_Paris
ST Employee
October 9, 2023

Hello @Coco,

Thank you for your question.

Have you considered this article titled How to jump to system bootloader from application code on STM32 microcontrollers ?

Also, I advise you to read the STM32 microcontroller system memory boot mode -  Application note and particularly the chapter 72 on the STM32WB10xx/15xx bootloader.

Best Regards,

Pierre

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
CocoAuthorBest answer
Associate III
October 9, 2023

Hello Pierre, thanks for you answer and I had already read this application note.
In the meantime, I was able to resolve my issue by running the code below.

 

void goto_system_memory_bootloader() {
	/* Unlock the FLASH control register access */
	HAL_FLASH_Unlock();
	/* Unlocks the option bytes block access */
	HAL_FLASH_OB_Unlock();

	FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

	FLASH_OBProgramInitTypeDef OBInitStruct;

	HAL_FLASHEx_OBGetConfig(&OBInitStruct);

	OBInitStruct.OptionType = OPTIONBYTE_USER;
	OBInitStruct.UserType = OB_USER_nSWBOOT0;

	CLEAR_BIT(OBInitStruct.UserConfig, FLASH_OPTR_nSWBOOT0);
	SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

	/* Unlock the FLASH control register access */
	HAL_FLASH_Unlock();

	/* Unlock the option bytes block access */
	HAL_FLASH_OB_Unlock();

	HAL_FLASHEx_OBProgram(&OBInitStruct);

	FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

	/* 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();
}