Skip to main content
Lo�c Bouilly
Associate II
April 19, 2017
Solved

[STM32L476RG] Jump to Bootloader from Software.

  • April 19, 2017
  • 14 replies
  • 5696 views
Posted on April 19, 2017 at 09:27

Hello,

I want to use DFU for update my program on the STM32L476RG. I use a personnal board. When I put BOOT0 to VCC, the Bootloader start and we can change the firmware but my system is on battery and I have no access to BOOT0 pin and RESET.

So I want to jump in bootloader directly from software for that I have search the start addresse of system memory of the MCU -> 0x1FFF0000. So this is my code :

#define USBD_DFU_APP_DEFAULT_ADD 0x1FFF0000
pFunction JumpToApplication;
uint32_t JumpAddress;
/***
 **** some code HERE 
***/
HAL_RCC_DeInit();
HAL_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
 
//_HAL_REMAPMEMORY_SYSTEMFLASH();
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
JumpToApplication = (pFunction) JumpAddress;
 
/**
* Step: Disable all interrupts
*/
__disable_irq();
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
 
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD);
JumpToApplication(); �?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

When I use this code the system reset but not in DFU mode. What I have miss for do a good reset DFU ?

I have try theUSBD_DFU_APP_DEFAULT_ADD to 0x00000000 no change.

Thanks,

Loïc

    This topic has been closed for replies.
    Best answer by Lo�c Bouilly
    Posted on April 24, 2017 at 11:52

    Thanks

    and

    !! Finally I find the solution for jump to bootloader !

    Yes it's the barriers the solution.

    This is my finally code, I hope it will help someone else :

    typedef void (*pFunction)(void);pFunction JumpToApplication;uint32_t JumpAddress;HAL_RCC_DeInit();SysTick->CTRL = 0;SysTick->LOAD = 0;SysTick->VAL = 0;/** * Step: Disable all interrupts */__disable_irq();/* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/__DSB();__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();/* Remap is bot visible at once. Execute some unrelated command! */__DSB();__ISB();JumpToApplication = (void (*)(void)) (*((uint32_t *)(0x1FFF0000 + 4)));/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) 0x1FFF0000);JumpToApplication();�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

    Thanks again !

    Loïc

    14 replies

    Uwe Bonnes
    Chief
    April 19, 2017
    Posted on April 19, 2017 at 10:39

    Probably you miss to set VTOR to point to system flash

    Another way to enter system bootloader is early in the initialization to set SYSCFG_RMPR to system flash and do a vector reset. This saves you from knowing the the device specific flash values, like entry address, VTOR and such.

    Lo�c Bouilly
    Associate II
    April 19, 2017
    Posted on April 19, 2017 at 11:07

    Thanks for your return. 

    For the VTOR is SCB->VTOR to set to 0x1FFF0000 ? Because when I try this is still reset indefinitely. 

    When you said 

    SYSCFG_RMPR set is the SYSCFG->MEMRMP and MEM_MODE to 1 for set 0x0000

    0000 to system flash ? I try this but the system still reset on User Flash. 

     
    Uwe Bonnes
    Chief
    April 19, 2017
    Posted on April 19, 2017 at 11:58

    Here is what I do to enter the bootloader on f4_discovery:

    void platform_init(void)

    {

    volatile uint32_t *magic = (uint32_t *) &_ebss;

    if ((magic[0] == BOOTMAGIC0) && (magic[1] == BOOTMAGIC1)) {

        magic[0] = 0;

        magic[1] = 0;

        /*As we just come out of reset, no other deinit is needed!*/

        rcc_periph_clock_enable(RCC_SYSCFG);

        SYSCFG_MEMRM &= ~3;

       SYSCFG_MEMRM |= 1;

       SCB_AIRCR = SCB_AIRCR_VECTKEY | SCB_AIRCR_VECTRESET;

       while(1);

    }
    martinj3456
    Associate III
    April 20, 2017
    Posted on April 20, 2017 at 06:57

    I guess, this post will help you with L476.

    https://community.st.com/0D50X00009XkemvSAB

     

    Enter DFU mode by commands like that:

    *Bootloader_Ram_Key_Address = Bootloader_Key_Value; // Write a key to a RAM location to check at next reset

     NVIC_SystemReset();    // System reset
    Uwe Bonnes
    Chief
    April 20, 2017
    Posted on April 20, 2017 at 12:46

     ,

     ,

    After much fiddling, follwing sequence gets me into the system bootloader just after reset:

     , void (*bootloader) (void),

     ,

     , uint32_t msp,

     ,

     , /* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/

     ,

     , __DSB(),

     ,

     , ♯ if (SYSCFG_CFGR1_MEM_MODE_0)

     ,

     ,/* Map system flash at address 0 so that our interrupts in bootloader get active */

     ,

     , SYSCFG->,CFGR1 = SYSCFG_CFGR1_MEM_MODE_0,

     ,

     , ♯ else

     ,

     , SYSCFG->,MEMRMP = SYSCFG_MEMRMP_MEM_MODE_0,

     ,

     , ♯ endif

     ,

     , /* Remap is bot visible at once. Execute some unrelated command! */

     ,

     , __DSB(),

     ,

     , __ISB(),

     ,

     , msp = *(uint32_t *)0,

     ,

     , bootloader = (void (*)(void))*(uint32_t *)4,

     ,

     , __set_MSP(msp),

     ,

     , /* Jump to bootloader */

     ,

     , bootloader(),

     ,

     , while(1),
    Lubos Medovarsky
    Associate II
    April 20, 2017
    Uwe Bonnes
    Chief
    April 20, 2017
    Posted on April 20, 2017 at 15:25

    Without the barriers it does not work on L4!

    Lo�c Bouilly
    Lo�c BouillyAuthorBest answer
    Associate II
    April 24, 2017
    Posted on April 24, 2017 at 11:52

    Thanks

    and

    !! Finally I find the solution for jump to bootloader !

    Yes it's the barriers the solution.

    This is my finally code, I hope it will help someone else :

    typedef void (*pFunction)(void);pFunction JumpToApplication;uint32_t JumpAddress;HAL_RCC_DeInit();SysTick->CTRL = 0;SysTick->LOAD = 0;SysTick->VAL = 0;/** * Step: Disable all interrupts */__disable_irq();/* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/__DSB();__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();/* Remap is bot visible at once. Execute some unrelated command! */__DSB();__ISB();JumpToApplication = (void (*)(void)) (*((uint32_t *)(0x1FFF0000 + 4)));/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) 0x1FFF0000);JumpToApplication();�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

    Thanks again !

    Loïc

    Steve Krattiger
    Associate II
    April 26, 2017
    Posted on April 26, 2017 at 20:54

    Very helpful!  I've been dealing with HardFault's for days now.   This was the key.

    Thank you!

    - SteveK

    sashaufa3
    Associate
    October 19, 2017
    Posted on October 19, 2017 at 13:32

    Hi.

    I use this code, but have HardFault ((

    Please show your code!