STM32单片机中断向量表详解:深入理解中断向量机制,提升系统稳定性
发布时间: 2024-07-02 18:54:07 阅读量: 352 订阅数: 77
![STM32单片机中断向量表详解:深入理解中断向量机制,提升系统稳定性](https://img-blog.csdnimg.cn/76434475dd8e46be99825ccbd5b0fdec.png)
# 1. STM32中断概述**
中断是一种允许处理器在收到外部事件时暂停当前执行任务并跳转到特定处理程序的机制。在STM32单片机中,中断向量表是一个存储中断服务例程地址的特殊内存区域。当发生中断时,处理器会根据中断向量表中的地址跳转到相应的服务例程,从而执行中断处理逻辑。
# 2. 中断向量表结构
### 2.1 中断向量表的组成和布局
STM32单片机的中断向量表是一个存储在片上ROM中的特殊数据结构,它包含了所有中断服务例程(ISR)的入口地址。中断向量表的大小和布局因不同的STM32系列而异,但通常遵循以下结构:
| 向量号 | 地址 | 中断源 |
|---|---|---|
| 0 | 0x0000_0000 | 复位 |
| 1 | 0x0000_0004 | 非屏蔽中断 |
| 2 | 0x0000_0008 | 硬故障 |
| 3 | 0x0000_000C | 内存管理 |
| 4 | 0x0000_0010 | 总线故障 |
| 5 | 0x0000_0014 | 用法错误 |
| ... | ... | ... |
每个中断源对应一个向量号,该向量号指向ISR的入口地址。当一个中断发生时,处理器会根据中断源的向量号从中断向量表中获取ISR的入口地址,然后跳转到ISR执行中断处理程序。
### 2.2 中断向量表地址映射
中断向量表通常映射到片上ROM的低地址区域,这确保了ISR可以快速访问。中断向量表的起始地址可以通过以下寄存器访问:
- **SCB->VTOR**(STM32F1系列)
- **SCB->VTOR**(STM32F2、F4、F7系列)
可以通过设置SCB->VTOR寄存器来重新映射中断向量表,这允许用户将中断向量表放置在外部存储器中。
# 3. 中断向量表的配置
### 3.1 中断向量表的初始化
STM32单片机的中断向量表在复位后默认指向地址0x08000000,其中前256个字节(0x08000000~0x080000FF)为复位向量表,用于系统复位后的初始化。
要修改中断向量表,需要修改NVIC(嵌套向量中断控制器)中的寄存器。NVIC寄存器映射在地址0xE000E100,其中NVIC_VTOR寄存器(偏移地址0x08)用于设置中断向量表的起始地址。
```c
// 设置中断向量表起始地址为0x10000000
NVIC_VTOR = 0x10000000;
```
### 3.2 中断服务例程的编写和注册
中断服务例程(ISR)是响应中断事件的函数。每个中断源都有一个对应的ISR,在ISR中可以对中断事件进行处理。
编写ISR时,需要遵循以下规则:
- ISR必须以`__attribute__((interrupt))`声明,表明该函数是一个中断服务例程。
- ISR必须使用`void`作为返回值类型。
- ISR不能调用任何可重入函数(即不能被其他中断打断的函数)。
```c
// 外部中断0中断服务例程
__attribute__((interrupt))
void EXTI0_IRQHandler(void)
{
// 中断处理代码
EXTI->PR |= EXTI_PR_PR0; // 清除中断标志位
}
```
注册ISR需要使用NVIC寄存器。NVIC_ISER寄存器(偏移地址
0
0