我想将代码移到STM32F405的闪存中 我改变了链接器脚本来改变flash的开始,如下所示:
FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 1024K-32K
如果我是正确的,矢量表也将位于0x08008000。我想为一个启动创建一个启动程序,我想在新的内存位置运行我的应用程序。我的引导程序和应用程序是否有单独的向量表?如何将堆栈指针初始化为0x8008000?
答案 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的指针,获取初始堆栈指针,然后设置它。