【问题标题】:STM32 Boot from specific NOR blockSTM32 从特定的 NOR 块启动
【发布时间】:2019-01-28 12:00:35
【问题描述】:

我已将 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 配置中犯了什么错误?正确的配置应该是什么?

非常感谢。

【问题讨论】:

    标签: stm32 linker-scripts memory-mapping gnu-arm


    【解决方案1】:

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

    在 gcc 样式的链接器脚本中,ENTRY 指令很重要,而不是您的内存段定义。

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

    ENTRY(My_Startup_Function) 或 CubeMX 生成的标准链接器脚本中的ENTRY(Reset_Handler)

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

    --entry=location

    位置可以是地址或符号

    here 是关于根区域和入口点的更多信息。我不再使用keil,个人更喜欢gcc。

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多