单片机关于中断的理解

一、什么是中断?------通俗易懂的理解

我们先用一个生活中的例子来引入:

你正在写博客,突然老板发来一条消息要你立刻处理一个紧急任务。于是你暂停手中的博客工作,先完成老板的任务,之后再回去接着写博客。

这就是中断的精髓!

💡 专业术语解释如下:

  • 中断源:老板的消息 ------ 触发了中断
  • 中断响应:你暂停写博客 ------ CPU响应中断
  • 中断服务:去处理老板的任务 ------ 中断服务程序(ISR)
  • 中断返回:回来继续写博客 ------ 中断处理结束,回到原任务

这整个过程在单片机中就叫中断机制:当程序执行中有更紧急的事件发生,CPU会"打断"当前任务,转而处理那个更紧急的任务,处理完再回来继续原来的程序。


二、为什么需要中断?

在嵌入式系统中,有许多事件是突发的随机的,比如:

  • 外部按键被按下
  • 串口收到了数据
  • 传感器发生状态变化
  • 定时器超时

如果我们用轮询的方式去检测这些事件,不但效率低,而且容易错过时机。而中断机制可以及时捕捉这些突发事件,提升响应效率,是嵌入式系统的核心机制之一。


三、线程和中断的关系(更深入理解)

虽然大多数单片机程序是单线程执行,但我们可以用线程的概念来更好理解中断:

  • 主程序 = 主线程
  • 中断服务程序 = 插队线程

中断就像是插队的线程,执行完后再返回主线程继续运行。

虽然单片机只有一个CPU(通常是单核),但通过中断配合"时间分片",可以实现"看起来像多线程"的运行效果。

例如:

text 复制代码
主程序:读取温度传感器 → 更新显示屏 → 写日志
中断A:每隔1秒触发,采集温度数据
中断B:串口接收到命令时立即响应

中断机制让单片机可以处理多个任务而不会错过任何重要事件。


四、中断的基本构成与流程

🌐 中断系统的组成:

  1. 中断源:产生中断请求的事件(如外部按键、定时器溢出等)
  2. 中断控制器:管理多个中断源、优先级、屏蔽等(如 NVIC)
  3. 中断向量表:中断发生后,CPU查找服务函数的跳转地址
  4. 中断服务函数(ISR):响应中断的程序逻辑代码

🔁 中断处理流程:

text 复制代码
程序正常运行中...
↓
中断源事件发生(如按键)
↓
CPU暂停当前任务,保存上下文
↓
执行中断服务函数(ISR)
↓
ISR执行完毕,恢复上下文
↓
程序继续执行被打断的主任务

五、中断优先级与嵌套

如果多个中断同时发生,CPU应该先处理谁?

这就涉及到了中断优先级

举个例子:

  • 你正在写博客(主程序)
  • 老板发来消息(中断A)
  • 同时老婆也发来任务(中断B)

你优先处理哪个?当然是老婆的任务!说明老婆的中断优先级更高。

中断嵌套:

如果你正在执行一个低优先级的中断任务时,一个高优先级的中断来了,它可以打断正在执行的中断,先执行自己,再返回原来的中断任务继续执行。


六、常见中断类型

中断类型 来源 说明
外部中断 来自外部引脚跳变 如按键中断
定时器中断 定时时间到 如周期执行
串口中断 串口收发数据完成 如命令通信
ADC中断 模拟信号转换完成 传感器读取
DMA中断 数据传输完成 高速数据搬运

七、实战:51单片机 外部中断示例

🎯 目标:

按下按键 K3 → LED 状态翻转

🔧 示例代码解析:

c 复制代码
#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 允许外部中断0
  • EA=1 总中断使能
  • ISR 函数名为 Int0()interrupt 0 表示它是中断号0

八、STM32 中断机制补充(入门 STM32 必看)

1️⃣ 中断配置步骤简要总结:

  1. 配置引脚为输入模式(上拉/下拉/浮空)
  2. 配置引脚与中断线映射关系(EXTI 与 GPIO 映射)
  3. 设置触发方式(上升沿、下降沿、双边沿)
  4. 使能中断线
  5. 配置 NVIC 中断控制器(设置抢占优先级与响应优先级)
  6. 编写中断服务函数(ISR)

2️⃣ STM32 的两个中断优先级概念:

名称 作用说明
抢占优先级 能不能打断别的中断
响应优先级 抢占优先级一样时,谁先被响应执行

优先级数值越小,等级越高!

例如:抢占优先级 = 1,响应优先级 = 2

比 抢占优先级 = 2,响应优先级 = 0 的中断 优先级更高

3️⃣ NVIC优先级分组(重要)

NVIC 的优先级分组决定了抢占优先级和响应优先级的位数分配,比如:

  • 分组0:4位全是响应优先级(不允许中断嵌套)
  • 分组3:2位抢占 + 2位响应(允许嵌套)

九、总结一句话

中断是一种"随叫随到"的任务机制,能让单片机灵活地处理中断性事件,是嵌入式开发中不可或缺的重要机制。


相关推荐
沉在嵌入式的鱼1 小时前
linux串口对0X0D、0X0A等特殊字符的处理
linux·stm32·单片机·特殊字符·串口配置
学习路上_write1 小时前
AD5293驱动学习
c语言·单片机·嵌入式硬件·学习
影阴2 小时前
存储器和寄存器
stm32·单片机·嵌入式硬件
吃西瓜的年年3 小时前
3. C语言核心语法2
c语言·嵌入式硬件·改行学it
李洛克073 小时前
RDMA CM UDP 通信完整指南
单片机·网络协议·udp
思茂信息3 小时前
CST电动车EMC仿真——电机控制器MCU滤波仿真
javascript·单片机·嵌入式硬件·cst·电磁仿真
小曹要微笑3 小时前
I2C总线技术解析(纯文字版)
单片机·嵌入式硬件·esp32·iic
我送炭你添花3 小时前
可编程逻辑器件(PLD)的发展历程、原理、开发与应用详解
嵌入式硬件·fpga开发
袖手蹲4 小时前
Arduino UNO Q 从 Arduino Cloud 远程控制闪烁 LED
人工智能·单片机·嵌入式硬件·电脑
平凡灵感码头4 小时前
第一次做蓝牙产品,从零开发 嵌入式开发日志(2)AC63NSDK 完整合并版目录说明
stm32·单片机·嵌入式硬件