如何在Keil的uVision下重新定位向量表并更改Cortex-M3的起始地址?

8
我正在使用STM32F107 Cortex M3微控制器。我在项目中使用Keil uvision IDE。我有一个应用程序,在起始位置(即0x08000000)正常运行。如果我将起始位置更改为0x08004000,应用程序就无法正常工作。我使用以下函数更改了向量表的位置:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000)

我将SCB->VTOR = 0x8004000更改为此位置。
但即使这样做,中断仍然没有发生。我需要做更多的事情来使这个项目工作吗?

我猜你的意思是在启动后,应用程序中的向量表被重新定位到0x0800.0000,现在你正在尝试将其移动到0x0800.4000?你是否验证了工具集实际上将向量表定位在新地址?而且你说“中断没有发生”——这究竟是什么意思?在外设断言中断和运行ISR之间需要很多正确的步骤——堆栈设置、使能CPU中断、NVIC中断优先级、安装适当的中断向量、取消屏蔽外设中断等。 - Dan
当我查看地图文件时,向量表本身位于0x08004000。我认为有一些初始化错误,请检查一下。 - suraj
1
这不是你问题的答案,但我建议你创建一个全局或静态数组,它足够大以包含向量表的副本,并将向量指向该数组,而不是直接设置地址。我建议的原因是随着程序的增长,它可能会分配变量来覆盖向量表,因为变量被分配了。另一种解决方案是编辑链接器脚本并在那里保留足够的空间用于向量表。 - user1985657
3个回答

9

不应使用 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000),应使用 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000)。第二个参数是“偏移量”,而不是绝对地址。


1
应注意向量表对齐。ARM表示:“向量表基址必须始终对齐至少实现的异常向量数”。有关详细信息,请参阅VTOR寄存器描述。 - iFred

1
将以下指令添加到 HAL_Init(); 后面:
SCB->VTOR = (FLASH_BASE | 0x4000);
您还需要按照以下方式更新 STM32F1xc_flash.icf 文件中的中断向量地址。
定义符号ICFEDIT_intvec_start = 0x08004000;

-1
我为我的STM32L496做了这件事,重要的是在调用HAL_Init()之前设置新的向量表,因为它会调用HAL_MspInit(),而后者可能在设置某些外设时使用SysTick来测量超时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接