7

我正在使用 STM32F746ZG 和 FreeRTOS。flash的起始地址是0x08000000。但我想把它改成0x08040000。我已经通过谷歌搜索了这个问题,但我没有找到解决方案。

我更改了链接描述文件,如下所示。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}

如果我只更改它并运行调试器,它就有问题。如果我将 VECT_TAB_OFFSET 从 0x00 更改为 0x4000,它工作正常。

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 

但是如果我不使用调试器,它就不起作用。这意味着它仅在使用 ST-Linker 时有效。

如果您知道解决方案,请告诉我。提前感谢您的回复。

4

3 回答 3

6

引导地址可以在选项字节中设置。

您可以以 16k 的增量设置闪存中的任何地址。选项字节区有两个 16 位寄存器,一个在复位时引导引脚为低电平时使用,另一个在引脚为高电平时使用。写入所需的地址右移 14 位,即除以 16384。

要从 启动,请按照参考手册的选项字节编程章节中的说明0x08040000写入0x2010寄存器。

在此处输入图像描述

于 2019-07-05T11:33:54.543 回答
0

你也可以写一个引导加载程序。Bootloader 位于 0x0800 0000 地址并加载您的应用程序固件,这意味着跳转到它。

这是另一种方法。

于 2020-09-11T11:09:16.557 回答
0

您需要在 FLASH 的原始开头放置 8 个字节。Stm32 总是从地址 0x00000000 引导,该地址与其中一个存储器有别名(取决于引导引脚和选项)。

第一个字包含堆栈指针,第二个是您的重置处理程序。你永远不会得到你的代码,因为它总是从同一个地址启动。

您将需要修改链接描述文件和定义向量的启动文件

于 2019-07-05T06:48:30.327 回答