单片机关于中断的理解

发布于:2025-09-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

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

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

这就是中断的精髓!

💡 专业术语解释如下:

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

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


二、为什么需要中断?

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

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

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


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

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

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

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

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

例如:

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

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


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

🌐 中断系统的组成:

  1. 中断源:产生中断请求的事件(如外部按键、定时器溢出等)
  2. 中断控制器:管理多个中断源、优先级、屏蔽等(如 NVIC)
  3. 中断向量表:中断发生后,CPU查找服务函数的跳转地址
  4. 中断服务函数(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 允许外部中断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位响应(允许嵌套)

九、总结一句话

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



网站公告

今日签到

点亮在社区的每一天
去签到