STM32U595 bootloader resets when no peripheral is connected
Here is my main and jump to bootloader :
int main(void)
{
HAL_Init();
SystemPower_Config();
SystemClock_Config();
HAL_Delay(500); // Catch bootloader constantly resetting
jump_to_bootloader();
while (1)
{
HAL_Delay(50);
}
}
#define BOOTLOADER_ADDR (0x0BF90000UL)
HAL_StatusTypeDef jump_to_bootloader(void)
{
__disable_irq();
HAL_RCC_DeInit(); // Must be run before disabling systick because it depends on it
HAL_DeInit();
SysTick->CTRL = 0U; // Disable systick
SysTick->LOAD = 0U;
SysTick->VAL = 0U;
int count = sizeof(NVIC->ICER)/sizeof(NVIC->ICER[0]);
for (int i = 0; i < count; i++)
{ // Clear pending interrupts
NVIC->ICER[i]=0xFFFFFFFFUL;
NVIC->ICPR[i]=0xFFFFFFFFUL;
}
void (*jump_to_bootloader_fptr)(void);
jump_to_bootloader_fptr = (void (*)(void)) (*((uint32_t *) ((BOOTLOADER_ADDR + 4))));
__enable_irq();
__set_MSP(*(uint32_t *)BOOTLOADER_ADDR);
jump_to_bootloader_fptr();
return HAL_ERROR; // Should never get there because of jump
}
When manually debugging using gdb, when breaking at jump_to_bootloader_fptr(); , I use step instruction to step into the code, I can see that the addresses of instructions being executed are in the bootloader’s address range.
Here’s some gdb debugging output :
Breakpoint 3, jump_to_bootloader () at /home/src/bsp/bsp_bootloader.c:53
53 jump_to_bootloader_fptr();
(gdb) si
0x08000636 53 jump_to_bootloader_fptr();
(gdb) si
0x0bf98c38 in ?? ()
(gdb)
0x0bf98c3a in ?? ()
(gdb)
0x0bf98a10 in ?? ()
(gdb)
0x0bf98a12 in ?? ()
I can execute ‘stepi’ (step instructions) for a long time and it will stay in the bootloader’s address range.
But when I execute 'continue' command, the program restarts at the user code's address range.
0x0bf90cf6 in ?? ()
(gdb)
0x0bf90cee in ?? ()
(gdb) c
Continuing.
Breakpoint 1, main () at /home/src/main.c:36
36 HAL_Init();So it means that the bootloader resets after some condition is met. However, reading Figure 125 of AN2606, the bootloader should be 'stuck' in a loop of checking for peripheral detection and should not reset.
My option bytes : TZEN=0, nSWBOOT0=0 nBOOT0=1
So my question : is it expected that the bootloader resets when no peripheral is connected, or is there something wrong with my setup ?
