1*0561b2d8STREFOU Felix/** 2*0561b2d8STREFOU Felix***************************************************************************** 3*0561b2d8STREFOU Felix** 4*0561b2d8STREFOU Felix** File : stm32wb55xx_flash_cm4.ld 5*0561b2d8STREFOU Felix** 6*0561b2d8STREFOU Felix** Abstract : System Workbench Minimal System calls file 7*0561b2d8STREFOU Felix** 8*0561b2d8STREFOU Felix** For more information about which c-functions 9*0561b2d8STREFOU Felix** need which of these lowlevel functions 10*0561b2d8STREFOU Felix** please consult the Newlib libc-manual 11*0561b2d8STREFOU Felix** 12*0561b2d8STREFOU Felix** Environment : System Workbench for MCU 13*0561b2d8STREFOU Felix** 14*0561b2d8STREFOU Felix** Distribution: The file is distributed “as is,” without any warranty 15*0561b2d8STREFOU Felix** of any kind. 16*0561b2d8STREFOU Felix** 17*0561b2d8STREFOU Felix***************************************************************************** 18*0561b2d8STREFOU Felix** 19*0561b2d8STREFOU Felix** <h2><center>© COPYRIGHT(c) 2019 Ac6</center></h2> 20*0561b2d8STREFOU Felix** 21*0561b2d8STREFOU Felix** Redistribution and use in source and binary forms, with or without modification, 22*0561b2d8STREFOU Felix** are permitted provided that the following conditions are met: 23*0561b2d8STREFOU Felix** 1. Redistributions of source code must retain the above copyright notice, 24*0561b2d8STREFOU Felix** this list of conditions and the following disclaimer. 25*0561b2d8STREFOU Felix** 2. Redistributions in binary form must reproduce the above copyright notice, 26*0561b2d8STREFOU Felix** this list of conditions and the following disclaimer in the documentation 27*0561b2d8STREFOU Felix** and/or other materials provided with the distribution. 28*0561b2d8STREFOU Felix** 3. Neither the name of Ac6 nor the names of its contributors 29*0561b2d8STREFOU Felix** may be used to endorse or promote products derived from this software 30*0561b2d8STREFOU Felix** without specific prior written permission. 31*0561b2d8STREFOU Felix** 32*0561b2d8STREFOU Felix** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 33*0561b2d8STREFOU Felix** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34*0561b2d8STREFOU Felix** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 35*0561b2d8STREFOU Felix** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 36*0561b2d8STREFOU Felix** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37*0561b2d8STREFOU Felix** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 38*0561b2d8STREFOU Felix** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 39*0561b2d8STREFOU Felix** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 40*0561b2d8STREFOU Felix** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 41*0561b2d8STREFOU Felix** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42*0561b2d8STREFOU Felix** 43*0561b2d8STREFOU Felix***************************************************************************** 44*0561b2d8STREFOU Felix*/ 45*0561b2d8STREFOU Felix 46*0561b2d8STREFOU Felix/* Entry Point */ 47*0561b2d8STREFOU FelixENTRY(Reset_Handler) 48*0561b2d8STREFOU Felix 49*0561b2d8STREFOU Felix/* Highest address of the user mode stack */ 50*0561b2d8STREFOU Felix_estack = 0x20030000; /* end of RAM */ 51*0561b2d8STREFOU Felix/* Generate a link error if heap and stack don't fit into RAM */ 52*0561b2d8STREFOU Felix_Min_Heap_Size = 0x400; /* required amount of heap */ 53*0561b2d8STREFOU Felix_Min_Stack_Size = 0x1000; /* required amount of stack */ 54*0561b2d8STREFOU Felix 55*0561b2d8STREFOU Felix/* Specify the memory areas */ 56*0561b2d8STREFOU FelixMEMORY 57*0561b2d8STREFOU Felix{ 58*0561b2d8STREFOU FelixFLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K 59*0561b2d8STREFOU FelixRAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 191K 60*0561b2d8STREFOU FelixRAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K 61*0561b2d8STREFOU Felix} 62*0561b2d8STREFOU Felix 63*0561b2d8STREFOU Felix/* Define output sections */ 64*0561b2d8STREFOU FelixSECTIONS 65*0561b2d8STREFOU Felix{ 66*0561b2d8STREFOU Felix /* The startup code goes first into FLASH */ 67*0561b2d8STREFOU Felix .isr_vector : 68*0561b2d8STREFOU Felix { 69*0561b2d8STREFOU Felix . = ALIGN(4); 70*0561b2d8STREFOU Felix KEEP(*(.isr_vector)) /* Startup code */ 71*0561b2d8STREFOU Felix . = ALIGN(4); 72*0561b2d8STREFOU Felix } >FLASH 73*0561b2d8STREFOU Felix 74*0561b2d8STREFOU Felix /* The program code and other data goes into FLASH */ 75*0561b2d8STREFOU Felix .text : 76*0561b2d8STREFOU Felix { 77*0561b2d8STREFOU Felix . = ALIGN(4); 78*0561b2d8STREFOU Felix *(.text) /* .text sections (code) */ 79*0561b2d8STREFOU Felix *(.text*) /* .text* sections (code) */ 80*0561b2d8STREFOU Felix *(.glue_7) /* glue arm to thumb code */ 81*0561b2d8STREFOU Felix *(.glue_7t) /* glue thumb to arm code */ 82*0561b2d8STREFOU Felix *(.eh_frame) 83*0561b2d8STREFOU Felix 84*0561b2d8STREFOU Felix KEEP (*(.init)) 85*0561b2d8STREFOU Felix KEEP (*(.fini)) 86*0561b2d8STREFOU Felix 87*0561b2d8STREFOU Felix . = ALIGN(4); 88*0561b2d8STREFOU Felix _etext = .; /* define a global symbols at end of code */ 89*0561b2d8STREFOU Felix } >FLASH 90*0561b2d8STREFOU Felix 91*0561b2d8STREFOU Felix /* Constant data goes into FLASH */ 92*0561b2d8STREFOU Felix .rodata : 93*0561b2d8STREFOU Felix { 94*0561b2d8STREFOU Felix . = ALIGN(4); 95*0561b2d8STREFOU Felix *(.rodata) /* .rodata sections (constants, strings, etc.) */ 96*0561b2d8STREFOU Felix *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ 97*0561b2d8STREFOU Felix . = ALIGN(4); 98*0561b2d8STREFOU Felix } >FLASH 99*0561b2d8STREFOU Felix 100*0561b2d8STREFOU Felix .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH 101*0561b2d8STREFOU Felix .ARM : { 102*0561b2d8STREFOU Felix __exidx_start = .; 103*0561b2d8STREFOU Felix *(.ARM.exidx*) 104*0561b2d8STREFOU Felix __exidx_end = .; 105*0561b2d8STREFOU Felix } >FLASH 106*0561b2d8STREFOU Felix 107*0561b2d8STREFOU Felix .preinit_array : 108*0561b2d8STREFOU Felix { 109*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__preinit_array_start = .); 110*0561b2d8STREFOU Felix KEEP (*(.preinit_array*)) 111*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__preinit_array_end = .); 112*0561b2d8STREFOU Felix } >FLASH 113*0561b2d8STREFOU Felix .init_array : 114*0561b2d8STREFOU Felix { 115*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__init_array_start = .); 116*0561b2d8STREFOU Felix KEEP (*(SORT(.init_array.*))) 117*0561b2d8STREFOU Felix KEEP (*(.init_array*)) 118*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__init_array_end = .); 119*0561b2d8STREFOU Felix } >FLASH 120*0561b2d8STREFOU Felix .fini_array : 121*0561b2d8STREFOU Felix { 122*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__fini_array_start = .); 123*0561b2d8STREFOU Felix KEEP (*(SORT(.fini_array.*))) 124*0561b2d8STREFOU Felix KEEP (*(.fini_array*)) 125*0561b2d8STREFOU Felix PROVIDE_HIDDEN (__fini_array_end = .); 126*0561b2d8STREFOU Felix } >FLASH 127*0561b2d8STREFOU Felix 128*0561b2d8STREFOU Felix /* used by the startup to initialize data */ 129*0561b2d8STREFOU Felix _sidata = LOADADDR(.data); 130*0561b2d8STREFOU Felix 131*0561b2d8STREFOU Felix /* Initialized data sections goes into RAM, load LMA copy after code */ 132*0561b2d8STREFOU Felix .data : 133*0561b2d8STREFOU Felix { 134*0561b2d8STREFOU Felix . = ALIGN(4); 135*0561b2d8STREFOU Felix _sdata = .; /* create a global symbol at data start */ 136*0561b2d8STREFOU Felix *(.data) /* .data sections */ 137*0561b2d8STREFOU Felix *(.data*) /* .data* sections */ 138*0561b2d8STREFOU Felix 139*0561b2d8STREFOU Felix . = ALIGN(4); 140*0561b2d8STREFOU Felix _edata = .; /* define a global symbol at data end */ 141*0561b2d8STREFOU Felix } >RAM1 AT> FLASH 142*0561b2d8STREFOU Felix 143*0561b2d8STREFOU Felix 144*0561b2d8STREFOU Felix /* Uninitialized data section */ 145*0561b2d8STREFOU Felix . = ALIGN(4); 146*0561b2d8STREFOU Felix .bss : 147*0561b2d8STREFOU Felix { 148*0561b2d8STREFOU Felix /* This is used by the startup in order to initialize the .bss secion */ 149*0561b2d8STREFOU Felix _sbss = .; /* define a global symbol at bss start */ 150*0561b2d8STREFOU Felix __bss_start__ = _sbss; 151*0561b2d8STREFOU Felix *(.bss) 152*0561b2d8STREFOU Felix *(.bss*) 153*0561b2d8STREFOU Felix *(COMMON) 154*0561b2d8STREFOU Felix 155*0561b2d8STREFOU Felix . = ALIGN(4); 156*0561b2d8STREFOU Felix _ebss = .; /* define a global symbol at bss end */ 157*0561b2d8STREFOU Felix __bss_end__ = _ebss; 158*0561b2d8STREFOU Felix } >RAM1 159*0561b2d8STREFOU Felix 160*0561b2d8STREFOU Felix /* User_heap_stack section, used to check that there is enough RAM left */ 161*0561b2d8STREFOU Felix ._user_heap_stack : 162*0561b2d8STREFOU Felix { 163*0561b2d8STREFOU Felix . = ALIGN(8); 164*0561b2d8STREFOU Felix PROVIDE ( end = . ); 165*0561b2d8STREFOU Felix PROVIDE ( _end = . ); 166*0561b2d8STREFOU Felix . = . + _Min_Heap_Size; 167*0561b2d8STREFOU Felix . = . + _Min_Stack_Size; 168*0561b2d8STREFOU Felix . = ALIGN(8); 169*0561b2d8STREFOU Felix } >RAM1 170*0561b2d8STREFOU Felix 171*0561b2d8STREFOU Felix 172*0561b2d8STREFOU Felix 173*0561b2d8STREFOU Felix /* Remove information from the standard libraries */ 174*0561b2d8STREFOU Felix /DISCARD/ : 175*0561b2d8STREFOU Felix { 176*0561b2d8STREFOU Felix libc.a ( * ) 177*0561b2d8STREFOU Felix libm.a ( * ) 178*0561b2d8STREFOU Felix libgcc.a ( * ) 179*0561b2d8STREFOU Felix } 180*0561b2d8STREFOU Felix 181*0561b2d8STREFOU Felix .ARM.attributes 0 : { *(.ARM.attributes) } 182*0561b2d8STREFOU Felix MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED 183*0561b2d8STREFOU Felix MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED 184*0561b2d8STREFOU Felix MB_MEM2 : { *(MB_MEM2) } >RAM_SHARED 185*0561b2d8STREFOU Felix} 186*0561b2d8STREFOU Felix 187*0561b2d8STREFOU Felix 188