中断(Interrupt)是一种机制,允许外部或内部事件在发生时打断处理器正在执行的任务,使处理器暂时转移去处理这些事件。
在嵌入式系统中,中断可以是由硬件外设产生的信号,也可以是处理器内部条件触发的事件。处理器在响应中断时,会暂停当前执行的程序,保存上下文,执行特定的中断服务程序(ISR,Interrupt Service Routine),并在处理完中断后恢复并继续执行原来的任务。
中断源
中断源 是引发中断事件的硬件或软件模块。常见的中断源包括以下几类:
- 外部中断:来自外部设备的信号。例如,外部按键、定时器溢出、串口数据接收完成等。
- 内部中断:由处理器内部的模块或条件触发的中断。例如,除法错误、非法指令等。
- 软件中断:通过软件指令触发的中断(例如,系统调用)。
常见的硬件中断源:
- 外部设备:如键盘、鼠标、按键等,通过物理事件引发中断。
- 定时器:定时器溢出(或达到预定计数值)后触发中断,用于定时操作或延时。
- 串口:如 UART 接收到数据后触发中断,以通知 MCU 读取数据。
- ADC(模数转换器):当转换完成时,触发中断通知处理器读取转换结果。
- GPIO(通用输入/输出):输入引脚电平变化(上升沿/下降沿)时触发中断。
中断寄存器
中断寄存器 是用于控制、管理和响应中断的寄存器。通过配置这些寄存器,开发者可以启用或屏蔽特定的中断、设置中断的优先级、读取中断标志等。每种处理器架构通常都有不同的中断控制寄存器,以下是常见的中断寄存器类型:
- 中断屏蔽寄存器(Interrupt Mask Register,IMR):
- 用于启用或禁用特定中断。当某个中断被屏蔽时,即使触发该中断源,也不会导致中断的产生。
- 通过设置相应的位,可以允许某个中断或屏蔽某个中断。
- 中断优先级寄存器(Interrupt Priority Register,IPR):
- 设置不同中断的优先级。通常一个处理器可以处理多个中断,如果多个中断同时触发,处理器会优先响应优先级更高的中断。
- 中断标志寄存器(Interrupt Flag Register,IFR):
- 当某个中断源产生中断时,会在中断标志寄存器中置位,用于标识中断的发生。中断服务程序需要清除这个标志位,以避免中断重复触发。
- 中断控制寄存器(Interrupt Control Register,ICR):
- 管理中断的使能、模式、边沿检测等功能。通过配置该寄存器,开发者可以控制中断触发的条件,如上升沿、下降沿或电平触发。
中断函数
中断函数 或 中断服务程序(ISR,Interrupt Service Routine)是响应中断时执行的代码。当中断发生时,处理器暂停当前执行的任务,跳转到 ISR 处理函数,处理完成后再返回继续执行原来的任务。
中断服务函数通常简洁高效,因为在处理中断的过程中,主程序是暂停的,所以 ISR 的执行时间应尽可能短。
中断函数的特点:
- 无需被显式调用:中断服务函数由硬件触发,不需要手动调用。
- 执行时自动保存上下文:处理器进入中断函数时会自动保存当前上下文(寄存器、程序计数器等),退出时恢复。
- 需要清除中断标志位:在某些平台上,中断服务函数需要手动清除中断标志位,否则该中断会一直重复触发。
中断使系统可以及时响应外部或内部的变化,而不必通过轮询或定时检查的方式,提高了处理效率和系统的实时性。
内部中断
内部中断 是由微控制器或处理器内部的事件触发的中断,通常与内部的硬件模块或处理器状态有关。这类中断不会依赖于外部输入信号,而是依靠 MCU 内部的条件或外设的运行情况来触发。
内部中断的触发方式:
- 定时器溢出:当定时器达到预设值(如定时器计数溢出),会触发定时器中断。
- 模数转换完成:在 ADC(模数转换器)完成数据采集并准备好转换结果时,触发中断通知处理器读取数据。
- 看门狗定时器超时:看门狗定时器用于检测系统是否正常运行,如果看门狗定时器超时,系统会触发中断或复位。
- 串口通信完成:当串口(UART、SPI、I2C)传输或接收数据完成时,触发中断来读取数据或处理错误。
- 软件触发:处理器可以通过执行特定指令(如 ARM 架构中的
SWI
指令)来触发一个软件中断。
外部中断
外部中断 是一种硬件中断机制,用于处理外部设备或信号源的异步事件。由微控制器/处理器外部的物理事件或信号触发的中断,通常由外部设备或电路的输入信号变化导致。
外部中断的触发方式:
- 引脚电平变化:外部设备通过微控制器的 GPIO 引脚发送信号。当某个输入引脚的电平发生变化(上升沿、下降沿、或高低电平),触发外部中断。例如,按钮按下或释放会改变引脚的电平状态,触发中断。
- 外部传感器信号:一些外部传感器(如红外传感器、加速度计)在检测到环境变化时会向 MCU 发送信号,触发中断。
- 外部计数器:某些外部设备会产生计数信号,MCU 可以通过外部中断捕获这些计数值进行处理。
STC8H 实现外部中断
查看数据手册了解中断的触发方式是什么(上升沿、下降沿、或高低电平)
STC8H外部中断表
实现
1 | // main.c |