Для теста, что-то в этом роде должно работать:
void jumpToBootloader(void) { // Due to bootloder banks check // Erase bank1 start address // Erase bank2 start address __disable_irq(); HAL_RCC_DeInit(); HAL_DeInit(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); SCB->VTOR = 0x1FF00000; __enable_irq(); __set_MSP(*(__IO uint32_t*)0x1FF00000); (*(__IO uint32_t*)0x1FF00004)(); while(1); }
ну вообщем нет!
происходит перезагрузка и исполняется прошивка из банка 1.
вот кстати что там писали
Thanks for your help. I have my answer !
The v4.0 bootloader (initial version) does not implement the dual bank mechanism but this feature is supported by v4.1.
Software can jump to bootloader but it will execute the dual boot mechanism. So the bootloader goes back to bank1 (or bank2 if a code is "valid").
Today it is not possible to bypass the dual bank mechanism to execute the bootloader with my configuration: The boot0 pin is reset and the protection level is 0 (see "Table 11. Boot pin and BFB2 bit configuration" in the reference manual).
ладно, спасибо за помощь, я в принципе аппаратно этот вопрос решил, но хотелось красоты))
на F401/411 камне работает без проблем.
происходит перезагрузка и исполняется прошивка из банка 1.
Так там где я коммент написал надо очистить стартовые адреса из памяти, то есть она уже не сможет выполняться оттуда.