一、什么是中断?——通俗易懂的理解
我们先用一个生活中的例子来引入:
你正在写博客,突然老板发来一条消息要你立刻处理一个紧急任务。于是你暂停手中的博客工作,先完成老板的任务,之后再回去接着写博客。
这就是中断的精髓!
💡 专业术语解释如下:
- 中断源:老板的消息 —— 触发了中断
- 中断响应:你暂停写博客 —— CPU响应中断
- 中断服务:去处理老板的任务 —— 中断服务程序(ISR)
- 中断返回:回来继续写博客 —— 中断处理结束,回到原任务
这整个过程在单片机中就叫中断机制:当程序执行中有更紧急的事件发生,CPU会“打断”当前任务,转而处理那个更紧急的任务,处理完再回来继续原来的程序。
二、为什么需要中断?
在嵌入式系统中,有许多事件是突发的或随机的,比如:
- 外部按键被按下
- 串口收到了数据
- 传感器发生状态变化
- 定时器超时
如果我们用轮询的方式去检测这些事件,不但效率低,而且容易错过时机。而中断机制可以及时捕捉这些突发事件,提升响应效率,是嵌入式系统的核心机制之一。
三、线程和中断的关系(更深入理解)
虽然大多数单片机程序是单线程执行,但我们可以用线程的概念来更好理解中断:
- 主程序 = 主线程
- 中断服务程序 = 插队线程
中断就像是插队的线程,执行完后再返回主线程继续运行。
虽然单片机只有一个CPU(通常是单核),但通过中断配合“时间分片”,可以实现“看起来像多线程”的运行效果。
例如:
主程序:读取温度传感器 → 更新显示屏 → 写日志
中断A:每隔1秒触发,采集温度数据
中断B:串口接收到命令时立即响应
中断机制让单片机可以处理多个任务而不会错过任何重要事件。
四、中断的基本构成与流程
🌐 中断系统的组成:
- 中断源:产生中断请求的事件(如外部按键、定时器溢出等)
- 中断控制器:管理多个中断源、优先级、屏蔽等(如 NVIC)
- 中断向量表:中断发生后,CPU查找服务函数的跳转地址
- 中断服务函数(ISR):响应中断的程序逻辑代码
🔁 中断处理流程:
程序正常运行中...
↓
中断源事件发生(如按键)
↓
CPU暂停当前任务,保存上下文
↓
执行中断服务函数(ISR)
↓
ISR执行完毕,恢复上下文
↓
程序继续执行被打断的主任务
五、中断优先级与嵌套
如果多个中断同时发生,CPU应该先处理谁?
这就涉及到了中断优先级。
举个例子:
- 你正在写博客(主程序)
- 老板发来消息(中断A)
- 同时老婆也发来任务(中断B)
你优先处理哪个?当然是老婆的任务!说明老婆的中断优先级更高。
中断嵌套:
如果你正在执行一个低优先级的中断任务时,一个高优先级的中断来了,它可以打断正在执行的中断,先执行自己,再返回原来的中断任务继续执行。
六、常见中断类型
中断类型 | 来源 | 说明 |
---|---|---|
外部中断 | 来自外部引脚跳变 | 如按键中断 |
定时器中断 | 定时时间到 | 如周期执行 |
串口中断 | 串口收发数据完成 | 如命令通信 |
ADC中断 | 模拟信号转换完成 | 传感器读取 |
DMA中断 | 数据传输完成 | 高速数据搬运 |
七、实战:51单片机 外部中断示例
🎯 目标:
按下按键 K3 → LED 状态翻转
🔧 示例代码解析:
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k3 = P3^2; // 按键接在 P3.2(INT0)
sbit led = P2^0; // LED 接在 P2.0
// 延时函数(用于消抖)
void delay(u16 i) {
while(i--);
}
// 中断初始化函数
void Int0Init() {
IT0 = 1; // 设置为下降沿触发
EX0 = 1; // 开启外部中断0
EA = 1; // 开启总中断
}
void main() {
Int0Init(); // 初始化中断
while(1); // 主循环空转等待中断
}
// 外部中断0 服务函数
void Int0() interrupt 0 {
delay(1000); // 消抖
if (k3 == 0) {
led = ~led; // 翻转LED状态
}
}
📌 注意:
IT0=1
设置为下降沿触发(按下时引脚电平从高→低)EX0=1
允许外部中断0EA=1
总中断使能- ISR 函数名为
Int0()
,interrupt 0
表示它是中断号0
八、STM32 中断机制补充(入门 STM32 必看)
1️⃣ 中断配置步骤简要总结:
- 配置引脚为输入模式(上拉/下拉/浮空)
- 配置引脚与中断线映射关系(EXTI 与 GPIO 映射)
- 设置触发方式(上升沿、下降沿、双边沿)
- 使能中断线
- 配置 NVIC 中断控制器(设置抢占优先级与响应优先级)
- 编写中断服务函数(ISR)
2️⃣ STM32 的两个中断优先级概念:
名称 | 作用说明 |
---|---|
抢占优先级 | 能不能打断别的中断 |
响应优先级 | 抢占优先级一样时,谁先被响应执行 |
优先级数值越小,等级越高!
例如:抢占优先级 = 1,响应优先级 = 2
比 抢占优先级 = 2,响应优先级 = 0 的中断 优先级更高
3️⃣ NVIC优先级分组(重要)
NVIC 的优先级分组决定了抢占优先级和响应优先级的位数分配,比如:
- 分组0:4位全是响应优先级(不允许中断嵌套)
- 分组3:2位抢占 + 2位响应(允许嵌套)
九、总结一句话
中断是一种“随叫随到”的任务机制,能让单片机灵活地处理中断性事件,是嵌入式开发中不可或缺的重要机制。