在STM32F405上移动矢量表

时间:2018-01-04 09:05:00

标签: c arm linker-scripts stm32f4

我想将代码移到STM32F405的闪存中 我改变了链接器脚本来改变flash的开始,如下所示:

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

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

1 个答案:

答案 0 :(得分:1)

是的,您的引导加载程序将为您的主代码提供单独的向量表。引导加载程序的最后一件事,或主代码应该做的第一件事是使用SCB->VTOR寄存器重新映射向量表。向量表从图像的开头是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的指针,获取初始堆栈指针,然后设置它。