中断到底是什么?用生活例子讲透单片机中断的底层逻辑,小白也能懂

1.中断的基本概念

这里,我们以一个例子说明中断的概念和功能,想象一下,我们之前使用串口外设接收数据的例程,需要使用 UART.any()方法一直判断外部是否有可以读取的数据,这种方法在只有代码流程少、调用外设少的情况下可以使用,若是我们在原有程序基础上加入驱动 LCD 屏幕显示数据、对运动数据进行数字滤波、使用 USB 协议与 PC 端进行交互、将程序运行日志保存到外部 Flash 等代码后,程序运行时间会大大增加,在两次调用 UART.any()方法获取串口状态的间隔中,很有可能陀螺仪已经将许多数据发送到串口上使得串口的 FIFO 存储器溢出了。这时,我们需要中断,所谓中断的作用就是当串口外设上一旦有可接收的数据,便会调用预先设定好的中断回调函数来接收数据并进行相应处理。

再举一个我们之前使用 GPIO 读取外部按键按下的例子,使用外部中断方法和轮询方法二者的区别如下图所示:
image.png

将以上的例子扩展开来,我们可以得到轮询和中断两种不同的程序执行模式:

  • 轮询 Polling​:​若程序在执行某项任务之前需要等待特定状态变更的发生,则在循环中周期性地检查该状态。编程简单、逻辑清晰,缺点是当两次检查间隔过长时,可能会忽略间隔中间状态的变更,同时大部分检查是无意义的(有可能很长时间才有几次状态变更,大部分检查的情况中程序状态不会变更)。
  • 中断 Interrupts​:​在此机制下,一旦状态发生变更,便会触发一个中断信号,使 CPU 能够立即暂停当前任务(同时保存其当前状态),转而执行与中断相关的处理程序,并在处理完毕后恢复先前的任务状态,继续执行。这种方法不仅提高了系统的响应速度,还确保了资源的高效利用。

简单来说,中断是 MCU 处理‘突发任务’的核心机制 —— 比如定时器到点、串口收到数据、传感器触发信号时,不能等核心‘忙完手头的活’再处理,这时候中断会‘打断’核心当前的操作,优先处理紧急任务。而 NVIC(嵌套向量中断控制器)是每个核心的‘中断调度员’,负责管理中断的优先级和执行顺序

2.中断的类型

中断可以源自 MCU 内部和 MCU 外部设备,简单来说,可以分为 GPIO 外部中断、外设中断、内核中断:

  • ​外部中断:​来源为 GPIO 引脚上的电平变化信号,由连接到 MCU 的 IRQ 引脚的外部设备触发。当产生电平的变化信号后(如上升沿、下降沿、高 / 低电平保持,对应之前讲解的 GPIO 中断触发类型),GPIO 的外部中断控制器检测到中断信号,然后将对应的中断信号发给 NVIC 中断向量控制器。
  • ​外设中断:​来自片上外设(内部定时器、SPI、UART 等)的中断,当外设的工作状态发生变化时(例如 UART 上检测到有数据可以接收),这些中断信号会直接传输到 NVIC 嵌套中断向量控制器。
  • ​内核中断:​来自于 CPU 内部的信号,主要包括陷入 trap 指令、故障 fault 指令和终止 abort 指令,大多数都是 CPU 执行指令时产生了错误或硬件故障。
    image.png

3.NVIC 嵌套中断向量控制器

NVIC 嵌套中断向量控制器的主要作用是处理中断,负责管理中断的优先级和执行顺序:

  • 所有来自 GPIO、外设、内核的中断请求,都需要经过 NVIC 的统一协调和分发,才能被 CPU 处理;
  • 就像公司的前台调度员,所有来访的客户(中断请求)都要先经过前台,由前台根据客户的紧急程度,安排对应的员工(CPU)进行接待。

NVIC 包含一个中断向量表,这是 CPU 处理中断的 “核心导航工具”。简单来说,中断向量表是按照中断类型号从小到大的顺序排列的表格,表格中每一个条目都对应着一种中断类型,存储了该中断对应的中断向量和中断服务例程(ISR)的地址:

  • 中断服务例程就是专门处理该中断的程序,而地址则是这个程序在内存中的位置;
  • 当收到某个中断信号(比如 UART 有数据可接收)时,CPU 不需要逐个查找处理程序,只需要根据中断类型号,直接在中断向量表中找到对应的程序地址,就能立刻跳转到中断服务例程执行,极大提升了中断处理的效率。

NVIC 的 “嵌套” 是其核心特性之一,也是它区别于普通中断控制器的关键,所谓 “嵌套”,是指 NVIC 允许用户为每一种中断设置优先级:

  1. 当 CPU 正在处理一个低优先级的中断时,如果此时有更高优先级的中断请求到来,NVIC 会让高优先级的中断 “抢占” CPU 的控制权 ,也就是暂停当前低优先级中断的处理,优先执行高优先级中断的服务例程;
  2. 等高等优先级中断处理完成后,CPU 再回到之前被暂停的低优先级中断处,继续完成剩余的处理工作。

这个过程就叫做中断嵌套。这种机制保证了系统中最紧急的事件(比如硬件故障、重要数据接收)能够被优先处理,避免因低优先级事件占用 CPU 而导致紧急事件被延误。

此外,NVIC 还具备 中断屏蔽(禁用)的功能:它会记录哪些中断被用户设置为 “屏蔽状态”,对于这些被屏蔽的中断,NVIC 会直接忽略其请求,不会将其传递给 CPU,这就像前台可以拒绝接待被列入黑名单的客户,确保 CPU 不会被不必要的中断打扰。

当有中断请求产生并经过 NVIC 的调度后,CPU 会按照固定的步骤处理中断,整个过程就像你正在写文档时,突然收到紧急邮件提醒,处理完邮件后再回到文档继续编写:
image.png
其固定流程如下:

  1. 正常执行程序​:CPU 原本按照顺序执行用户的主程序,并且会在执行完每一条指令后,主动检查 NVIC 是否有中断请求需要处理;
  2. 暂停当前程序​:当 CPU 检测到 NVIC 传递的中断信号时,会立刻停止执行当前的主程序;
  3. 保存程序状态​:CPU 会自动将当前主程序的执行进度、寄存器数据等关键信息保存起来,确保后续能准确回到中断的位置继续执行;
  4. 查找并执行中断服务例程​:CPU 根据中断信号的类型号,查询中断向量表,找到对应的中断服务例程的地址,然后加载并执行这个处理程序;
  5. 恢复程序状态​:中断服务例程执行完成后,CPU 会自动将之前保存的主程序状态恢复;
  6. 恢复执行主程序​:CPU 回到被中断的位置,继续执行原来的主程序。

完成此处理后,CPU 自动恢复保存的信息并从停止处继续执行程序。

下图为用户程序切换到中断服务程序的状态转换图:
image.png

posted @ 2026-08-31 16:05  FreakStudio  阅读(15)  评论(0)    收藏  举报