STM32从特定NOR块引导

STM32从特定NOR块引导,stm32,linker-scripts,memory-mapping,gnu-arm,Stm32,Linker Scripts,Memory Mapping,Gnu Arm,我已经将一个STM32F4项目从Keil uVision5移植到Eclipse(GNU MCU插件) 在我的Keil uVision5项目中,我使用第7块(0x080E0000)作为我的引导代码(我使用STM32 ST-LINK实用工具验证我的引导代码确实位于第7块),我使用Keil uVision5接口非常容易地配置该代码,如下所示: 如果我没有弄错的话,在我的Keil uVision项目(其内存配置如上所示)中,MCU从第0个块(0x08000000)引导,然后立即跳到第7个块(0x080

我已经将一个STM32F4项目从Keil uVision5移植到Eclipse(GNU MCU插件)

在我的Keil uVision5项目中,我使用第7块(0x080E0000)作为我的引导代码(我使用STM32 ST-LINK实用工具验证我的引导代码确实位于第7块),我使用Keil uVision5接口非常容易地配置该代码,如下所示:

如果我没有弄错的话,在我的Keil uVision项目(其内存配置如上所示)中,MCU从第0个块(0x08000000)引导,然后立即跳到第7个块(0x080E0000)以执行我的代码。如果我错了,告诉我

我的问题是我的Eclipse项目。您可能已经知道,我们使用名为mem.ld的链接器脚本文件配置内存映射。我试图用mem.ld模仿同样的行为,但我想我失败了。每当我刷新Eclipse生成的可执行文件时,我的代码都不会运行。此外,我无法在mem.ld文件中找到指示启动区域的方法。下面是我在mem.ld文件中的内存配置:

MEMORY
{
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
    CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
    FLASHB1 (rx) : ORIGIN = 0x080E0000, LENGTH = 640K
    EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    MEMORY_ARRAY (xrw)  : ORIGIN = 0x20002000, LENGTH = 32
}
你能帮我用mem.ld文件模仿Keil uVision5的同样行为吗?在mem.ld配置中我会犯什么错误?正确的配置应该是什么


非常感谢。

重置后执行的代码地址取自向量表的4-7字节(称为重置向量)

在gcc风格的链接器脚本中,
ENTRY
指令很重要,而不是内存节定义

您可以将条目更改为地址值或符号。比如说

ENTRY(My\u Startup\u函数)
或由CubeMX
ENTRY(Reset\u处理程序)生成的标准链接器脚本中的内容

在keil,我记得你有两个选择: 命令行

--entry=位置

其中位置可以是地址或符号


有关根区域和入口点的详细信息。我不再使用keil,个人更喜欢gcc。

重置后执行的代码地址取自向量表的4-7字节(称为重置向量)

在gcc风格的链接器脚本中,
ENTRY
指令很重要,而不是内存节定义

您可以将条目更改为地址值或符号。比如说

ENTRY(My\u Startup\u函数)
或由CubeMX
ENTRY(Reset\u处理程序)生成的标准链接器脚本中的内容

在keil,我记得你有两个选择: 命令行

--entry=位置

其中位置可以是地址或符号

有关根区域和入口点的详细信息。我不再使用keil,我个人更喜欢gcc