Skip to main content
Visitor II
July 1, 2022
Question

jump to bootloader.

  • July 1, 2022
  • 3 replies
  • 1117 views

I wonder the jump to defauld bootloader with a software way. is it possible??

    This topic has been closed for replies.

    3 replies

    Graduate II
    July 1, 2022

    >>Is it possible??

    Depends on the STM32, but yes generally possible, the MCU has control-transfer methods as part of it's basic operation.

    The Vector Table is a list of addresses, you can use function pointers.

    Snm.1Author
    Visitor II
    July 1, 2022

    hello, I will use stm32l052. but there are very few resource. I wounder do you have any idea aboud this topic :)).

    Graduate II
    July 1, 2022

    Try search first ...

    Snm.1Author
    Visitor II
    July 1, 2022

    I didn't found, therefore i ask.

    Graduate II
    July 1, 2022

    0693W00000QKH3fQAH.png

    Graduate II
    July 1, 2022

    One example address and info search in AN2606

    /**
     * Function to perform jump to system memory boot from user application
     *
     * Call function when you want to jump to system memory
     */
    void JumpToBootloader(void) {
    	void (*SysMemBootJump)(void);
     
    	NVIC_InitTypeDef NVIC_InitStructure;
     
    	/**
    	 * Step: Set system memory address. 
    	 * 
    	 * For other families, check AN2606 document table 110 with descriptions of memory addresses 
    	 */
    	volatile uint32_t addr = 0x1FFFEC00; //0x1FFF0000;
     
     	
    	/**
    	 * Step: Disable RCC, set it to default (after reset) settings
    	 * Internal clock, no PLL, etc.
    	 */
    #if defined(USE_HAL_DRIVER)
    	HAL_RCC_DeInit();
    #endif /* defined(USE_HAL_DRIVER) */
    #if defined(USE_STDPERIPH_DRIVER)
    	RCC_DeInit();
    #endif /* defined(USE_STDPERIPH_DRIVER) */
    	
    	/**
    	 * Step: Disable systick timer and reset it to default values
    	 */
    	SysTick->CTRL = 0;
    	SysTick->LOAD = 0;
    	SysTick->VAL = 0;
     
    	/**
    	 * Step: Disable all interrupts
    	 */
    	__disable_irq();
    	
    	/**
    	 * Step: Remap system memory to address 0x0000 0000 in address space
    	 * For each family registers may be different. 
    	 * Check reference manual for each family.
    	 *
    	 * For STM32F4xx, MEMRMP register in SYSCFG is used (bits[1:0])
    	 * For STM32F0xx, CFGR1 register in SYSCFG is used (bits[1:0])
    	 * For others, check family reference manual
    	 */
    	//Remap by hand... {
    #if defined(STM32F4)
    	SYSCFG->MEMRMP = 0x01;
    #endif
    //#if defined(STM32F0)
    	SYSCFG->CFGR1 = 0x01;
    //#endif
    	//} ...or if you use HAL drivers
    	//__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();	//Call HAL macro to do this for you
    	
    	/**
    	 * Step: Set jump memory location for system memory
    	 * Use address with 4 bytes offset which specifies jump location where program starts
    	 */
    	SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
     
    /**
    	 * Step: Set main stack pointer.
    	 * This step must be done last otherwise local variables in this function
    	 * don't have proper value since stack pointer is located on different position
    	 *
    	 * Set direct address location which specifies stack pointer in SRAM location
    	 */
    	__set_MSP(*(uint32_t *)addr);
    	/**
    	 * Step: Actually call our function to jump to set location
    	 * This will start system memory execution
    	 */
    	SysMemBootJump();
    	
    	/**
    	 * Step: Connect USB<->UART converter to dedicated USART pins and test
    	 * and test with bootloader works with STM32 Flash Loader Demonstrator software
    	 */
    }