用GCC下移stm32中的isr_vector

问题描述 投票:0回答:1

我需要移动 isr_vector 以便为我需要存储在那里的两个变量腾出空间。

我已经在链接器脚本中尝试过这个

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 92K
RAM2 (xrw)     : ORIGIN = 0x10000000, LENGTH = 32K
FLASH0 (rx)    : ORIGIN = 0x08000000, LENGTH = 4K
FLASH (rx)     : ORIGIN = 0x08001000, LENGTH = 1020K
my_ram (xrw)   : ORIGIN = 0x20017000, LENGTH = 4K
}
/* Define output sections */
SECTIONS
{
  /* CUSOTM SECTION */
  .myBufBlock(NOLOAD) :

  {

    KEEP(*(.myRAM)) /* keep my variable even if not referenced */

  } > my_ram

    .crcBlock :
  {
    . = ALIGN(8);
    KEEP(*(.myCrcSection)) /* Startup code */
    . = ALIGN(8);
  } >FLASH0

  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(8);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(8);
  } >FLASH

并将偏移量更改为0x1000:

SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
VECT_TAB_OFFSET = 0x1000;
VECT_TAB_BASE_ADDRESS = 0x08000000UL;

当我这样做时,程序没有在 stm32 上启动,我做错了什么?

c gcc linker stm32
1个回答
0
投票

这是不可能的 - 初始堆栈指针存储在闪存 (*) 的偏移量 0 处,复位向量位于偏移量 4 处。

当您打开系统电源时,CPU将始终从这些偏移量加载SP和PC,以便它可以开始运行您的代码。没有办法改变这一点。 (代码启动后,您可以稍后移动向量表,但不能在此之前移动。)

我建议将你的 CRC 或任何其他数据放在向量表之后的某个固定偏移处。

(*) 请注意,您可以使用引导引脚(和引导引脚配置寄存器)将 SRAM 或系统引导加载程序映射到地址 0x00000000,但这对您没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.