Skip to main content
Graduate
October 19, 2024
Solved

STM32F4X UF2 USER_VECT_TAB_ADDRESS, App not starting

  • October 19, 2024
  • 7 replies
  • 2989 views

Hello, 

I continue my journey toward build a STM32 hardware emulator for the famous Apple II Disk II. 

I am implementing UF2 firmware management, USB drag & drag update. 

the new firmware is not starting, even if I see log of tinyuf2 passing to the app

and I do not understand why 

I put the boot loader (tinyuf2) and I changed :

- system_stm32f4xx.c and I add 

#define USER_VECT_TAB_ADDRESS
#define VECT_TAB_OFFSET 0x00010000U
 
I also changed : 
STM32F411CEUx_FLASH.ld with 

 

/*
******************************************************************************
**
** @file : LinkerScript.ld
**
** @author : Auto-generated by STM32CubeIDE
**
** @brief : Linker script for STM32F411CEUx Device from STM32F4 series
** 512Kbytes FLASH
** 128Kbytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed as is, without any warranty
** of any kind.
**
******************************************************************************
** @attention
**
** Copyright (c) 2023 STMicroelectronics.
** All rights reserved.
**
** This software is licensed under terms that can be found in the LICENSE file
** in the root directory of this software component.
** If no LICENSE file comes with this software, it is provided AS-IS.
**
******************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Memories definition */
MEMORY
{
 RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
 FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 448K
}

/* Sections */
SECTIONS
{
 /* The startup code into "FLASH" Rom type memory */
 .isr_vector :
 {
 . = ALIGN(4);
 KEEP(*(.isr_vector)) /* Startup code */
 . = ALIGN(4);
 } >FLASH

 /* The program code and other data into "FLASH" Rom type memory */
 .text :
 {
 . = ALIGN(4);
 *(.text) /* .text sections (code) */
 *(.text*) /* .text* sections (code) */
 *(.glue_7) /* glue arm to thumb code */
 *(.glue_7t) /* glue thumb to arm code */
 *(.eh_frame)

 KEEP (*(.init))
 KEEP (*(.fini))

 . = ALIGN(4);
 _etext = .; /* define a global symbols at end of code */
 } >FLASH

 /* Constant data into "FLASH" Rom type memory */
 .rodata :
 {
 . = ALIGN(4);
 *(.rodata) /* .rodata sections (constants, strings, etc.) */
 *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
 . = ALIGN(4);
 } >FLASH

 .ARM.extab : {
 . = ALIGN(4);
 *(.ARM.extab* .gnu.linkonce.armextab.*)
 . = ALIGN(4);
 } >FLASH

 .ARM : {
 . = ALIGN(4);
 __exidx_start = .;
 *(.ARM.exidx*)
 __exidx_end = .;
 . = ALIGN(4);
 } >FLASH

 .preinit_array :
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__preinit_array_start = .);
 KEEP (*(.preinit_array*))
 PROVIDE_HIDDEN (__preinit_array_end = .);
 . = ALIGN(4);
 } >FLASH

 .init_array :
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__init_array_start = .);
 KEEP (*(SORT(.init_array.*)))
 KEEP (*(.init_array*))
 PROVIDE_HIDDEN (__init_array_end = .);
 . = ALIGN(4);
 } >FLASH

 .fini_array :
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__fini_array_start = .);
 KEEP (*(SORT(.fini_array.*)))
 KEEP (*(.fini_array*))
 PROVIDE_HIDDEN (__fini_array_end = .);
 . = ALIGN(4);
 } >FLASH

 /* Used by the startup to initialize data */
 _sidata = LOADADDR(.data);

 /* Initialized data sections into "RAM" Ram type memory */
 .data :
 {
 . = ALIGN(4);
 _sdata = .; /* create a global symbol at data start */
 *(.data) /* .data sections */
 *(.data*) /* .data* sections */
 *(.RamFunc) /* .RamFunc sections */
 *(.RamFunc*) /* .RamFunc* sections */

 . = ALIGN(4);
 _edata = .; /* define a global symbol at data end */

 } >RAM AT> FLASH

 /* Uninitialized data section into "RAM" Ram type memory */
 . = ALIGN(4);
 .bss :
 {
 /* This is used by the startup in order to initialize the .bss section */
 _sbss = .; /* define a global symbol at bss start */
 __bss_start__ = _sbss;
 *(.bss)
 *(.bss*)
 *(COMMON)

 . = ALIGN(4);
 _ebss = .; /* define a global symbol at bss end */
 __bss_end__ = _ebss;
 } >RAM

 /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */
 ._user_heap_stack :
 {
 . = ALIGN(8);
 PROVIDE ( end = . );
 PROVIDE ( _end = . );
 . = . + _Min_Heap_Size;
 . = . + _Min_Stack_Size;
 . = ALIGN(8);
 } >RAM

 /* Remove information from the compiler libraries */
 /DISCARD/ :
 {
 libc.a ( * )
 libm.a ( * )
 libgcc.a ( * )
 }

 .ARM.attributes 0 : { *(.ARM.attributes) }
}

 

 

What can I do to figure out where is the issue ?

thanks 

Vincent 

    This topic has been closed for replies.
    Best answer by vbesson

    Hello Jan, 

    Ok I found this issue, the jump is correctly made, but the app is crashing at 

    SystemClock_Config()
    I assume the bootloader is configuring the systemclock... 
    Is there a way to deinit and reinit in the app ? 
    Vincent
     

    7 replies

    vbessonAuthor
    Graduate
    October 21, 2024

    I further investigate the issue and I have to admit that I am really stuck and I have tried many things.

    the bootloader is working fine and launching an Arduino simple pin C13 blinking app.

    I have written a small app that is doing the same but with vscode makefile...

    the app is working when upload and starting at 0x08000000U

     

    Now I want it to start with the UF2 bootloader so I defined the 

    USER_VECT_TAB_ADDRESS in the make file 
    I changed system_stm32f4xx.c: 
    #define VECT_TAB_OFFSET 0x00010000U
    and I also changed STM32F411CEUx_FLASH.ld with the above post
     
    but it does not start....
    please help ;) thanks 
    Vincent
     
     
     
    Graduate
    October 21, 2024

    Don't change the VECT_TAB_OFFSET - it's relative to the app base set in the linker script file, so it should stay at 0.

    My recommendation is to remove the VTOR setting from system_... file and set the VTOR in the bootloader just before starting the app, as shown in some recent topics of bootloader problems.

    vbessonAuthor
    Graduate
    October 21, 2024

    Ok, 

    so commented line in system_stm32f4xx.c

     

    #if defined(USER_VECT_TAB_ADDRESS)
    // SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
    #endif /* USER_VECT_TAB_ADDRESS */

     

    I changed back to 

     

    #if defined(USER_VECT_TAB_ADDRESS)
    /*!< Uncomment the following line if you need to relocate your vector Table
     in Sram else user remap will be done in Flash. */
    /* #define VECT_TAB_SRAM */
    #if defined(VECT_TAB_SRAM)
    #define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field.
     This value must be a multiple of 0x200. */
    #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
     This value must be a multiple of 0x200. */
    #else
    #define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field.
     This value must be a multiple of 0x200. */
    #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
     This value must be a multiple of 0x200. */
    #endif /* VECT_TAB_SRAM */
    #endif /* USER_VECT_TAB_ADDRESS */

     

    my LD file has 

     

    MEMORY
    {
     RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
     BOOT_FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 16K
     EEPROM_EMUL(xrw) : ORIGIN = 0x8014000, LENGTH = 16K
     FLASH (rx) : ORIGIN = 0x8018000, LENGTH = 512K - 16K - 16K
    }
    
    _EEPROM_Emul_Start = ORIGIN(EEPROM_EMUL);
    _EEPROM_Emul_Sector = 1;
    
    /* Sections */
    SECTIONS
    {
     /* The startup code into "FLASH" Rom type memory */
     .isr_vector :
     {
     . = ALIGN(4);
     KEEP(*(.isr_vector)) /* Startup code */
     . = ALIGN(4);
     } >BOOT_FLASH

     

     

    My boot loader (tinyUF2) jump with 

     

    SCB->VTOR = (uint32_t) 0x08010000;
     // Set stack pointer
     __set_MSP(sp);
     __set_PSP(sp);
    
     // Jump to Application Entry
     //asm("bx %0" ::"r"(app_entry));
     asm("bx %0" ::"r"(0x08010000));

     

    but still the app is not starting...

    Vincent

    vbessonAuthor
    Graduate
    October 21, 2024

    I have checked that I have the firmware successfully in the flash at address 0x08010000. 

    But the firmware app refuse to start.

    How can I solve this ? 

    Thanks 

    Vincent 

     

    Super User
    October 21, 2024

    Using debugger find out where does the program run (where is PC).

    JW

    vbessonAuthorAnswer
    Graduate
    October 21, 2024

    Hello Jan, 

    Ok I found this issue, the jump is correctly made, but the app is crashing at 

    SystemClock_Config()
    I assume the bootloader is configuring the systemclock... 
    Is there a way to deinit and reinit in the app ? 
    Vincent
     
    vbessonAuthor
    Graduate
    October 21, 2024

    inside SystemClock_Config()

    call to

    HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
     
    and inside this function at the very end 
    there is a check line 550 stm32f4xx_hal_rcc.c :

     

     if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) ||
     (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
     (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) ||
     (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) ||
     (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) ||
     (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)))
    #endif /* RCC_PLLCFGR_PLLR */
     {
     return HAL_ERROR;
     }

     

    This is what is causing the error...
    and I think it is 
    RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF where PLLState=2 and RCC_PLL_OFF==1
    Any clue on how I can avoid having this error please
    and by the way I would like to understand what is happening 
    ;)
    Vincent
     
     
    Graduate II
    October 21, 2024

    You'd need to inter-stage, where you call the configuration, say enabling HSI, and MCU clocking, and then call a second time to switch back to the PLL with a new setting.

    If the loader's already set clocks optimally for the board, no point in tearing down and redoing.

    Perhaps test/check the mode and run code accordingly?

    vbessonAuthor
    Graduate
    October 21, 2024

    I do not get what you mean by inter-stage ? 

    I would use only one clock config function in the bootloader ?

     

    Vincent

     

     

    Super User
    October 21, 2024

    Maybe there is some RCC "deinit" function, I don't know, I don't use Cube/HAL.

    JW