Boot0/1 pins are sampled only when the processor starts, in order to
check if it should load the user code from memory or if it should load the
The state of these pins has no effect of the bootloader afterwards.
I've been faced to a similar request, and found 2 ways to load the
First, you can "JUMP" from user-code to the bootloader. For example, you
could jump to the bootloader when a button is pressed.
But... this is far more complicated than a simple JUMP instruction :
some registers and devices must be reconfigured correctly to work with the
bootloader, you have to ensure that no IRQ will be triggered during the
JUMP,... In fact, you have to reconfigure the processor as if it was just
started after reset.
You can find some information about this technic : on this video from
I managed to do this kind of things on STM32F1xx project.
However, on a more complex project based on STM32F4, this would become
really difficult... I would have to stop all devices (timers, communication
interface, ADC, DAC,...), ensure that no IRQ would be triggered,
reconfigure all the clocks,...
Instead, I decided to implement this second solution: When I want to
jump to the bootloader, I write a byte in one of the backup register and
then issue a soft-reset. Then, when the processor will restart, at the very
beginning of the program, it will read this register. This register
contains the value indicating that it should reboot in bootloader mode.
Then, the jump to the bootloader is much easier, as presented in the youtube