扩展:中断系统介绍

扩展:中断系统介绍

1. 中断概念

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在, 很大程度上提高了单片机处理外部或内部事件的能力。 它也是单片机最重要的功能之一, 是我们学习单片机必须要掌握的。 很多初学者被困在中断中, 学了很久仍然不知道中断究竟是如何运作的。 千万不要认为它有多难,其实只要掌握正确的学习方法, 没有哪个知识点是学不会的。

为了能让大家更容易理解中断概念, 我们先来举一个生活事例: 你打开火,烧上一壶水。 然后去洗衣服, 在洗衣服的过程中, 突然听到水壶发出水开的报警声, 这时, 你停止洗衣服动作, 立即去关掉火, 然后将开水灌入暖水瓶中, 灌完开水后, 你又回去继续洗衣服。 这个过程中实际上就发生了一次中断。

对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B,请求 CPU 迅速去处理(中断发生); CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务); 待 CPU 将事件 B 处理完毕后, 再回到原来事件 A 被中断的地方继续处理事件 A(中断返回), 这一过程称为中断。

再回来看前面讲的生活事例, 与单片机中断结合分析, 你的主任务是洗衣服,水开报警这是一个中断请求, 这一时刻相当于断点处, 你响应中断去关火, 然后将开水灌入暖水瓶中, 这一动作实际上就是处理中断程序, 灌完开水后再回去继续洗衣服, 相当于处理完中断程序后再返回主程序继续执行主程序。 这里需要注意的是, 水开是随时都有可能的, 但是无论什么时候开, 只要一开你将立即去处理它, 处理完后再回来继续接着洗刚才那件衣服。 单片机在执行程序时, 中断也随时有可能发生, 但无论何时发生, 只要一旦发生, 单片机将立即暂停当前程序,赶去处理中断程序, 处理完中断程序后再返回刚才暂停处接着执行原来的程序。

单片机在执行程序时其程序流程图如下:

屏幕截图 2024 06 23 083240

引起 CPU 中断的根源称为中断源。 中断源向 CPU 提出中断请求, CPU 暂时中断原来的事务 A, 转去处理事件 B, 对事件 B 处理完毕后, 再回到原来被中断的地方(即断点), 称为中断返回。 实现上述中断功能的部件称为中断系统(中断机构)。

当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求, 要求CPU 暂停当前的工作, 转而去处理这个紧急事件, 处理完以后, 再回到原来被中断的地方, 继续原来的工作, 这样的过程称为中断。 实现这种功能的部件称为中断系统, 请示 CPU 中断的请求源称为中断源。 微型机的中断系统一般允许多个中断源, 当几个中断源同时向 CPU 请求中断, 要求为它服务的时候, 这就存在CPU 优先响应哪一个中断源请求的问题。 通常根据中断源的轻重缓急排队, 优先处理最紧急事件的中断请求源, 即规定每一个中断源有一个优先级别。 CPU 总是先响应优先级别最高的中断请求。

当 CPU 正在处理一个中断源请求的时候(执行相应的中断服务程序), 发生了另外一个优先级比它还高的中断源请求。 如果 CPU 能够暂停对原来中断源的服务程序, 转而去处理优先级更高的中断请求源, 处理完以后, 再回到原低级中断服务程序, 这样的过程称为中断嵌套。 这样的中断系统称为多级中断系统, 没有中断嵌套功能的中断系统称为单级中断系统。

中断的开启与关闭、 设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的, 在前面章节的学习中我们仅对单片机 IO 口操作过( 实际上操作 IO 口即操作 IO 口寄存器, 只不过编译器已经帮我们把 IO 口寄存器封装好直接操作 IO 即可, 这些可在 51 单片机头文件内查看) , 从本章开始就会介绍单片机内部更多的特殊功能寄存器以及如何配置它实现相应的功能。

2. 中断结构及相关寄存器

2.1 中断结构

STC89C5X 系列单片机提供了 8 个中断请求源, 它们分别是: 外部中断O(INTO)、 外部中断 1(INT1)、 外部中断 2(INT2)、 外部中断 3(INT3)、 定时器 0 中断、 定时器 1 中断、 定时器 2 中断、 串口(UART)中断。 ( 注意: 51 系列单片机一定有基本的 5 个中断, 但不全有 8 个中断, 需要查看芯片手册, 通常我们使用的都是基本的 5 个中断: INT0、 INT1、 定时器 0/1, 串口中断) 。 所有的中断都具有四个中断优先级( 基本型只有两个) 。 用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求, 也可以用打开相应的中断允许位来使 CPU 响应相应的中断申请。 其中有些中断源可以用软件独立地控制为开中断或关中断状态。 每一个中断的优先级别均可用软件设置。 高优先级的中断请求可以打断低优先级的中断, 反之, 低优先级的中断请求不可以打断高优先级及同优先级的中断。 当两个相同优先级的中断同时产生时, 将由查询次序来决定系统先响应哪个中断。 STC89C5X 系列单片机的各个中断查询次序表如下图所示:

屏幕截图 2024 06 23 084041

通过设置新增加的特殊功能寄存器 IPH 中的相应位, 可将中断优先级设为四级, 如果只设置 IP 或 XICON, 那么中断优先级就只有两级, 与传统 8051 单片机两级中断优先级完全兼容。 上图中的中断查询次序即为中断号, 这个中断号在编程时非常重要, 当中断来临时, 只有中断号正确才能进入中断。

下面我们以 51 单片机均有的 5 个中断来介绍, 其内部结构框图如下所示:

屏幕截图 2024 06 23 084141

  • INT0 对应的是 P3.2 口的附加功能, 可由 IT0(TCON.0)选择其为低电平有效还是下降沿有效。 当 CPU 检测到 P3.2 引脚上出现有效的中断信号时, 中断标志 IE0(TCON.1)置 1, 向 CPU 申请中断。

  • INT1 对应的是 P3.3 口的附加功能, 可由 IT1(TCON.2)选择其为低电平有效还是下降沿有效。 当 CPU 检测到 P3.3 引脚上出现有效的中断信号时, 中断标志 IE1(TCON.3)置 1,向 CPU 申请中断。

  • T0 对应的是 P3.4 口的附加功能, TF0( TCON.5) ,片内定时/计数器 T0 溢出中断请求标志。 当定时/计数器 T0 发生溢出时, 置位 TF0, 并向 CPU 申请中断。

  • T1 对应的是 P3.5 口的附加功能, TF1( TCON.7) , 片内定时/计数器 T1溢出中断请求标志。 当定时/计数器 T1 发生溢出时, 置位 TF1, 并向 CPU 申请中断

  • RXD 和 TXD 对应的是 P3.0 和 P3.1 口的附加功能, RI( SCON.0) 或 TI ( SCON.1) , 串行口中断请求标志。 当串行口接收完一帧串行数据时置位 RI 或当串行口发送完一帧串行数据时置位 TI, 向 CPU 申请中断。

2.2 中断相关寄存器

2.2.1 中断允许控制

CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。

屏幕截图 2024 06 23 084814

  • EX0(IE.0):外部中断 0 允许位

  • ET0(IE.1):定时/计数器 T0 中断允许位

  • EX1(IE.2):外部中断 0 允许位

  • ET1(IE.3):定时/计数器 T1 中断允许位

  • ES(IE.4):串行口中断允许位;

  • EA (IE.7):CPU 中断允许( 总允许) 位。

2.2.2 中断请求标志TCON

屏幕截图 2024 06 23 085053

  • IT0(TCON.0):外部中断 0 触发方式控制位。当 IT0=0 时, 为电平触发方式。当 IT0=1 时, 为边沿触发方式( 下降沿有效) 。

  • IE0(TCON.1):外部中断 0 中断请求标志位。

  • IT1(TCON.2):外部中断 1 触发方式控制位。

  • IE1(TCON.3):外部中断 1 中断请求标志位。

  • TF0(TCON.5):定时/计数器 T0 溢出中断请求标志位。

  • TF1(TCON.7): 定时/计数器 T1 溢出中断请求标志位。

2.2.3 中断优先级

同一优先级中的中断申请不止一个时, 则有中断优先权排队问题。 同一优先级的中断优先权排队, 由中断系统硬件确定的自然优先级形成, 其排列如所示:

屏幕截图 2024 06 23 085446

2.2.4 中断号

屏幕截图 2024 06 23 085528

2.2.5 中断响应条件

  • 中断源有中断请求;

  • 此中断源的中断允许位为 1;

  • CPU 开中断( 即 EA=1) 。

以上三条同时满足时, CPU 才有可能响应中断。 在使用中断时我们需要做什么呢?

  • 你想使用的中断是哪个? 选择相应的中断号;

  • 你所希望的触发条件是什么?

  • 你希望在中断后干什么呢?

我们以外部中断0为例,代码如下:

EA = 1 // 打开总中断开关
EX0 = 1 // 打开外部中断
IT0 = 0/1; // 设置外部中断的触发方式


// 中断服务函数
void int0() interrupt 0 using 1
{
    // 编写功能代码
}

在中断函数中 int0 是函数名, 可自定义, 但必须符合 C 语言标识符定义规则, interrupt 是一个关键字, 表示 51 单片机中断。 后面的“ 0” 是中断号, 外部中断 0 中断号为 0, 这个可参考前面的内容。 后面的 using 1 可省略不写。

更多内容参考:MCS-51 单片机的中断系统 - 知乎 (zhihu.com)

单片机学习day11—中断系统(外部中断 & 定时器/计数器) - 知乎 (zhihu.com)


2024.8.28 第一次修订,后期不再维护

posted @ 2024-08-28 09:00  hazy1k  阅读(10)  评论(0编辑  收藏  举报