中断基础
本文系统讲解 STM32 中断机制、NVIC 优先级配置、外部中断及标准库使用方法。
一、什么是中断
1.1 中断的概念
中断(Interrupt)是 MCU 响应内部或外部事件的一种机制。当中断发生时,CPU 会暂停当前正在执行的任务,转而去执行一个中断服务例程(ISR, Interrupt Service Routine),处理完中断事件后再返回继续执行原来的任务。
生活中的类比:
你在看书时突然收到一条微信,你会暂停看书(主任务),拿起手机回复消息(中断处理),然后继续看书(返回主任务)。
1.2 轮询 vs 中断
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 轮询(Polling) | CPU 不断检查外设状态 | 简单场景、实时性要求不高 |
| 中断(Interrupt) | 外设主动通知CPU | 实时性要求高、多外设协同 |
轮询的缺点:
- CPU 资源浪费在不断查询上
- 实时性差,事件响应不及时
- 多外设时难以协调
中断的优点:
- CPU 无需等待,可以执行其他任务
- 响应及时,不遗漏事件
- 多外设可以并行工作
二、NVIC 嵌套向量中断控制器
2.1 什么是 NVIC
**NVIC(Nested Vectored Interrupt Controller)**是 ARM Cortex-M 内核提供的中断控制器,负责:
- 管理和配置所有外设中断
- 处理中断优先级
- 向量中断跳转
- 支持中断嵌套和咬尾(Tail-Chaining)机制
STM32F103 系列支持84个中断(具体数量因型号而异)。
2.2 NVIC 基本结构
┌─────────────────────────────┐
│ 内核 (Cortex-M3) │
└──────────────┬──────────────┘
│
┌──────────────┴──────────────┐
│ NVIC │
│ ┌─────────────────────┐ │
│ │ 中断使能寄存器 │ │
│ │ (ISER) │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ 中断除能寄存器 │ │
│ │ (ICER) │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ 优先级寄存器 │ │
│ │ (IPR[0-83]) │ │
│ └─────────────────────┘ │
└──────────────┬──────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌────────┴────────┐ ┌────────┴────────┐ ┌────────┴────────┐
│ EXTI (外部) │ │ TIM2 (定时器) │ │ USART1 (串口) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
2.3 中断通道(IRQn)
STM32F103 的常用中断通道:
| IRQn | 说明 | 优先级 |
|---|---|---|
| WWDG_IRQn | 窗口看门狗中断 | 最高 |
| PVD_IRQn | PVD中断 | |
| TIM1_BRK_IRQn | TIM1刹车中断 | |
| TIM1_UP_IRQn | TIM1更新中断 | |
| TIM1_TRG_COM_IRQn | TIM1触发/通信中断 | |
| TIM1_CC_IRQn | TIM1捕获比较中断 | |
| TIM2_IRQn | TIM2全局中断 | |
| TIM3_IRQn | TIM3全局中断 | |
| TIM4_IRQn | TIM4全局中断 | |
| I2C1_EV_IRQn | I2C1事件中断 | |
| I2C1_ER_IRQn | I2C1错误中断 | |
| SPI1_IRQn | SPI1中断 | |
| USART1_IRQn | USART1全局中断 | |
| USART2_IRQn | USART2全局中断 | |
| EXTI0_IRQn | 外部中断0 | |
| EXTI1_IRQn | 外部中断1 | |
| ... | ... | |
| EXTI15_10_IRQn | 外部中断10-15 | 最低 |
三、中断优先级
3.1 优先级分组
STM32 使用4位二进制表示优先级(0~15,数字越小优先级越高)。
NVIC 支持优先级分组,将优先级分为抢占优先级和响应优先级:
| 分组 | 抢占优先级 | 响应优先级 | 说明 |
|---|---|---|---|
| NVIC_PriorityGroup_0 | 0位 | 4位 |