Arm 如何使用uvision(Keil)重新定位向量表并更改cortexm3中的起始地址?

Arm 如何使用uvision(Keil)重新定位向量表并更改cortexm3中的起始地址?,arm,cortex-m3,keil,Arm,Cortex M3,Keil,我用的是STM32F107 cortex m3微控制器。我正在为这个项目使用Keil uvision IDE。我有一个在起始位置正常运行的应用程序,即0x0800 0000。如果我将起始位置更改为0x0800 4000,则应用程序工作不正常。我使用此函数对向量表位置进行了如下更改: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000) i、 e将SCB->VTOR=0x8004000更改到此位置 但即使这样做了,中断也不会发生。我还需要做些什么来

我用的是STM32F107 cortex m3微控制器。我正在为这个项目使用Keil uvision IDE。我有一个在起始位置正常运行的应用程序,即
0x0800 0000
。如果我将起始位置更改为
0x0800 4000
,则应用程序工作不正常。我使用此函数对向量表位置进行了如下更改:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000)
i、 e将
SCB->VTOR=0x8004000
更改到此位置


但即使这样做了,中断也不会发生。我还需要做些什么来让这个项目工作吗?

你不应该使用
NVIC\u setvectorable(NVIC\u vectab\u FLASH,0x8004000)
,使用
NVIC\u setvectorable(NVIC\u vectab\u FLASH,0x4000)
。第二个参数是“偏移量”,而不是绝对地址。

在HAL_Init()之后添加以下指令

SCB->VTOR=(闪存|0x4000)

您还需要更新STM32F1xc_flash.icf文件中的中断向量地址,如下所示


定义符号ICFEDIT\u intvec\u start=0x08004000

我这样做是为了我的STM32L496,在调用HAL_Init()之前设置新的向量表是很重要的,因为它调用HAL_MspInit(),这可能会在设置一些外围设备时使用SysTick来测量超时。

我怀疑您是想说应用程序中的向量表在启动后被重新定位到0x0800.0000,现在您正试图将其移动到0x0800.4000?您是否验证了工具集在新地址实际定位了向量表?你说“中断没有发生”-这到底是什么意思?在断言中断的外围设备和运行ISR堆栈设置、在CPU上启用中断、NVIC中断优先级、安装正确的中断向量、外围中断未屏蔽等之间,需要做很多工作。当我查看映射文件时,向量表本身位于0x0800 4000。我认为有一些初始化错误。检查这不是你问题的答案,但我建议你制作一个全局或静态数组,它足够大,可以包含向量表的副本,并将向量指向这个,而不是直接设置地址。我建议的原因是,随着程序的增长,它可能会在分配变量时分配覆盖向量表的变量。另一个解决方案是编辑链接器脚本,并在那里为向量表保留足够的空间。应该注意向量表的对齐。ARM说:“向量表基必须始终与实现的异常向量的数量保持一致”。有关详细信息,请参阅VTOR寄存器说明。