我需要移动 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 上启动,我做错了什么?
这是不可能的 - 初始堆栈指针存储在闪存 (*) 的偏移量 0 处,复位向量位于偏移量 4 处。
当您打开系统电源时,CPU将始终从这些偏移量加载SP和PC,以便它可以开始运行您的代码。没有办法改变这一点。 (代码启动后,您可以稍后移动向量表,但不能在此之前移动。)
我建议将你的 CRC 或任何其他数据放在向量表之后的某个固定偏移处。
(*) 请注意,您可以使用引导引脚(和引导引脚配置寄存器)将 SRAM 或系统引导加载程序映射到地址 0x00000000,但这对您没有帮助。