我想在STM32F405上移动闪存中的代码。
我更改了链接器脚本以更改flash的开头,如下所示:

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

如果我是正确的,向量表也将位于0x08008000。我想先创建一个引导加载程序,然后在新的内存位置运行我的应用程序。我的引导加载程序和应用程序有sepperate向量表吗?如何将堆栈指针初始化为0x8008000?

最佳答案

是的,您的引导加载程序将有一个单独的向量表到您的主代码。引导加载程序的最后一件事,或者主代码应该做的第一件事是使用SCB->VTOR寄存器重新映射向量表。向量表距离图像的开头有4个字节,因此使用您的数字,SCB->VTOR应该是0x08008004。图像的前4个字节是堆栈指针应该初始化的值。
您不想初始化到0x8008000的堆栈指针,该地址在flash中,一旦您尝试推送某些内容,就会导致硬错误,如果应用程序就是在那里启动的,那么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的指针的引用,以获取初始堆栈指针,然后对其进行设置。

10-08 15:23