cancel
Showing results for 
Search instead for 
Did you mean: 

Custom linker file for bootloader stm32f429

SGasp.1
Senior

Hi amazing community..

I have developed a custom linker file for stm32f429. 

Here there is my costum linker file  

 

/*
******************************************************************************
**
** @file        : LinkerScript.ld
**
** @author      : Auto-generated by STM32CubeIDE
**
** @brief       : Linker script for STM32F429ZITx Device from STM32F4 series
**                      2048Kbytes FLASH
**                      64Kbytes CCMRAM
**                      192Kbytes 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 = 0x400; /* required amount of heap */
_Min_Stack_Size = 0x800; /* required amount of stack */

_BOOTLDR_OFFSET = 0x00000000;
_APP_START_OFFSET = 0x00010000;
_APP_HEADER_OFFSET = 0x00010000; 

/* Memories definition */
MEMORY
{
  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 192K-4
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K
}

/* Sections */
SECTIONS
{
  /* The bootloader code into "FLASH" Rom type memory */
  .bootloader_section :
  {
    . = ALIGN(4);
    _bl_fw_start = .;
    KEEP(*(.bootloader_section)) /* Bootloader */
    . = ALIGN(4);
  } > FLASH

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

  .app_header :
  {
    . = _bl_fw_start + _APP_START_OFFSET + _APP_HEADER_OFFSET;
    KEEP(*(.app_header)) /* Bootloader Header */
    . = 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

  _siccmram = LOADADDR(.ccmram);

  /* CCM-RAM section
  *
  * IMPORTANT NOTE!
  * If initialized variables will be placed in this section,
  * the startup code needs to be modified to copy the init-values.
  */
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM 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
  
.app_trailer :
{
    . = ALIGN(16);
    _app_trailer = .;
    KEEP(*(.app_trailer)) /* Application Trailer */
    . = ALIGN(4);
    _app_fw_end = .;
} >FLASH

_app_fw_size = _app_fw_end - _app_fw_start;


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

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

 

When i debug the application the code is running but the ISR are not working. 

Here there is the memory map 

SGasp1_0-1715950755530.png

 

The idea is to have 64kb for the botloader and the rest for the application. 

The starting point of the application it  should be at address 0x08010000

 

as usual in the main function i do this .. 

 

SGasp1_1-1715950903795.png

Can you please tell me if you see something strange on the setting of the ISR table ? 

 

Thanks a lot

 

18 REPLIES 18

Vector tables generally need 512-byte alignment, depends on interrupts implemented in NVIC.

You're approach is broken.

Define different/distinct MEMORY regions so it places the vectors at the right addresses.

Direct content and sparseness that way

/* Memories definition */
MEMORY
{

LOADER (rx) : ORIGIN = 0x8000000, LENGTH = 64K

FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 2048K-64K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K-4
}

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
SGasp.1
Senior

Hi @Tesla DeLorean .

Thanks for the help

With the changes you wrote and kepping the rest of the linker it should work?

Do I need to do other changes ?

Thanks a lot

Radosław
Senior II

From your linker script, i need to tell you,

You don't now what you are doing.

Maybe you little missunderstand. Simple way is: Bootloader project no change load to 800000 maybe size to 64
app project change ld flash section start and size and in core src file system_stm32f4xx.c set

#define VECT_TAB_OFFSET .....

  in main no VTOR required.

SGasp.1
Senior

Thanks @MM..1 

 

Can you explain better what to here and how..

project change ld flash section start and size and in core src file system_stm32f4xx.c set 

I mean I need more details to change the linker .

Thanks a lot for understanding

Normal way is separate project 

1.Create APP in MX

test it on normal boot place.

2.Create BOOTLDR in MX 

3. Modify APP ld file only line 

FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 2048K-64K

 modify APP system_stm32f4xx.c

...

SGasp.1
Senior

Hi @MM..1  .. 

Thanks .. But i need to know what part of the linker file i can keeep.. 

Is it enough to remove just the bootloader_section?

Thanks

Radosław
Senior II

Bootloader should have standard linker file - only flash should be decresead.

 

Aplication linker shoud have only FLASH start adress and size changed,.

 

Hi @Radosław 

 

I agree with you.

But i would to keep some regions in flash for defining some headers.. so i would like 

to keep something in the linker for example

 

__attribute__((section(".app_header"))) const volatile TAPPHeader app_header =

{

.APP_Header_Ver = APP_HEADER_VERS_00,

.APP_Id = VERSIONE_MC,

// free

.APP_Vers = FW_VERSION,

.APP_Start_Addr = (uint32_t)&_app_fw_start,

.APP_Size = (uint32_t)&_app_fw_size,

.APP_Trailer_Addr = (uint32_t)&_app_trailer,

.RAM_Param_Addr = RAM_IPC_START_ADDRESS,

.RAM_Param_Len = 4,

// free

}

__attribute__((section(".app_trailer"))) const volatile TAPPTrailer app_trailer =

{

.free[0] = 0x00,

.free[1] = 0x00,

.APP_CRC = (uint16_t)(('c'<<8) + 'k')

};

  .app_header :
  {
    . = _bl_fw_start + _APP_START_OFFSET + _APP_HEADER_OFFSET;
    KEEP(*(.app_header)) /* Bootloader Header */
    . = ALIGN(4);
  } > FLASH

the point is how to define the correct addresses for such regions.

I hope to be enough clear

 

Thanks