/* ****************************************************************************** ** ** File : LinkerScript.ld ** ** Author : STM32CubeMX ** ** Abstract : Linker script for STM32F407VETx series ** 512Kbytes FLASH and 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) 2025 STMicroelectronics

** ** Redistribution and use in source and binary forms, with or without modification, ** are permitted provided that the following conditions are met: ** 1. Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** 3. Neither the name of STMicroelectronics nor the names of its contributors ** may be used to endorse or promote products derived from this software ** without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ***************************************************************************** */ /* =============================================== STM32F407VET6 链接脚本中文注释说明 =============================================== */ /* 入口点定义 */ ENTRY(Reset_Handler) /* 程序入口点:复位中断处理函数 */ /* 用户模式堆栈的最高地址 */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* 栈顶地址:RAM 结束地址 */ /* 如果堆和栈无法放入 RAM,将生成链接错误 */ _Min_Heap_Size = 0x200; /* 最小堆大小:512 字节 */ _Min_Stack_Size = 0x400; /* 最小栈大小:1024 字节 */ /* 内存区域定义 */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K /* 主 RAM:128KB,可读写,地址从 0x20000000 开始 */ CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K /* 核心耦合内存:64KB,可读写,地址从 0x10000000 开始 */ FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K /* 闪存:512KB,只读和可执行,地址从 0x08000000 开始 */ } /* 定义输出段 */ SECTIONS { /* 启动代码首先放入 FLASH */ .isr_vector : /* 中断向量表段 */ { . = ALIGN(4); /* 4 字节对齐 */ KEEP(*(.isr_vector)) /* 保留中断向量表(启动代码),防止被优化掉 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 程序代码和其他数据放入 FLASH */ .text : /* 代码段 */ { . = ALIGN(4); /* 4 字节对齐 */ *(.text) /* .text 段(代码) */ *(.text*) /* .text* 段(代码) */ *(.glue_7) /* ARM 到 Thumb 代码的粘合代码 */ *(.glue_7t) /* Thumb 到 ARM 代码的粘合代码 */ *(.eh_frame) /* 异常处理框架 */ KEEP (*(.init)) /* 保留初始化代码 */ KEEP (*(.fini)) /* 保留结束代码 */ . = ALIGN(4); /* 4 字节对齐 */ _etext = .; /* 在代码结束处定义全局符号 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 常量数据放入 FLASH */ .rodata : /* 只读数据段 */ { . = ALIGN(4); /* 4 字节对齐 */ *(.rodata) /* .rodata 段(常量、字符串等) */ *(.rodata*) /* .rodata* 段(常量、字符串等) */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* ARM 异常表扩展段 */ .ARM.extab : /* "READONLY" 关键字仅在 GCC11 及更高版本支持,使用 GCC10 或更早版本时请移除 */ { . = ALIGN(4); /* 4 字节对齐 */ *(.ARM.extab* .gnu.linkonce.armextab.*) /* ARM 异常表扩展 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* ARM 索引段 */ .ARM : /* "READONLY" 关键字仅在 GCC11 及更高版本支持,使用 GCC10 或更早版本时请移除 */ { . = ALIGN(4); /* 4 字节对齐 */ __exidx_start = .; /* 异常索引开始 */ *(.ARM.exidx*) /* ARM 异常索引 */ __exidx_end = .; /* 异常索引结束 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 预初始化数组段 */ .preinit_array : /* "READONLY" 关键字仅在 GCC11 及更高版本支持,使用 GCC10 或更早版本时请移除 */ { . = ALIGN(4); /* 4 字节对齐 */ PROVIDE_HIDDEN (__preinit_array_start = .); /* 提供预初始化数组开始的隐藏符号 */ KEEP (*(.preinit_array*)) /* 保留预初始化数组 */ PROVIDE_HIDDEN (__preinit_array_end = .); /* 提供预初始化数组结束的隐藏符号 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 初始化数组段 */ .init_array : /* "READONLY" 关键字仅在 GCC11 及更高版本支持,使用 GCC10 或更早版本时请移除 */ { . = ALIGN(4); /* 4 字节对齐 */ PROVIDE_HIDDEN (__init_array_start = .); /* 提供初始化数组开始的隐藏符号 */ KEEP (*(SORT(.init_array.*))) /* 保留排序后的初始化数组 */ KEEP (*(.init_array*)) /* 保留初始化数组 */ PROVIDE_HIDDEN (__init_array_end = .); /* 提供初始化数组结束的隐藏符号 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 结束数组段 */ .fini_array : /* "READONLY" 关键字仅在 GCC11 及更高版本支持,使用 GCC10 或更早版本时请移除 */ { . = ALIGN(4); /* 4 字节对齐 */ PROVIDE_HIDDEN (__fini_array_start = .); /* 提供结束数组开始的隐藏符号 */ KEEP (*(SORT(.fini_array.*))) /* 保留排序后的结束数组 */ KEEP (*(.fini_array*)) /* 保留结束数组 */ PROVIDE_HIDDEN (__fini_array_end = .); /* 提供结束数组结束的隐藏符号 */ . = ALIGN(4); /* 4 字节对齐 */ } >FLASH /* 此段放入 FLASH 内存区域 */ /* 用于启动时初始化数据 */ _sidata = LOADADDR(.data); /* .data 段的加载地址(在 FLASH 中的地址) */ /* 初始化数据段放入 RAM,加载地址在代码之后 */ .data : /* 初始化数据段 */ { . = ALIGN(4); /* 4 字节对齐 */ _sdata = .; /* 在数据开始处创建全局符号 */ *(.data) /* .data 段 */ *(.data*) /* .data* 段 */ *(.RamFunc) /* 要放入 RAM 执行的函数 */ *(.RamFunc*) /* 要放入 RAM 执行的函数 */ . = ALIGN(4); /* 4 字节对齐 */ _edata = .; /* 在数据结束处定义全局符号 */ } >RAM AT> FLASH /* 此段放入 RAM 内存区域,但加载地址在 FLASH 中 */ _siccmram = LOADADDR(.ccmram); /* .ccmram 段的加载地址(在 FLASH 中的地址) */ /* CCM-RAM 段 * * 重要说明! * 如果初始化变量将放在此段中, * 需要修改启动代码以复制初始值。 */ .ccmram : /* CCM-RAM 段 */ { . = ALIGN(4); /* 4 字节对齐 */ _sccmram = .; /* 在 CCM-RAM 开始处创建全局符号 */ *(.ccmram) /* .ccmram 段 */ *(.ccmram*) /* .ccmram* 段 */ . = ALIGN(4); /* 4 字节对齐 */ _eccmram = .; /* 在 CCM-RAM 结束处创建全局符号 */ } >CCMRAM AT> FLASH /* 此段放入 CCMRAM 内存区域,但加载地址在 FLASH 中 */ /* 未初始化数据段 */ . = ALIGN(4); /* 4 字节对齐 */ .bss : /* BSS 段(未初始化数据) */ { /* 启动代码使用此符号初始化 .bss 段 */ _sbss = .; /* 在 BSS 开始处定义全局符号 */ __bss_start__ = _sbss; /* 与 _sbss 相同,兼容不同命名 */ *(.bss) /* .bss 段 */ *(.bss*) /* .bss* 段 */ *(COMMON) /* 公共符号 */ . = ALIGN(4); /* 4 字节对齐 */ _ebss = .; /* 在 BSS 结束处定义全局符号 */ __bss_end__ = _ebss; /* 与 _ebss 相同,兼容不同命名 */ } >RAM /* 此段放入 RAM 内存区域 */ /* 用户堆和栈段,用于检查是否有足够的 RAM 剩余 */ ._user_heap_stack : /* 用户堆和栈段 */ { . = ALIGN(8); /* 8 字节对齐 */ PROVIDE ( end = . ); /* 提供 end 符号 */ PROVIDE ( _end = . ); /* 提供 _end 符号,与 end 相同 */ . = . + _Min_Heap_Size; /* 分配最小堆大小 */ . = . + _Min_Stack_Size; /* 分配最小栈大小 */ . = ALIGN(8); /* 8 字节对齐 */ } >RAM /* 此段放入 RAM 内存区域 */ /* 从标准库中移除信息 */ /DISCARD/ : /* 丢弃段 */ { libc.a ( * ) /* 丢弃标准 C 库的所有信息 */ libm.a ( * ) /* 丢弃标准数学库的所有信息 */ libgcc.a ( * ) /* 丢弃 GCC 库的所有信息 */ } }