Cortex-M3的中断向量表
时间: 2024-05-30 20:10:14 浏览: 158
Cortex-M3的中断向量表是一个包含了15个中断向量的数组,每个向量都指向一个中断服务程序。其中,第0个向量指向栈顶地址,而后14个向量指向不同的中断服务程序。这些中断向量的地址是预定义的,存储在Cortex-M3的内部Flash存储器的0地址处,也可以通过编程修改中断向量表的地址。以下是Cortex-M3的中断向量表:
| 中断向量编号 | 中断服务程序 |
| --- | --- |
| 0 | 栈顶地址 |
| 1 | 复位 |
| 2 | 非屏蔽中断,NMI |
| 3 | 硬件异常,HardFault |
| 4 | 内存访问异常,MemManage |
| 5 | 总线错误异常,BusFault |
| 6 | 使用错误异常,UsageFault |
| 7 | 保留 |
| 8 | 保留 |
| 9 | 保留 |
| 10 | 保留 |
| 11 | SVCall |
| 12 | 调试监控异常,DebugMonitor |
| 13 | 保留 |
| 14 | PendSV |
| 15 | SysTick |
相关问题
cortex-m0中断向量表偏移
<think>好的,我需要帮助用户了解Cortex-M0中断向量表的偏移配置方法及原因。首先,我需要回忆一下Cortex-M0的中断处理机制,以及与其他系列如M3/M4的区别。根据提供的引用资料,Cortex-M0没有SCB->VTOR寄存器,而M3/M4有,因此M0的中断向量表重映射方法不同。
首先,用户提到的参考文章指出,M0的中断向量表在复位后固定在0x00000000地址,无法通过寄存器直接重定位。这意味着需要其他方法来实现偏移,比如在bootloader和应用程序中手动处理。
接下来,我需要整理配置步骤。根据引用1和2,bootloader需要将应用程序的中断向量表复制到RAM的特定地址,并可能设置栈顶指针。而应用程序则需要修改启动文件,将向量表定位到RAM,并在MDK或IAR中配置相应的RAM地址。此外,链接脚本需要调整,确保向量表正确偏移。
关于原因,用户可能想知道为什么需要这样做。主要是因为M0缺乏VTOR寄存器,无法动态重定位向量表,因此在多应用程序环境(如bootloader和app)中,必须手动调整向量表的位置,以确保中断处理程序正确指向当前应用的入口。
还需要注意一些关键点,比如中断向量表必须位于RAM起始位置,应用程序的起始地址需要与偏移后的向量表对齐,以及不同工具链的配置差异。这些细节需要清晰地传达给用户,避免配置错误导致的中断无法响应问题。
最后,生成相关问题需要考虑用户可能进一步探究的方向,比如与M3/M4的区别、bootloader与app的协作机制,以及常见错误和调试方法。这些问题可以帮助用户更深入理解中断向量表配置的重要性和实际应用中的注意事项。
总结来说,我需要分步骤解释配置方法,阐明原因,并列举注意事项,确保用户能够理解并正确实施中断向量表偏移配置。</think>### Cortex-M0中断向量表偏移配置方法及原因分析
#### 一、配置方法
由于Cortex-M0**没有SCB->VTOR寄存器**,无法通过寄存器直接重定位中断向量表,需采用以下步骤实现偏移:
1. **Bootloader处理**
- 在RAM中预留固定区域(如`0x20000000`),将应用程序的中断向量表**完整复制到该区域**。
- 执行`__set_MSP(*(__IO uint32_t*)APP_VECTOR_TABLE)`设置主栈指针[^1]。
2. **应用程序处理**
- **修改启动文件**(如`startup_*.s`),将向量表定位到RAM地址:
```assembly
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors DCD __initial_sp ; 栈顶地址
DCD Reset_Handler ; 复位中断
DCD NMI_Handler ; NMI中断
... ; 其他中断向量
```
- **MDK/IAR工程配置**:
- MDK:`Options for Target -> Linker -> R/O Base`设置为RAM地址(如`0x20000000`)
- IAR:修改链接脚本`.icf`文件,添加`define symbol __ICFEDIT_region_ROM_start__ = 0x20000000;`[^2]
#### 二、配置原因
1. **多程序协作需求**
在Bootloader+App架构中,App的中断向量表必须**脱离Bootloader的Flash地址空间**,否则中断会跳转到Bootloader的中断服务程序[^3]。
2. **硬件限制**
Cortex-M0的中断向量表**固定映射到0x00000000**,但可通过**重映射存储器控制器**(如STM32的SYSCFG寄存器)将Flash/RAM映射到该地址。
3. **动态加载特性**
当App需要**热更新**时,RAM中的向量表可实现运行时动态修改,而Flash中的向量表需擦写整个扇区。
#### 三、关键注意事项
1. **向量表对齐**
向量表必须满足**128字节对齐**,例如STM32F0的向量表总长0xC0(192字节),需保证`APP_VECTOR_TABLE % 128 == 0`。
2. **中断响应延迟**
RAM中的向量表访问速度比Flash快,但**复制操作会增加启动耗时**,典型延迟公式:
$$
T_{delay} = N_{vectors} \times t_{memcopy} + t_{stack\_init}
$$
3. **调试陷阱**
若未正确配置`.icf`或`.ld`链接脚本,可能导致**HardFault**,可通过以下方法验证:
```c
printf("Vector table addr: 0x%08X\n", SCB->VTOR); // M0读取无效,M3/M4有效
```
阅读全文
相关推荐















