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
我已经将一个 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