在 STM32F405 上移动矢量 table

moving the vector table on an STM32F405

我想将我的代码移动到 STM32F405 的闪存中。
我更改了链接器脚本以像这样更改闪存的开始:

FLASH (rx)      : ORIGIN = 0x08008000, LENGTH = 1024K-32K

如果我是正确的,矢量 table 也将位于 0x08008000。我想创建一个启动加载程序我想 运行 我的应用程序在新的内存位置。我的引导加载程序和应用程序是否有单独的向量 table?如何将堆栈指针初始化为 0x8008000?

是的,您的引导加载程序将有一个单独的向量 table 到您的主代码。您的引导加载程序的最后一件事,或者您的主代码应该做的第一件事是使用 SCB->VTOR 寄存器重新映射向量 table。向量 table 从图像开始算起 4 个字节,因此使用您的数字,SCB->VTOR 应该是 0x08008004。图像的前 4 个字节是堆栈指针应该初始化的值。

您不想将堆栈指针初始化为 0x8008000,该地址在闪存中,一旦您尝试推送某些内容就会导致硬故障,如果这是您的应用程序启动的位置,那么内存位于 0x08008000包含您应该用作堆栈指针的地址。

为了设置它,我一直使用一个 asm 函数,它只加载 SP 并传递给 R0 中函数的值,如下所示。

SetSP PROC
    EXPORT SetSP
    MOV SP, R0
    BX LR
    ENDP

从 C 上下文调用:

extern void SetSP(uint32_t address);
uint32_t sp = *((uint32_t *)0x08008000);
SetSP(sp);

取消引用指向 0x08008000 的指针,以获取初始堆栈指针,然后设置它。