1*5c591343SA. Cody Schuffelen/* 2*5c591343SA. Cody Schuffelen***************************************************************************** 3*5c591343SA. Cody Schuffelen** 4*5c591343SA. Cody Schuffelen 5*5c591343SA. Cody Schuffelen** File : stm32_flash.ld 6*5c591343SA. Cody Schuffelen** 7*5c591343SA. Cody Schuffelen** Abstract : Linker script for STM32L476RG Device with 8*5c591343SA. Cody Schuffelen** 1024KByte FLASH, 128KByte RAM 9*5c591343SA. Cody Schuffelen** 10*5c591343SA. Cody Schuffelen** Set heap size, stack size and stack location according 11*5c591343SA. Cody Schuffelen** to application requirements. 12*5c591343SA. Cody Schuffelen** 13*5c591343SA. Cody Schuffelen** Set memory bank area and size if external memory is used. 14*5c591343SA. Cody Schuffelen** 15*5c591343SA. Cody Schuffelen** Target : STMicroelectronics STM32 16*5c591343SA. Cody Schuffelen** 17*5c591343SA. Cody Schuffelen** Environment : Atollic TrueSTUDIO(R) 18*5c591343SA. Cody Schuffelen** 19*5c591343SA. Cody Schuffelen** Distribution: The file is distributed as is, without any warranty 20*5c591343SA. Cody Schuffelen** of any kind. 21*5c591343SA. Cody Schuffelen** 22*5c591343SA. Cody Schuffelen** (c)Copyright Atollic AB. 23*5c591343SA. Cody Schuffelen** You may use this file as-is or modify it according to the needs of your 24*5c591343SA. Cody Schuffelen** project. This file may only be built (assembled or compiled and linked) 25*5c591343SA. Cody Schuffelen** using the Atollic TrueSTUDIO(R) product. The use of this file together 26*5c591343SA. Cody Schuffelen** with other tools than Atollic TrueSTUDIO(R) is not permitted. 27*5c591343SA. Cody Schuffelen** 28*5c591343SA. Cody Schuffelen***************************************************************************** 29*5c591343SA. Cody Schuffelen*/ 30*5c591343SA. Cody Schuffelen 31*5c591343SA. Cody Schuffelen/* Entry Point */ 32*5c591343SA. Cody SchuffelenENTRY(Reset_Handler) 33*5c591343SA. Cody Schuffelen 34*5c591343SA. Cody Schuffelen/* Highest address of the user mode stack */ 35*5c591343SA. Cody Schuffelen_estack = 0x20018000; /* end of RAM */ 36*5c591343SA. Cody Schuffelen/* Generate a link error if heap and stack don't fit into RAM */ 37*5c591343SA. Cody Schuffelen_Min_Heap_Size = 0x200; /* required amount of heap */ 38*5c591343SA. Cody Schuffelen_Min_Stack_Size = 0xf000; /* required amount of stack */ 39*5c591343SA. Cody Schuffelen 40*5c591343SA. Cody Schuffelen/* Specify the memory areas */ 41*5c591343SA. Cody SchuffelenMEMORY 42*5c591343SA. Cody Schuffelen{ 43*5c591343SA. Cody SchuffelenRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K 44*5c591343SA. Cody SchuffelenRAM2 (xrw) : ORIGIN = 0x10000000, LENGTH = 32K 45*5c591343SA. Cody SchuffelenFLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1006K 46*5c591343SA. Cody SchuffelenINTEGRITY (rx) : ORIGIN = 0x80FB800, LENGTH = 2K 47*5c591343SA. Cody SchuffelenNVFILE (rx) : ORIGIN = 0x80FC000, LENGTH = 16K 48*5c591343SA. Cody Schuffelen} 49*5c591343SA. Cody Schuffelen 50*5c591343SA. Cody Schuffelen/* Define output sections */ 51*5c591343SA. Cody SchuffelenSECTIONS 52*5c591343SA. Cody Schuffelen{ 53*5c591343SA. Cody Schuffelen /* The startup code goes first into FLASH */ 54*5c591343SA. Cody Schuffelen .isr_vector : 55*5c591343SA. Cody Schuffelen { 56*5c591343SA. Cody Schuffelen . = ALIGN(4); 57*5c591343SA. Cody Schuffelen KEEP(*(.isr_vector)) /* Startup code */ 58*5c591343SA. Cody Schuffelen . = ALIGN(4); 59*5c591343SA. Cody Schuffelen } >FLASH 60*5c591343SA. Cody Schuffelen 61*5c591343SA. Cody Schuffelen /* The program code and other data goes into FLASH */ 62*5c591343SA. Cody Schuffelen .text : 63*5c591343SA. Cody Schuffelen { 64*5c591343SA. Cody Schuffelen . = ALIGN(4); 65*5c591343SA. Cody Schuffelen *(.text) /* .text sections (code) */ 66*5c591343SA. Cody Schuffelen *(.text*) /* .text* sections (code) */ 67*5c591343SA. Cody Schuffelen *(.glue_7) /* glue arm to thumb code */ 68*5c591343SA. Cody Schuffelen *(.glue_7t) /* glue thumb to arm code */ 69*5c591343SA. Cody Schuffelen *(.eh_frame) 70*5c591343SA. Cody Schuffelen 71*5c591343SA. Cody Schuffelen KEEP (*(.init)) 72*5c591343SA. Cody Schuffelen KEEP (*(.fini)) 73*5c591343SA. Cody Schuffelen 74*5c591343SA. Cody Schuffelen . = ALIGN(4); 75*5c591343SA. Cody Schuffelen _etext = .; /* define a global symbols at end of code */ 76*5c591343SA. Cody Schuffelen } >FLASH 77*5c591343SA. Cody Schuffelen 78*5c591343SA. Cody Schuffelen /* Constant data goes into FLASH */ 79*5c591343SA. Cody Schuffelen .rodata : 80*5c591343SA. Cody Schuffelen { 81*5c591343SA. Cody Schuffelen . = ALIGN(4); 82*5c591343SA. Cody Schuffelen *(.rodata) /* .rodata sections (constants, strings, etc.) */ 83*5c591343SA. Cody Schuffelen *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ 84*5c591343SA. Cody Schuffelen . = ALIGN(4); 85*5c591343SA. Cody Schuffelen } >FLASH 86*5c591343SA. Cody Schuffelen 87*5c591343SA. Cody Schuffelen .integrity (NOLOAD): 88*5c591343SA. Cody Schuffelen { 89*5c591343SA. Cody Schuffelen . = ALIGN(4); 90*5c591343SA. Cody Schuffelen *(.integrity) /* .integrity internal integrity protection of NVFile */ 91*5c591343SA. Cody Schuffelen *(.integrity*) /* .integrity* internal integrity protection of NVFile */ 92*5c591343SA. Cody Schuffelen . = ALIGN(4); 93*5c591343SA. Cody Schuffelen } >INTEGRITY 94*5c591343SA. Cody Schuffelen 95*5c591343SA. Cody Schuffelen .nvfile (NOLOAD): 96*5c591343SA. Cody Schuffelen { 97*5c591343SA. Cody Schuffelen . = ALIGN(4); 98*5c591343SA. Cody Schuffelen *(.nvfile) /* .nvfile persisted NV storage for the TPM */ 99*5c591343SA. Cody Schuffelen *(.nvfile*) /* .nvfile* persisted NV storage for the TPM */ 100*5c591343SA. Cody Schuffelen . = ALIGN(4); 101*5c591343SA. Cody Schuffelen } >NVFILE 102*5c591343SA. Cody Schuffelen 103*5c591343SA. Cody Schuffelen .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH 104*5c591343SA. Cody Schuffelen .ARM : { 105*5c591343SA. Cody Schuffelen __exidx_start = .; 106*5c591343SA. Cody Schuffelen *(.ARM.exidx*) 107*5c591343SA. Cody Schuffelen __exidx_end = .; 108*5c591343SA. Cody Schuffelen } >FLASH 109*5c591343SA. Cody Schuffelen 110*5c591343SA. Cody Schuffelen .preinit_array : 111*5c591343SA. Cody Schuffelen { 112*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__preinit_array_start = .); 113*5c591343SA. Cody Schuffelen KEEP (*(.preinit_array*)) 114*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__preinit_array_end = .); 115*5c591343SA. Cody Schuffelen } >FLASH 116*5c591343SA. Cody Schuffelen .init_array : 117*5c591343SA. Cody Schuffelen { 118*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__init_array_start = .); 119*5c591343SA. Cody Schuffelen KEEP (*(SORT(.init_array.*))) 120*5c591343SA. Cody Schuffelen KEEP (*(.init_array*)) 121*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__init_array_end = .); 122*5c591343SA. Cody Schuffelen } >FLASH 123*5c591343SA. Cody Schuffelen .fini_array : 124*5c591343SA. Cody Schuffelen { 125*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__fini_array_start = .); 126*5c591343SA. Cody Schuffelen KEEP (*(SORT(.fini_array.*))) 127*5c591343SA. Cody Schuffelen KEEP (*(.fini_array*)) 128*5c591343SA. Cody Schuffelen PROVIDE_HIDDEN (__fini_array_end = .); 129*5c591343SA. Cody Schuffelen } >FLASH 130*5c591343SA. Cody Schuffelen 131*5c591343SA. Cody Schuffelen /* used by the startup to initialize data */ 132*5c591343SA. Cody Schuffelen _sidata = LOADADDR(.data); 133*5c591343SA. Cody Schuffelen 134*5c591343SA. Cody Schuffelen /* Initialized data sections goes into RAM, load LMA copy after code */ 135*5c591343SA. Cody Schuffelen .data : 136*5c591343SA. Cody Schuffelen { 137*5c591343SA. Cody Schuffelen . = ALIGN(4); 138*5c591343SA. Cody Schuffelen _sdata = .; /* create a global symbol at data start */ 139*5c591343SA. Cody Schuffelen *(.data) /* .data sections */ 140*5c591343SA. Cody Schuffelen *(.data*) /* .data* sections */ 141*5c591343SA. Cody Schuffelen 142*5c591343SA. Cody Schuffelen . = ALIGN(4); 143*5c591343SA. Cody Schuffelen _edata = .; /* define a global symbol at data end */ 144*5c591343SA. Cody Schuffelen } >RAM AT> FLASH 145*5c591343SA. Cody Schuffelen 146*5c591343SA. Cody Schuffelen 147*5c591343SA. Cody Schuffelen /* Uninitialized data section */ 148*5c591343SA. Cody Schuffelen . = ALIGN(4); 149*5c591343SA. Cody Schuffelen .bss2 : 150*5c591343SA. Cody Schuffelen { 151*5c591343SA. Cody Schuffelen . = ALIGN(4); 152*5c591343SA. Cody Schuffelen *(.ram2) 153*5c591343SA. Cody Schuffelen *(.ram2*) 154*5c591343SA. Cody Schuffelen Middlewares\Platform\Cancel.o 155*5c591343SA. Cody Schuffelen Middlewares\Platform\Clock.o 156*5c591343SA. Cody Schuffelen Middlewares\Platform\Entropy.o 157*5c591343SA. Cody Schuffelen/* Middlewares\Platform\LocalityPlat.o*/ 158*5c591343SA. Cody Schuffelen/* Middlewares\Platform\NVMem.o*/ 159*5c591343SA. Cody Schuffelen Middlewares\Platform\PlatformData.o 160*5c591343SA. Cody Schuffelen/* Middlewares\Platform\PowerPlat.o*/ 161*5c591343SA. Cody Schuffelen/* Middlewares\Platform\PPPlat.o*/ 162*5c591343SA. Cody Schuffelen/* Middlewares\Platform\RunCommand.o*/ 163*5c591343SA. Cody Schuffelen/* Middlewares\Platform\Unique.o*/ 164*5c591343SA. Cody Schuffelen . = ALIGN(4); 165*5c591343SA. Cody Schuffelen } >RAM2 166*5c591343SA. Cody Schuffelen .bss : 167*5c591343SA. Cody Schuffelen { 168*5c591343SA. Cody Schuffelen /* This is used by the startup in order to initialize the .bss secion */ 169*5c591343SA. Cody Schuffelen _sbss = .; /* define a global symbol at bss start */ 170*5c591343SA. Cody Schuffelen __bss_start__ = _sbss; 171*5c591343SA. Cody Schuffelen *(.bss) 172*5c591343SA. Cody Schuffelen *(.bss*) 173*5c591343SA. Cody Schuffelen *(COMMON) 174*5c591343SA. Cody Schuffelen 175*5c591343SA. Cody Schuffelen . = ALIGN(4); 176*5c591343SA. Cody Schuffelen _ebss = .; /* define a global symbol at bss end */ 177*5c591343SA. Cody Schuffelen __bss_end__ = _ebss; 178*5c591343SA. Cody Schuffelen } >RAM 179*5c591343SA. Cody Schuffelen 180*5c591343SA. Cody Schuffelen /* User_heap_stack section, used to check that there is enough RAM left */ 181*5c591343SA. Cody Schuffelen ._user_heap_stack : 182*5c591343SA. Cody Schuffelen { 183*5c591343SA. Cody Schuffelen . = ALIGN(4); 184*5c591343SA. Cody Schuffelen PROVIDE ( end = . ); 185*5c591343SA. Cody Schuffelen PROVIDE ( _end = . ); 186*5c591343SA. Cody Schuffelen . = . + _Min_Heap_Size; 187*5c591343SA. Cody Schuffelen . = . + _Min_Stack_Size; 188*5c591343SA. Cody Schuffelen . = ALIGN(4); 189*5c591343SA. Cody Schuffelen } >RAM 190*5c591343SA. Cody Schuffelen 191*5c591343SA. Cody Schuffelen 192*5c591343SA. Cody Schuffelen 193*5c591343SA. Cody Schuffelen /* Remove information from the standard libraries */ 194*5c591343SA. Cody Schuffelen /DISCARD/ : 195*5c591343SA. Cody Schuffelen { 196*5c591343SA. Cody Schuffelen libc.a ( * ) 197*5c591343SA. Cody Schuffelen libm.a ( * ) 198*5c591343SA. Cody Schuffelen libgcc.a ( * ) 199*5c591343SA. Cody Schuffelen } 200*5c591343SA. Cody Schuffelen 201*5c591343SA. Cody Schuffelen .ARM.attributes 0 : { *(.ARM.attributes) } 202*5c591343SA. Cody Schuffelen} 203*5c591343SA. Cody Schuffelen 204*5c591343SA. Cody Schuffelen 205