5.1 中断系统概述

基本概念

  • 中断 (Interrupt): 程序执行过程中, 允许外部或内部事件通过硬件打断程序的执行, 使其转向为处理外部或内部事件的中断服务程序中去; 完成中断服务程序后, CPU继续原来被打断的程序, 这样的过程称为中断响应过程。
    • 💡
      中断可以实现计算机资源的共享,是单片机进行实时控制(因为定时器中断很准确)以及多任务处理的基础
    • 中断响应过程图示:
      • 主程序执行 -> 中断请求 (断点) -> 响应中断请求 -> 执行中断服务程序→ (RETI) -> 返回主程序 -> 继续执行主程序
      • notion image
  • 中断源 (Interrupt Source): 能产生中断的外部和内部事件。
  • 中断优先级 (Interrupt Priority): CPU用来区分优先处理的中断。
  • 中断嵌套 (Interrupt Nesting): 优先级高的事件可以中断CPU正在处理的低级的中断服务程序, 待完成了高级中断服务程序之后, 再继续被打断的低级中断服务程序。

中断的功能

  • 实现CPU与外设的速度配合
  • 实现实时控制
  • 实现故障的及时处理
  • 实现人机联系

5.2 80C51的中断系统

80C51的中断系统包括: 中断源中断标志位、中断允许寄存器IE中断优先级寄存器IP中断矢量等。
在80C51中, 只有两级中断优先级

80C51的中断系统结构示意图

  • 展示了中断标志位、中断允许寄存器 (IE)、中断优先级寄存器 (IP) 与五个中断源 (INT0, T0, INT1, T1,串行口) 的连接关系。
      1. 中断源改变中断标志位;
      1. 每个机器周期去检查中断标志位,决定是否进入中断
      1. 中断有总开关EA与每个中断各自的小开关
      1. IP决定不同中断的优先级
notion image

中断源

80C51有5个中断源 (80C52增加一个T2)。
中断源
中断矢量地址
外部中断0 (INT0)
0003H
定时器/计数器0 (T0)
000BH
外部中断1 (INT1)
0013H
定时器/计数器1 (T1)
001BH
串行口 (RI、TI)
0023H
定时器/计数器2 (T2)
002BH
(注: 定时器/计数器2是80C52增加的)

中断源分类:

  • 外中断类: 外中断请求信号可以是电平或脉冲, 可以通过控制位设置。
    • 一些外设请求的中断(例如按钮、键盘),用于人机交互
  • 定时中断类: 定时/计数器溢出产生。
  • 串行中断类: 串行口接收或发送完一帧数据产生。

中断矢量 (Interrupt Vector):

  • 当CPU响应中断时, 由硬件直接产生一个固定的地址, 即矢量地址, 指出每个中断源设备的中断服务程序的入口, 这种方法通常称为矢量中断
  • 每个中断源分别有自己的中断服务程序, 而每个中断服务程序又有自己的矢量地址
    • 中断源
      中断矢量地址
      外部中断0 (INT0)
      0003H
      定时器/计数器0 (T0)
      000BH
      外部中断1 (INT1)
      0013H
      定时器/计数器1 (T1)
      001BH
      串行口 (RI、TI)
      0023H
      定时器/计数器2 (T2)
      002BH
  • CPU识别出某个中断源时, 由硬件直接给出一个与该中断源相对应的矢量地址, 从而转入各自中断服务程序
因为矢量地址之间的空间非常有限,不能实现复杂操作。所以在这些矢量地址通常放置一条跳转指令,以将CPU重定向到你实际的、更完整的中断服务程序

5.3 中断的控制

中断标志位TCON/SCON

notion image
  • INT0, INT1, T0及T1的中断标志存放在TCON (定时器/计数器控制) 寄存器中;
  • 串行口的中断标志存放在SCON (串行口控制) 寄存器中

定时控制寄存器 TCON (地址88H, 位地址8FH~88H):

虽然名称是TCON,但是实际上包含了外部中断控制定时器中断控制两部分的功能
位地址
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
位符号
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
 
  • TF1 (TCON.7): 定时器1溢出标志。
    • 溢出意味着定时器完成了定时任务,产生了中断请求
    • 当CPU响应了T1的中断请求,硬件会自动将TF1清零,撤销中断请求
  • TF0 (TCON.5): 定时器0溢出标志。与TF1类似,但用于定时器0。
  • TR1 (TCON.6): 定时器1运行控制位1为启动定时器1计数,0为停止。软件可以通过设置此位来控制定时器的启动和停止,达到精确控制定时功能的目的。复位后TR1=0。
  • TR0 (TCON.4): 定时器0运行控制位。与TR1功能相同,但控制定时器0。
  • IE1 (TCON.3): 外部中断1标志位。当外部中断1事件发生时由硬件置位。
  • IE0 (TCON.1): 外部中断0标志位。与IE1类似,但用于外部中断0。
  • IT1 (TCON.2): 外部中断1的触发方式控制位。如果为0,则为电平触发(低电平有效)。如果为1,则为边沿触发(下降沿有效)。
  • IT0 (TCON.0): 外部中断0的触发方式控制位。逻辑与IT1相同。

串行口控制寄存器 SCON (地址98H, 位地址9F~98H):

位地址
9FH
9EH
9DH
9CH
9BH
9AH
99H
98H
位符号
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
 
  • TI (Transmit Interrupt): 串行口发送中断请求标志位。
  • RI (Receive Interrupt): 串行口接收中断请求标志位。
  • 中断响应后用软件对TI、RI标志清0

中断允许和禁止IE(Interrupt Enable)❗

中断允许控制寄存器 IE (地址A8H, 位地址AFH~A8H):
位地址
AF
AE
AD
AC
AB
AA
A9
A8
位符号
EA
/
/
ES
ET1
EX1
ET0
EX0
 
  • EA (Enable All): 中断允许总控制位。1为中断总允许, 0为中断总禁止。
  • EX0、EX1: 外部中断0、1允许控制位。
  • ET0、ET1: 定时/计数器0、1中断允许控制位。
  • ES: 串行中断允许控制位。
    • 0为禁止对应的中断, 1为允许对应的中断。
    • CPU复位后, IE=00H, 即禁止所有中断
区分ET0,ET1/TR0,TR1:
特性
TR0 / TR1
ET0 / ET1
寄存器
TCON (定时器控制寄存器)
IE (中断允许寄存器)
控制目标
定时器/计数器本身的运行/停止
定时器溢出事件是否产生中断请求
核心作用
启动或停止计数过程
允许或禁止中断
与中断的关系
间接相关 (定时器运行并溢出是产生中断的前提)
直接相关 (决定了溢出后是否能触发中断)
独立性
定时器可以运行 (TRx=1) 但不产生中断 (ETx=0)
定时器中断能否发生,不仅取决于ETx,还取决于总中断EA位

中断优先级 (Interrupt Priority)❗

80C51有高、低两个中断优先级, 通过中断优先级寄存器IP来设定。

中断优先级控制寄存器 IP (地址B8H, 位地址BF~B8H):

位地址
BF
BE
BD
BC
BB
BA
B9
B8
位符号
/
/
/
PS
PT1
PX1
PT0
PX0
  • PX0、PX1: 外部中断0、1优先级设定位。
  • PT0、PT1: 定时器0、1中断优先级设定位。
  • PS: 串行中断优先级设定位。
  • 0为优先级低, 1为优先级高

中断优先级控制原则和控制逻辑

  1. 低优先级中断请求不能打断高优先级的中断服务。高优先级中断请求可以打断低优先级的中断服务。
  1. 在中断服务程序运行中, 不响应同级的其它中断请求
  1. 在主程序运行中, 同级的多个中断请求同时出现时, 响应次序为:
    1. 外中断0 -> 定时中断0 -> 外中断1 -> 定时中断1 -> 串行口中断。
 

外部中断触发方式: 2种

  • 电平触发方式IT1、 IT0=0:
    • 低电平有效。由TCON寄存器的IT1 (TCON.2) 及IT0 (TCON.0) 控制。低电平有效信号, 应一直保持到CPU响应中断为止。
  • 跳变触发方式 IT1、 IT0=1:
    • 电平发生由高到低的跳变 (负跳变) 时触发。信号高、低电平应至少各保持一个机器周期。

中断请求的撤除❗

中断请求被响应后, 转向中断服务程序执行, 在其执行中断返回指令 (RETI) 之前, 中断请求信号必须撤除, 否则将会再一次引起中断而出错。
  1. 单片微机内部硬件自动复位:
      • 定时器/计数器T0、T1中断 (TF0, TF1标志)。
      • 采用脉冲触发方式的外部中断请求 (IE0, IE1标志)。
  1. 用软件指令清除相应标志:
      • 串行中断RI、TI❗
      • 80C52的TF2, EXF2 (T2CON寄存器)。
  1. 用软件、硬件结合清除相应标志:
      • 采用电平触发方式的外部中断请求。尽管中断标志 (IE0, IE1) 的撤消是硬件自动的, 但中断请求信号的低电平可能继续存在, 在以后机器周期采样时又会把已清“0”的IE0、IE1标志重新置“1”, 再次申请中断。为保证在CPU响应中断后、执行返回指令前, 撤除中断请求, 必须保证在中断响应后把中断请求信号从低电平强制改变为高电平。
      • 硬件置位, 硬、软件结合清除的例子: (参考课件图示和代码)
        • 使用D触发器和P1口控制外部中断请求信号的撤销。
        • notion image

5.4 中断响应过程和响应时间

中断响应过程:

中断采样:

  • 针对外部中断信号需要中断采样;
  • 针对内部中断源, 直接置位TCON或SCON中的中断请求标志。
  • 每个机器周期的S5P2 (第五状态的第二节拍) 期间, 各中断标志采样相应的中断源, 并置入相应标志
notion image

中断查询:

  • CPU每个机器周期的S6状态按优先级的顺序依次查询中断标志位。查询到标志位为1, 则在下一个机器周期的S1状态响应中断。
    • 当一个指令需要多个机器周期去完成,即使查询到了中断请求,单片机也会先完成当前指令然后进入中断
notion image

中断响应:

  1. 中断响应的过程:
      • 硬件自动生成 LCALL addr16 指令。
      • 将PC (程序计数器) 值压栈, 将中断矢量地址 (addr16) 装入PC。
  1. 中断不立即响应的情况:
      • CPU正处在同级或高一级的中断服务中。
      • 查询中断请求的机器周期不是当前指令的最后一个机器周期 (确保指令完整执行)。
        • 例如:MUL AB
      • 当前执行的是RETI或访问IE、IP的指令。

中断的执行过程与子程序调用的比较:

  • 相似点:
      1. 都是中断当前正在执行的程序, 转去执行子程序或中断服务程序。
      1. 都是由硬件自动地把断点地址压入堆栈, 然后通过软件完成现场保护
      1. 执行完子程序或中断服务程序后, 都要通过软件完成现场恢复, 并通过执行返回指令, 重新返回到断点处, 继续往下执行程序。
      1. 二者都可以实现嵌套, 如中断嵌套和子程序嵌套。
  • 差别:
      1. 中断请求信号可以由外部设备发出, 是随机的 (如故障、按键); 子程序调用是由软件编排好的。
      1. 中断响应后由固定的矢量地址转入中断服务程序; 子程序地址由软件设定。
        1. 虽然在矢量地址处一般还会有一个长跳转调用子程序
      1. 中断响应是受控的, 其响应时间会受一些因素影响; 子程序响应时间是固定的。
      1. 中断响应自动屏蔽该级别的中断允许, 返回必须用RETI, 否则再也不能进入该级别或者更低级别的中断
        1. 它会解除单片机对该级别或更低级别中断的自动屏蔽

中断响应时间

中断响应时间指的是从中断源发出中断请求,到CPU开始执行中断服务程序的第一条指令所需要的全部时间。
这个时间不是一个固定值,它有一个最短时间和最长时间,具体耗时取决于CPU在收到中断请求时“正在忙什么”。
事件
时间
说明
中断请求标志位查询
1个机器周期
CPU在每个机器周期末尾检查中断标志,这是响应的起点。
执行LCALL指令
2个机器周期
硬件自动执行,用于保护断点并跳转到中断服务程序。
中断响应最短时间
3个机器周期
CPU执行RETI或访问IP、IE指令
额外2个机器周期
为确保中断系统稳定,执行完这类指令后还要再执行一条普通指令才能响应中断。
CPU执行乘法或除法指令
额外4个机器周期
这是8051最长的指令,CPU必须等它执行完才能响应中断。
中断响应最长时间
8个机器周期
(RETI+DIV/MUL+LCALL)(中断请求标志位查询RETI时一并完成了)

5.5 外部中断源的扩展

通过OC门线或实现 (逻辑或):

  • 多个中断源通过OC门 (或反相器加与门) 连接到一个外部中断输入引脚 (如INT0)。
    • notion image
  • 外部中断采用电平触发方式。
  • 在中断服务程序中通过软件查询P1口等IO口的状态来确定具体的请求源。
  • 外部中断源查询流程图示例: (参考课件图示)
    • 进入中断后, 依次判断P1.0, P1.1, P1.2...等引脚的状态, 跳转到对应的中断服务处理。
    • notion image

通过片内定时器/计数器来实现:

  • 使用定时器/计数器方式2 (8位自动重装载)。
  • 计数初值为FFH。
  • 外部中断请求信号接计数输入端T0或T1。当外部信号使计数器溢出时产生定时器中断。
  • 中断服务程序的地址按定时器中断入口地址存放。
  • (具体细节将在第六章后讨论)

5.7 中断服务程序的设计

中断程序

中断程序一般包含两部分:
  • 中断控制程序 (中断初始化程序): 一般不独立编写, 而是包含在主程序中, 根据上述5点通过编写几条指令来实现。
  • 中断服务程序 (Interrupt Service Routine, ISR)

中断初始化程序

中断初始化需要设置的内容 (5点):

  1. 中断服务程序入口地址的设定 (通常通过中断矢量表中的跳转指令)。
  1. 某一中断源中断请求的允许与禁止 (设置IE寄存器)。
  1. 对于外部中断请求, 还需进行触发方式的设定 (设置TCON寄存器中的ITx位)。
  1. 对于定时器中断,还要启动定时器运行(设置TCON寄存器中的TR0,TR10
  1. 各中断源优先级别的设定 (设置IP寄存器)
  1. CPU开中断与关中断 (设置IE寄存器中的EA位)。

示例: 初始化程序段

  • 要求: 设置外部中断INT0和串行接口中断为高优先级, 外部中断INT1为低优先级。屏蔽T0和T1中断请求。
  • 编程思路:
    • IP寄存器: 第0位 (PX0) 和第4位 (PS) 置1, 其余位为0。 MOV IP, #00010001B
    • IE寄存器: 第0位 (EX0), 第2位 (EX1), 第4位 (ES), 第7位 (EA) 置1, 其余位为0 (ET0, ET1应为0以屏蔽T0, T1)。 MOV IE, #10010101B (允许INT0, INT1, 串行口中断, 开CPU总中断)
  • 程序结构: (注: 课件中IE寄存器设置 #10010101B 对应 EA=1, ES=1, EX1=1, EX0=1, 屏蔽了ET1和ET0, 符合题目要求)
    • 代码段

中断服务程序 (ISR)

  • 是一种为中断源的特定事态要求服务的独立程序段, 以中断返回指令RETI结束。
  • 中断矢量地址 (0003H, 000BH, 0013H, 001BH, 0023H, 002BH) 通常存放一条无条件转移指令, 跳转到程序存储器其它部位的实际中断服务程序。
  • 随机性: 中断响应具有随机性。

保护断点和现场、恢复断点和现场

  • 断点的保护 (PC值入栈) 主要由硬件电路自动实现
  • 现场数据的保护 (如ACC, PSW, 使用的寄存器等) 需要指令完成 (PUSH指令), 位于中断服务程序的前面。
  • 结束中断服务程序返回断点处之前要恢复现场 (POP指令)。
  • 示例: 现场保护与恢复
    • 代码段
 

本章小结

  • 掌握80C51的5个中断源及其对应的中断矢量。
  • 掌握中断相关的初始化及特殊功能寄存器 (SFR) 的设定 (IE, IP, TCON, SCON)。
  • 理解中断响应的过程。
  • 掌握编写中断服务程序的技能 (包括现场保护与恢复, RETI指令的使用)。
 
Loading...
Z_cosy
Z_cosy
浙江大学电气工程学院本科生
公告
🎉Welcome to Z-cosy🎉
-- 食用指南 ---
目前只有课程笔记以及电控学习笔记
陆续会整理更多内容!
目录
0%