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 bootloader.
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 bootloader on-demand.
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 ST.
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 video.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…