[4.4.2] Remove 15 m/s limit on estimated vario (#12788)
[betaflight.git] / src / link / stm32_flash_h723_1m.ld
blob3f437c95c28e8e26ef04ff99219467e6a0849721
1 /*
2 *****************************************************************************
3 **
4 **  File        : stm32_flash_h723_1m.ld
5 **
6 **  Abstract    : Linker script for STM32H723xG and STM32H725xG Device with
7 **                320K AXI-SRAM mapped onto AXI bus on D1 domain
8                        (Shared AXI/I-TCM 192KB is all configured as AXI-SRAM)
9 **                 16K SRAM1 mapped on D2 domain
10 **                 16K SRAM2 mapped on D2 domain
11 **                 16K SRAM  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 0x2404FFFF  320K AXI SRAM, D1 domain, main RAM
25 0x30000000 to 0x30003FFF   16K SRAM1, D2 domain
26 0x30004000 to 0x30007FFF   16K SRAM2, D2 domain
27 0x38000000 to 0x38003FFF   16K SRAM4, D3 domain, unused
28 0x38800000 to 0x38800FFF    4K BACKUP SRAM, Backup domain, unused
30 0x08000000 to 0x080FFFFF 1024K full flash
31 0x08000000 to 0x0801FFFF  128K isr vector, startup code
32 0x08020000 to 0x0803FFFF  128K config
33 0x08040000 to 0x080FFFFF  768K firmware
36 /* Specify the memory areas */
37 MEMORY
39     FLASH (rx)        : ORIGIN = 0x08000000, LENGTH = 10K
40     FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 10K
41     FLASH_UNUSED (r)     : ORIGIN = 0x08005000, LENGTH = 108K
43     FLASH_CONFIG (r)  : ORIGIN = 0x08020000, LENGTH = 128K
44     FLASH1 (rx)       : ORIGIN = 0x08040000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 640K : 768K
45     FLASH_CUSTOM_DEFAULTS_EXTENDED (r): ORIGIN = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 0x081E0000 : 0x08200000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 128K : 0K
47     ITCM_RAM (rwx)    : ORIGIN = 0x00000000, LENGTH = 64K
48     DTCM_RAM (rwx)    : ORIGIN = 0x20000000, LENGTH = 128K
49     RAM (rwx)         : ORIGIN = 0x24000000, LENGTH = 320K
51     D2_RAM (rwx)      : ORIGIN = 0x30000000, LENGTH = 32K /* SRAM1 + SRAM2 */
52     MEMORY_B1 (rx)    : ORIGIN = 0x60000000, LENGTH = 0K
55 REGION_ALIAS("STACKRAM", DTCM_RAM)
56 REGION_ALIAS("FASTRAM", DTCM_RAM)
58 /* Entry Point */
59 ENTRY(Reset_Handler)
61 /* Highest address of the user mode stack */
62 _estack = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - 8; /* Reserve 2 x 4bytes for info across reset */
64 /* Base address where the config is stored. */
65 __config_start = ORIGIN(FLASH_CONFIG);
66 __config_end = ORIGIN(FLASH_CONFIG) + LENGTH(FLASH_CONFIG);
68 /* Generate a link error if heap and stack don't fit into RAM */
69 _Min_Heap_Size = 0;      /* required amount of heap  */
70 _Min_Stack_Size = 0x400; /* required amount of stack */
72 /* Define output sections */
73 SECTIONS
75   /* The startup code goes first into FLASH */
76   .isr_vector :
77   {
78     . = ALIGN(512);
79     PROVIDE (isr_vector_table_base = .);
80     KEEP(*(.isr_vector)) /* Startup code */
81     . = ALIGN(4);
82   } >FLASH
84   /* The program code and other data goes into FLASH */
85   .text :
86   {
87     . = ALIGN(4);
88     *(.text)           /* .text sections (code) */
89     *(.text*)          /* .text* sections (code) */
90     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
91     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
92     *(.glue_7)         /* glue arm to thumb code */
93     *(.glue_7t)        /* glue thumb to arm code */
94     *(.eh_frame)
96     KEEP (*(.init))
97     KEEP (*(.fini))
99     . = ALIGN(4);
100     _etext = .;        /* define a global symbols at end of code */
101   } >FLASH1
103   /* Critical program code goes into ITCM RAM */
104   /* Copy specific fast-executing code to ITCM RAM */ 
105   tcm_code = LOADADDR(.tcm_code); 
106   .tcm_code :
107   {
108     . = ALIGN(4);
109     tcm_code_start = .; 
110     *(.tcm_code)
111     *(.tcm_code*)
112     . = ALIGN(4);
113     tcm_code_end = .; 
114   } >ITCM_RAM AT >FLASH1
116   .ARM.extab   : 
117   { 
118     *(.ARM.extab* .gnu.linkonce.armextab.*) 
119   } >FLASH1
120   
121   .ARM : 
122   {
123     __exidx_start = .;
124     *(.ARM.exidx*) __exidx_end = .;
125   } >FLASH1
127   .pg_registry :
128   {
129     PROVIDE_HIDDEN (__pg_registry_start = .);
130     KEEP (*(.pg_registry))
131     KEEP (*(SORT(.pg_registry.*)))
132     PROVIDE_HIDDEN (__pg_registry_end = .);
133   } >FLASH1
134   
135   .pg_resetdata :
136   {
137     PROVIDE_HIDDEN (__pg_resetdata_start = .);
138     KEEP (*(.pg_resetdata))
139     PROVIDE_HIDDEN (__pg_resetdata_end = .);
140   } >FLASH1
142   /* Storage for the address for the configuration section so we can grab it out of the hex file */
143   .custom_defaults :
144   {
145     . = ALIGN(4);
146     KEEP (*(.custom_defaults_start_address))
147     . = ALIGN(4);
148     KEEP (*(.custom_defaults_end_address))
149     . = ALIGN(4);
150     __custom_defaults_internal_start = .;
151     *(.custom_defaults);
152   } >FLASH_CUSTOM_DEFAULTS
154   PROVIDE_HIDDEN (__custom_defaults_start = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) : __custom_defaults_internal_start);
155   PROVIDE_HIDDEN (__custom_defaults_end = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) + LENGTH(FLASH_CUSTOM_DEFAULTS_EXTENDED) : ORIGIN(FLASH_CUSTOM_DEFAULTS) + LENGTH(FLASH_CUSTOM_DEFAULTS));
157   /* used by the startup to initialize data */
158   _sidata = LOADADDR(.data);
160   /* Initialized data sections goes into RAM, load LMA copy after code */
161   .data :
162   {
163     . = ALIGN(4);
164     _sdata = .;        /* create a global symbol at data start */
165     *(.data)           /* .data sections */
166     *(.data*)          /* .data* sections */
168     . = ALIGN(4);
169     _edata = .;        /* define a global symbol at data end */
170   } >RAM AT >FLASH1
172   /* Uninitialized data section */
173   . = ALIGN(4);
174   .bss (NOLOAD) :
175   {
176     /* This is used by the startup in order to initialize the .bss secion */
177     _sbss = .;         /* define a global symbol at bss start */
178     __bss_start__ = _sbss;
179     *(.bss)
180     *(SORT_BY_ALIGNMENT(.bss*))
181     *(COMMON)
183     . = ALIGN(4);
184     _ebss = .;         /* define a global symbol at bss end */
185     __bss_end__ = _ebss;
186   } >RAM
188   /* Uninitialized data section */
189   . = ALIGN(4);
190   .sram2 (NOLOAD) :
191   {
192     /* This is used by the startup in order to initialize the .sram2 secion */
193     _ssram2 = .;         /* define a global symbol at sram2 start */
194     __sram2_start__ = _ssram2;
195     *(.sram2)
196     *(SORT_BY_ALIGNMENT(.sram2*))
198     . = ALIGN(4);
199     _esram2 = .;         /* define a global symbol at sram2 end */
200     __sram2_end__ = _esram2;
201   } >RAM
203   /* used during startup to initialized fastram_data */
204   _sfastram_idata = LOADADDR(.fastram_data);
206   /* Initialized FAST_DATA section for unsuspecting developers */
207   .fastram_data :
208   {
209     . = ALIGN(4);
210     _sfastram_data = .;        /* create a global symbol at data start */
211     *(.fastram_data)           /* .data sections */
212     *(.fastram_data*)          /* .data* sections */
214     . = ALIGN(4);
215     _efastram_data = .;        /* define a global symbol at data end */
216   } >FASTRAM AT >FLASH1
218   . = ALIGN(4);
219   .fastram_bss (NOLOAD) :
220   {
221     _sfastram_bss = .;
222     __fastram_bss_start__ = _sfastram_bss;
223     *(.fastram_bss)
224     *(SORT_BY_ALIGNMENT(.fastram_bss*))
226     . = ALIGN(4);
227     _efastram_bss = .;
228     __fastram_bss_end__ = _efastram_bss;
229   } >FASTRAM
231   /* used during startup to initialized dmaram_data */
232   _sdmaram_idata = LOADADDR(.dmaram_data);
234   . = ALIGN(32);
235   .dmaram_data :
236   {
237     PROVIDE(dmaram_start = .);
238     _sdmaram = .;
239     _dmaram_start__ = _sdmaram;
240     _sdmaram_data = .;        /* create a global symbol at data start */
241     *(.dmaram_data)           /* .data sections */
242     *(.dmaram_data*)          /* .data* sections */
243     . = ALIGN(32);
244     _edmaram_data = .;        /* define a global symbol at data end */
245   } >RAM AT >FLASH1
247   . = ALIGN(32);
248   .dmaram_bss (NOLOAD) :
249   {
250     _sdmaram_bss = .;
251     __dmaram_bss_start__ = _sdmaram_bss;
252     *(.dmaram_bss)
253     *(SORT_BY_ALIGNMENT(.dmaram_bss*))
254     . = ALIGN(32);
255     _edmaram_bss = .;
256     __dmaram_bss_end__ = _edmaram_bss;
257   } >RAM
259   . = ALIGN(32);
260   .DMA_RAM (NOLOAD) :
261   {
262     KEEP(*(.DMA_RAM))
263     PROVIDE(dmaram_end = .);
264     _edmaram = .;
265     _dmaram_end__ = _edmaram;
266   } >RAM
268   .DMA_RW_D2 (NOLOAD) :
269   {
270     . = ALIGN(32);
271     PROVIDE(dmarw_start = .);
272     _sdmarw = .;
273     _dmarw_start__ = _sdmarw;
274     KEEP(*(.DMA_RW))
275     PROVIDE(dmarw_end = .);
276     _edmarw = .;
277     _dmarw_end__ = _edmarw;
278   } >D2_RAM
280   .DMA_RW_AXI (NOLOAD) :
281   {
282     . = ALIGN(32);
283     PROVIDE(dmarwaxi_start = .);
284     _sdmarwaxi = .;
285     _dmarwaxi_start__ = _sdmarwaxi;
286     KEEP(*(.DMA_RW_AXI))
287     PROVIDE(dmarwaxi_end = .);
288     _edmarwaxi = .;
289     _dmarwaxi_end__ = _edmarwaxi;
290   } >RAM
292   .persistent_data (NOLOAD) :
293   {
294     __persistent_data_start__ = .;
295     *(.persistent_data)
296     . = ALIGN(4);
297     __persistent_data_end__ = .;
298   } >RAM
301   /* User_heap_stack section, used to check that there is enough RAM left */
302   _heap_stack_end = ORIGIN(STACKRAM)+LENGTH(STACKRAM) - 8; /* 8 bytes to allow for alignment */
303   _heap_stack_begin = _heap_stack_end - _Min_Stack_Size  - _Min_Heap_Size;
304   . = _heap_stack_begin;
305   ._user_heap_stack :
306   {
307     . = ALIGN(4);
308     PROVIDE ( end = . );
309     PROVIDE ( _end = . );
310     . = . + _Min_Heap_Size;
311     . = . + _Min_Stack_Size;
312     . = ALIGN(4);
313   } >STACKRAM = 0xa5
315   /* MEMORY_bank1 section, code must be located here explicitly            */
316   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
317   .memory_b1_text :
318   {
319     *(.mb1text)        /* .mb1text sections (code) */
320     *(.mb1text*)       /* .mb1text* sections (code)  */
321     *(.mb1rodata)      /* read-only data (constants) */
322     *(.mb1rodata*)
323   } >MEMORY_B1
325   /* Remove information from the standard libraries */
326   /DISCARD/ :
327   {
328     libc.a ( * )
329     libm.a ( * )
330     libgcc.a ( * )
331   }
333   .ARM.attributes 0 : { *(.ARM.attributes) }