在 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 的指针,以获取初始堆栈指针,然后设置它。
我想将我的代码移动到 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 的指针,以获取初始堆栈指针,然后设置它。