STM32 从特定的 NOR 块启动

STM32 Boot from specific NOR block

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

在我的 Keil uVision5 项目中,我曾经使用第 7 个块 (0x080E0000) 作为我的引导代码(我验证使用 STM32 ST-LINK Utility 工具我的引导代码确实在第 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 配置中犯了什么错误?正确的配置应该是什么?

非常感谢。

复位后执行的代码地址取自向量table的4-7字节(称为复位向量)。

在 gcc 风格的链接描述文件中,ENTRY 指令比您的内存段定义更重要。

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

ENTRY(My_Startup_Function) 或在 CubeMX ENTRY(Reset_Handler)

生成的标准链接描述文件中

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

--entry=location

位置可以是地址或符号

here 是关于根区域和入口点的更多信息。已经不用keil了,个人比较喜欢gcc