Small modification to ff boost spike suppression
[betaflight.git] / src / link / stm32_flash_h743_2m.ld
blob6bdb84d615f4bf3ea20d80cd04575fcc8c1cfae9
1 /*
2 *****************************************************************************
3 **
4 **  File        : stm32_flash_h7x3_2m.ld
5 **
6 **  Abstract    : Linker script for STM32H743xI Device with
7 **                512K AXI-RAM mapped onto AXI bus on D1 domain
8 **                128K SRAM1 mapped on D2 domain
9 **                128K SRAM2 mapped on D2 domain
10 **                 32K SRAM3 mapped on D2 domain
11 **                 64K SRAM4 mapped on D3 domain
12 **                 64K ITCM
13 **                128K DTCM
15 *****************************************************************************
18 /* Entry Point */
19 ENTRY(Reset_Handler)
22 0x00000000 to 0x0000FFFF   64K ITCM
23 0x20000000 to 0x2001FFFF  128K DTCM
24 0x24000000 to 0x2407FFFF  512K AXI SRAM, D1 domain, main RAM
25 0x30000000 to 0x3001FFFF  128K SRAM1, D2 domain, unused
26 0x30020000 to 0x3003FFFF  128K SRAM2, D2 domain, unused
27 0x30040000 to 0x30047FFF   32K SRAM3, D2 domain, unused
28 0x38000000 to 0x3800FFFF   64K SRAM4, D3 domain, unused
29 0x38800000 to 0x38800FFF    4K BACKUP SRAM, Backup domain, unused
31 0x08000000 to 0x081FFFFF 2048K full flash,
32 0x08000000 to 0x0801FFFF  128K isr vector, startup code,
33 0x08020000 to 0x0803FFFF  128K config,                  // FLASH_Sector_1
34 0x08040000 to 0x081FFFFF 1792K firmware,
37 /* Specify the memory areas */
38 MEMORY
40     FLASH (rx)        : ORIGIN = 0x08000000, LENGTH = 128K
41     FLASH_CONFIG (r)  : ORIGIN = 0x08020000, LENGTH = 128K
42     FLASH1 (rx)       : ORIGIN = 0x08040000, LENGTH = 1792K
44     ITCM_RAM (rwx)    : ORIGIN = 0x00000000, LENGTH = 64K
45     DTCM_RAM (rwx)    : ORIGIN = 0x20000000, LENGTH = 128K
46     RAM (rwx)         : ORIGIN = 0x24000000, LENGTH = 512K
48     D2_RAM (rwx)      : ORIGIN = 0x30000000, LENGTH = 256K /* SRAM1 + SRAM2 */
50     MEMORY_B1 (rx)    : ORIGIN = 0x60000000, LENGTH = 0K
53 REGION_ALIAS("STACKRAM", DTCM_RAM)
54 REGION_ALIAS("FASTRAM", DTCM_RAM)
56 /* INCLUDE "stm32_flash_f7_split.ld" */
58 *****************************************************************************
60 **  File        : stm32_flash_f7_split.ld
62 **  Abstract    : Common linker script for STM32 devices.
64 *****************************************************************************
67 /* Entry Point */
68 ENTRY(Reset_Handler)
70 /* Highest address of the user mode stack */
71 _estack = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - 8; /* Reserve 2 x 4bytes for info across reset */
73 /* Base address where the config is stored. */
74 __config_start = ORIGIN(FLASH_CONFIG);
75 __config_end = ORIGIN(FLASH_CONFIG) + LENGTH(FLASH_CONFIG);
77 /* Generate a link error if heap and stack don't fit into RAM */
78 _Min_Heap_Size = 0;      /* required amount of heap  */
79 _Min_Stack_Size = 0x800; /* required amount of stack */
81 /* Define output sections */
82 SECTIONS
84   /* The startup code goes first into FLASH */
85   .isr_vector :
86   {
87     . = ALIGN(512);
88     PROVIDE (isr_vector_table_base = .);
89     KEEP(*(.isr_vector)) /* Startup code */
90     . = ALIGN(4);
91   } >FLASH
93   /* The program code and other data goes into FLASH */
94   .text :
95   {
96     . = ALIGN(4);
97     *(.text)           /* .text sections (code) */
98     *(.text*)          /* .text* sections (code) */
99     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
100     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
101     *(.glue_7)         /* glue arm to thumb code */
102     *(.glue_7t)        /* glue thumb to arm code */
103     *(.eh_frame)
105     KEEP (*(.init))
106     KEEP (*(.fini))
108     . = ALIGN(4);
109     _etext = .;        /* define a global symbols at end of code */
110   } >FLASH1
112   /* Critical program code goes into ITCM RAM */
113   /* Copy specific fast-executing code to ITCM RAM */ 
114   tcm_code = LOADADDR(.tcm_code); 
115   .tcm_code :
116   {
117     . = ALIGN(4);
118     tcm_code_start = .; 
119     *(.tcm_code)
120     *(.tcm_code*)
121     . = ALIGN(4);
122     tcm_code_end = .; 
123   } >ITCM_RAM AT >FLASH1
125   .ARM.extab   : 
126   { 
127     *(.ARM.extab* .gnu.linkonce.armextab.*) 
128   } >FLASH
129   
130   .ARM : 
131   {
132     __exidx_start = .;
133     *(.ARM.exidx*) __exidx_end = .;
134   } >FLASH
136   .pg_registry :
137   {
138     PROVIDE_HIDDEN (__pg_registry_start = .);
139     KEEP (*(.pg_registry))
140     KEEP (*(SORT(.pg_registry.*)))
141     PROVIDE_HIDDEN (__pg_registry_end = .);
142   } >FLASH
143   
144   .pg_resetdata :
145   {
146     PROVIDE_HIDDEN (__pg_resetdata_start = .);
147     KEEP (*(.pg_resetdata))
148     PROVIDE_HIDDEN (__pg_resetdata_end = .);
149   } >FLASH
151   /* used by the startup to initialize data */
152   _sidata = LOADADDR(.data);
154   /* Initialized data sections goes into RAM, load LMA copy after code */
155   .data :
156   {
157     . = ALIGN(4);
158     _sdata = .;        /* create a global symbol at data start */
159     *(.data)           /* .data sections */
160     *(.data*)          /* .data* sections */
162     . = ALIGN(4);
163     _edata = .;        /* define a global symbol at data end */
164   } >RAM AT >FLASH
166   /* Uninitialized data section */
167   . = ALIGN(4);
168   .bss (NOLOAD) :
169   {
170     /* This is used by the startup in order to initialize the .bss secion */
171     _sbss = .;         /* define a global symbol at bss start */
172     __bss_start__ = _sbss;
173     *(.bss)
174     *(SORT_BY_ALIGNMENT(.bss*))
175     *(COMMON)
177     . = ALIGN(4);
178     _ebss = .;         /* define a global symbol at bss end */
179     __bss_end__ = _ebss;
180   } >RAM
182   /* Uninitialized data section */
183   . = ALIGN(4);
184   .sram2 (NOLOAD) :
185   {
186     /* This is used by the startup in order to initialize the .sram2 secion */
187     _ssram2 = .;         /* define a global symbol at sram2 start */
188     __sram2_start__ = _ssram2;
189     *(.sram2)
190     *(SORT_BY_ALIGNMENT(.sram2*))
192     . = ALIGN(4);
193     _esram2 = .;         /* define a global symbol at sram2 end */
194     __sram2_end__ = _esram2;
195   } >RAM
197   /* used during startup to initialized fastram_data */
198   _sfastram_idata = LOADADDR(.fastram_data);
200   /* Initialized FAST_RAM section for unsuspecting developers */
201   .fastram_data :
202   {
203     . = ALIGN(4);
204     _sfastram_data = .;        /* create a global symbol at data start */
205     *(.fastram_data)           /* .data sections */
206     *(.fastram_data*)          /* .data* sections */
208     . = ALIGN(4);
209     _efastram_data = .;        /* define a global symbol at data end */
210   } >FASTRAM AT >FLASH
212   . = ALIGN(4);
213   .fastram_bss (NOLOAD) :
214   {
215     _sfastram_bss = .;
216     __fastram_bss_start__ = _sfastram_bss;
217     *(.fastram_bss)
218     *(SORT_BY_ALIGNMENT(.fastram_bss*))
220     . = ALIGN(4);
221     _efastram_bss = .;
222     __fastram_bss_end__ = _efastram_bss;
223   } >FASTRAM
225   .DMA_RAM (NOLOAD) :
226   {
227     . = ALIGN(32);
228     PROVIDE(dmaram_start = .);
229     _sdmaram = .;
230     _dmaram_start__ = _sdmaram;
231     KEEP(*(.DMA_RAM))
232     PROVIDE(dmaram_end = .);
233     _edmaram = .;
234     _dmaram_end__ = _edmaram;
235   } >D2_RAM
237   .DMA_RW_D2 (NOLOAD) :
238   {
239     . = ALIGN(32);
240     PROVIDE(dmarw_start = .);
241     _sdmarw = .;
242     _dmarw_start__ = _sdmarw;
243     KEEP(*(.DMA_RW))
244     PROVIDE(dmarw_end = .);
245     _edmarw = .;
246     _dmarw_end__ = _edmarw;
247   } >D2_RAM
249   .DMA_RW_AXI (NOLOAD) :
250   {
251     . = ALIGN(32);
252     PROVIDE(dmarwaxi_start = .);
253     _sdmarwaxi = .;
254     _dmarwaxi_start__ = _sdmarwaxi;
255     KEEP(*(.DMA_RW_AXI))
256     PROVIDE(dmarwaxi_end = .);
257     _edmarwaxi = .;
258     _dmarwaxi_end__ = _edmarwaxi;
259   } >RAM
261   .persistent_data (NOLOAD) :
262   {
263     __persistent_data_start__ = .;
264     *(.persistent_data)
265     . = ALIGN(4);
266     __persistent_data_end__ = .;
267   } >RAM
270   /* User_heap_stack section, used to check that there is enough RAM left */
271   _heap_stack_end = ORIGIN(STACKRAM)+LENGTH(STACKRAM) - 8; /* 8 bytes to allow for alignment */
272   _heap_stack_begin = _heap_stack_end - _Min_Stack_Size  - _Min_Heap_Size;
273   . = _heap_stack_begin;
274   ._user_heap_stack :
275   {
276     . = ALIGN(4);
277     PROVIDE ( end = . );
278     PROVIDE ( _end = . );
279     . = . + _Min_Heap_Size;
280     . = . + _Min_Stack_Size;
281     . = ALIGN(4);
282   } >STACKRAM = 0xa5
284   /* MEMORY_bank1 section, code must be located here explicitly            */
285   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
286   .memory_b1_text :
287   {
288     *(.mb1text)        /* .mb1text sections (code) */
289     *(.mb1text*)       /* .mb1text* sections (code)  */
290     *(.mb1rodata)      /* read-only data (constants) */
291     *(.mb1rodata*)
292   } >MEMORY_B1
294   /* Remove information from the standard libraries */
295   /DISCARD/ :
296   {
297     libc.a ( * )
298     libm.a ( * )
299     libgcc.a ( * )
300   }
302   .ARM.attributes 0 : { *(.ARM.attributes) }