中断向量表的起始地址在Keil的什么地方看
时间: 2023-12-06 10:44:13 浏览: 133
在Keil中,中断向量表的起始地址可以通过打开“Target”窗口并选择“Debug”的“Debug (printf) Viewer”选项来查看。在“Debug (printf) Viewer”窗口中,可以找到“Cortex-Mx”的“Interrupt Vectors”选项,其中包含中断向量表的起始地址。另外,也可以在代码中使用以下语句来获取中断向量表的起始地址:
```
extern uint32_t __Vectors;
```
其中,`__Vectors`就是中断向量表的起始地址。
相关问题
IAP已经烧录成功,如何在APP主函数设置中断向量表地址,偏移到APP中
在主函数中设置中断向量表地址和偏移量的方法取决于你使用的是哪种编译器和开发环境。以下是一些常见的方法:
1. 在 Keil MDK 中,你可以在主函数中使用以下代码设置中断向量表地址和偏移量:
```c
// 设置中断向量表的地址
SCB->VTOR = APP_VECTOR_TABLE_ADDRESS;
// 计算出 APP 的偏移量
uint32_t app_offset = APP_START_ADDRESS - ORIGIN_START_ADDRESS;
// 设置 APP 的中断向量表偏移量
SCB->VTOR |= app_offset;
```
其中,`APP_VECTOR_TABLE_ADDRESS` 是 APP 中断向量表的地址,`APP_START_ADDRESS` 是 APP 的起始地址,`ORIGIN_START_ADDRESS` 是程序原始起始地址(一般指 Flash 起始地址)。
2. 在 GNU ARM Embedded 工具链中,你可以在 `startup.c` 文件中修改中断向量表地址和偏移量。例如:
```c
// 修改中断向量表地址
extern uint32_t _app_vector_table_address;
SCB->VTOR = (uint32_t)&_app_vector_table_address;
// 计算出 APP 的偏移量
uint32_t app_offset = APP_START_ADDRESS - ORIGIN_START_ADDRESS;
// 设置 APP 的中断向量表偏移量
SCB->VTOR |= app_offset;
```
其中,`_app_vector_table_address` 是链接脚本中定义的 APP 中断向量表的地址。
需要注意的是,设置中断向量表地址和偏移量后,你需要重新初始化中断控制器和启用中断。
STM32中如何在主函数中设置中断向量表编译到APP中
在STM32中,可以通过以下步骤在主函数中设置中断向量表编译到APP中:
1. 首先,需要在代码中引入CMSIS头文件及STM32F1xx系列头文件,例如:
```
#include "stm32f1xx.h"
#include "core_cm3.h"
```
2. 接着,需要定义一个函数指针数组,用于存放中断服务函数的地址。例如:
```
void (* const g_pfnVectors[])(void) = {
(void (*)(void))((uint32_t)&Image$$ARM_LIB_STACK$$ZI$$Limit),
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSV_Handler,
SysTick_Handler,
/* Interrupts */
WWDG_IRQHandler,
...
};
```
其中,`g_pfnVectors`数组中存放了所有中断服务函数的地址,这些地址按照中断向量表的顺序进行排列。
3. 在主函数的开头,需要将中断向量表的地址重新定位到g_pfnVectors数组中,例如:
```
void relocate_vector_table(void)
{
SCB->VTOR = (uint32_t)g_pfnVectors;
}
```
在这个函数中,将`g_pfnVectors`数组的地址赋值给`VTOR`寄存器即可。然后在主函数的开头调用`relocate_vector_table()`函数即可。
4. 最后,在编译时需要设置链接脚本,使得中断向量表被编译到APP中。例如,在Keil MDK中,可以在链接选项中添加以下语句:
```
--entry=Reset_Handler \
--scatter=scatter_file.sct \
--ro-base=0x08000000 \
--rw-base=0x20000000 \
--first=Reset_Handler \
```
其中,`scatter_file.sct`是链接脚本文件的名称,`--ro-base`和`--rw-base`分别指定代码段和数据段的起始地址。`--entry`指定程序的入口地址,这里设置为`Reset_Handler`。`--first`也指定程序的入口地址,这里同样设置为`Reset_Handler`。
通过以上步骤,就可以在主函数中设置中断向量表编译到APP中了。