Skip to main content
Visitor II
January 3, 2022
Question

SMT32H743 - How do I exit the bootloader using the GO command?

  • January 3, 2022
  • 3 replies
  • 2156 views

To enter the system bootloader, we call the following function:

void BootloadCommandHandler(void)

{

  // Set BOOT0 to boot to ROM bootloader

  HAL_SYSCFG_CM7BootAddConfig(SYSCFG_BOOT_ADDR0, 0x1FF00000);

  // Reset CPU

  NVIC_SystemReset();

}

This works just fine and we can bootload the new image. However, when I then jump to 0x0800000 with the GO command, it resets directly back into the bootloader since SYSCFG_BOOT_ADDR0 is still set to the new value of 0x1FF00000; I can confirm this by running the PC side bootloader again. It connects and downloads the new image, confirming that we are still in the bootloader. If I power cycle the board, everything goes back to normal and we are all set. However, we don't want to have to instruct the user to power cycle the device after a remote bootload. Is there any way out of this? Can I call some piece of code that will set SYSCFG_BOOT_ADDR0 back to 0x08000000 and then call another reset?

Thanks,

Jamie

    This topic has been closed for replies.

    3 replies

    JMill.1Author
    Visitor II
    January 3, 2022

    I have also tried jumping directly to the bootloader based on many online examples, but this results in a Hard Fault every time. If I could get this to work, I wouldn't have to alter the ADDR0 register and I think the GO command would reset as expected:

      

    volatile uint32_t addr = 0x1FF00000;

    HAL_RCC_DeInit();

    SysTick->CTRL = 0;

    SysTick->LOAD = 0;

    SysTick->VAL = 0;

    __disable_irq();

    __set_MSP(*(__IO uint32_t*)addr);

    SysMemBootJump = (void (*)(void)) (*((uint32_t *) (addr + 4)));

    SysMemBootJump();

    Graduate II
    January 3, 2022

    When your go to app command reset your mcu something is bad.

    Second question is if you use SYSCFG_BOOT_ADDR0 and your app do reset, then ofcourse is started bootloader back. Here i see more ways, first your app after start write right SYSCFG_BOOT_ADDR0 or better you start bootloader other way, i use normal jump to system loader without NVIC Reset directly from app.

    JMill.1Author
    Visitor II
    January 3, 2022

    Can you provide an example of jumping directly to the bootloader? I posted my code attempt at doing this above and it results in a Hard Fault every time.

    Graduate II
    January 3, 2022

    Every MCU have own start addr and you use bad

    0693W00000HqRWLQA3.pngstart address is 0x1FF09800

    Super User
    January 3, 2022

    > Can you provide an example of jumping directly to the bootloader? 

    https://community.st.com/s/article/STM32H7-bootloader-jump-from-application

    > I posted my code attempt at doing this above and it results in a Hard Fault every time.

    So debug the hard fault. Find out what it's objecting to and go from there.

    JMill.1Author
    Visitor II
    January 3, 2022

    Thanks for the link. That worked to get my program to jump directly to the bootloader. But now I send the GO command and I'm still in the bootloader. I am trying to jump to 0x0801408c per the disassembly, but nothing happens. I confirmed that the GO command is being ACK'd.

    0693W00000HqReFQAV.png 

    EDIT - It seems like the debugger was messing with the operation somehow. When I program and disconnect before invoking the bootloader, then jump to this reset address, everything works fine. Thanks for the help!