打印
[其它应用]

单片机中断系统全面解析

[复制链接]
220|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、引言
在单片机的运行过程中,中断系统扮演着极为关键的角色。它能够让单片机在执行主程序的同时,及时响应外部或内部发生的特定事件,暂停当前正在执行的任务,转而执行预先设定好的中断服务程序,处理完中断事件后再返回主程序继续执行。这种机制大大提高了单片机对外部环境变化的响应速度和处理能力,使得单片机能够更加灵活、高效地应对各种复杂的应用场景。



二、中断的基本概念
(一)中断的定义
中断是指计算机在执行正常程序的过程中,由于出现某些特殊情况或事件(如外部设备请求数据传输、定时时间到、硬件故障等),使得 CPU 暂停当前正在执行的程序,转而去执行相应的处理程序(中断服务程序),当处理程序执行完毕后,再返回原来被中断的程序继续执行的过程。

中断系统结构:



(二)中断源
中断源是引发中断产生的原因或事件。在单片机系统中,常见的中断源有多种类型。

外部中断源:
外部中断 0 和外部中断 1:通常由单片机外部引脚的电平变化触发。例如,将一个按键连接到外部中断 0 的引脚,当按键按下或松开时,引脚电平发生变化,从而触发外部中断 0。这种方式常用于检测外部设备的状态变化,如按键操作、传感器信号触发等。
内部中断源:
定时器 / 计数器中断:当定时器 / 计数器计数溢出时产生中断。例如,定时器 0 或定时器 1 在设定的计数初值基础上,对内部时钟脉冲或外部脉冲计数,当计数值达到设定的最大值(溢出)时,就会触发相应的定时器 / 计数器中断。这在需要定时控制或对外部脉冲计数并在特定时刻进行处理的应用中非常有用,如定时数据采集、脉冲频率测量等。
串口中断:在单片机进行串口通信时,当接收到数据或发送完数据时会产生串口中断。比如,上位机通过串口向单片机发送控制命令,当单片机接收到完整的数据帧时,串口中断被触发,单片机进入中断服务程序对接收的数据进行处理;或者当单片机需要向上位机发送数据且数据发送完成后,也会产生串口中断,以便进行后续的操作,如更新发送状态标志等。
三、中断系统的工作流程
(一)中断请求
当某个中断源满足触发条件时,就会向单片机的中断系统发出中断请求信号。例如,外部中断引脚检测到电平变化符合触发条件,或者定时器 / 计数器计数溢出,相应的中断标志位会被硬件自动置位,表示有中断请求产生。



TF1和TFO:定时器计数溢出中断请求标志位。当计数溢出时,由硬件自动置1, 向cPU发出中断请求。进入中断服务程序后,由硬件自动清0。
IE1和IEO:外部中断请求标志位。由外部引脚输入中断请求信号(低电平或下降沿),中断标志位自动置1,向CPU申请中断。进入中断服务程序后,由硬件自动清0。
TI:串行发送中断标志.CPU将数据写入发送缓冲器SBUF时,启动发送,每发送完一个串行帧, 硬件使TI置1。但CPU响应中断时并不清除TI,必须由软件清除。
RI:串行接收中断标志。在串行口允许接收时,每接收完一个串行帧,硬件使RI置1。同样, CPU在响应中断时不会清除RI,必须由软件清除。
除了以上5个中断源的中断请求标志位之外,还有控制位ITO和IT1,用来选择外部中断触发方式, 当这个位为0时,设置外部中断电平触发方式;这个位为1时,设置外部中断下降沿

(二)中断响应
单片机在执行主程序的过程中,会不断地检测是否有中断请求。一旦检测到有中断请求且满足中断响应条件(如中断允许位已设置为允许,没有更高优先级的中断正在执行等),单片机就会暂停当前正在执行的指令,将当前程序计数器(PC)的值压入堆栈保存起来,以便中断处理完后能够返回原来的位置继续执行主程序。然后,根据中断源的不同,跳转到相应的中断入口地址,开始执行中断服务程序。

(三)中断处理
在中断服务程序中,单片机针对引发中断的事件进行相应的处理。例如,对于外部中断 0 触发的按键中断,在中断服务程序中可以读取按键的状态,判断是按下还是松开,并执行相应的按键处理逻辑,如控制某个设备的启停、修改某个变量的值等。对于定时器 / 计数器中断,可能会在中断服务程序中进行数据采集、更新定时标志、执行定时任务等操作。对于串口中断,则进行数据的接收或发送处理,如将接收到的数据存储到缓冲区、解析数据内容、根据数据内容控制其他模块等。

(四)中断返回
当中断服务程序执行完毕后,最后一条指令通常是中断返回指令(如 RETI)。执行中断返回指令时,单片机从堆栈中弹出之前保存的程序计数器(PC)的值,从而返回到主程序被中断的位置继续执行主程序。

四、中断优先级与嵌套
(一)中断优先级
在单片机系统中,可能会同时有多个中断源产生中断请求。为了确定在这种情况下哪个中断先被处理,就需要设置中断优先级。不同的单片机对中断优先级的设置方式有所不同。
以 8051 单片机为例,它有两个中断优先级:高优先级和低优先级。通过设置中断优先级寄存器(IP)来确定各个中断源的优先级。例如,将外部中断 0 设置为高优先级,定时器 0 中断设置为低优先级。当外部中断 0 和定时器 0 中断同时请求时,单片机将优先响应外部中断 0 的请求并执行其中断服务程序。在中断服务程序执行过程中,如果低优先级的中断请求发生,将不会被响应,直到高优先级的中断服务程序执行完毕。

(二)中断嵌套
中断嵌套是指在执行一个中断服务程序的过程中,又有更高优先级的中断请求产生,单片机暂停当前中断服务程序的执行,转而去处理更高优先级的中断,处理完后再返回原来被中断的中断服务程序继续执行。例如,假设外部中断 0 为高优先级,定时器 0 中断为低优先级。在定时器 0 中断服务程序执行过程中,如果外部中断 0 产生中断请求,单片机将暂停定时器 0 中断服务程序,转而去执行外部中断 0 的中断服务程序。当外部中断 0 的中断服务程序执行完毕后,再返回定时器 0 中断服务程序继续执行未完成的部分。中断嵌套的深度通常受到单片机硬件设计的限制,一般为有限的几级。

五、中断系统的相关寄存器
(一)中断允许寄存器(IE)
IE 寄存器用于控制各个中断源的允许与禁止。例如,在 8051 单片机中,EA 位是总中断允许位,当 EA = 1 时,允许所有中断源产生中断请求(前提是相应中断源的允许位也为 1);当 EA = 0 时,禁止所有中断。ES 位是串口中断允许位,ET0 和 ET1 分别是定时器 0 和定时器 1 中断允许位,EX0 和 EX1 分别是外部中断 0 和外部中断 1 允许位。通过对这些位的设置,可以灵活地开启或关闭特定的中断源,以便根据应用需求控制中断的产生。



EA:中断允许总控制位。EA=1,允许所有中断;EA=0,屏蔽所有中断。
ES:串行口中断允许位。ES=1,允许串行口中断;ES=0,屏蔽串行口中断。
ET1:T1中断允许位。ET1=1,允许T1中断;ET1=0,屏蔽T1中断。
EX1:外部中断1(INT1)中断允许位。EX1=1,允许外部中断1中断;EX1=0,屏蔽外部中断
1中断。
ETO:TO中断允许位。ETO=1,允许TO中断;ETO=0,屏蔽TO中断。
EX0:外部中断0(INT0)中断允许位。EX0=1,允许外部中断0中断;EX0=0,屏蔽外部中断0
中断。

(二)中断优先级寄存器(IP)
如前面所述,IP 寄存器用于设置各个中断源的优先级。例如,PS 位对应串口中断优先级设置,PT0 和 PT1 分别对应定时器 0 和定时器 1 中断优先级设置,PX0 和 PX1 分别对应外部中断 0 和外部中断 1 优先级设置。将这些位设置为 1 表示相应中断源为高优先级,设置为 0 表示为低优先级。在一些复杂的应用中,合理设置中断优先级可以确保重要的中断能够及时得到处理,提高系统的稳定性和可靠性。

专用寄存器IP为中断优先级寄存器,IP中的每一位都可以由软件来置1或清0,且1表示高优先级, 0表示低优先级,其格式如图所示。



PS:串行口中断优先控制位。PS=1,设置串行口为高优先级中断;PS=0,设置串行口为低优先级中断。
PT1:T1中断优先控制位。PT1=1,设置T1中断为高优先级中断;PT1=0,设置T1中断为低优先级中断。

PX1:外部中断1中断优先控制位。PX1=1,设置外部中断1为高优先级中断;PX1=0,设置外部中断1为低优先级中断。
PTO:TO中断优先控制位。PT0=1,设置TO中断为高优先级中断;PTO=0,设置TO中断为
低优先级中断。
PX0:外部中断0中断优先控制位。PX0=1,设置外部中断0为高优先级中断;PX0=0,设置外部中断0为低优先级中断。
注意:低优先级可被高优先级中断,高优先级不能被低优先级中断;任何一种中断一旦得到响应, 不会再被它的同级中断源所中断。
当系统复位后,IP低5位全部清0,所有中断源都设定为低优先级中断。
如果同一优先级的几个中断源同时向CPU申请中断,CPU通过内部硬件查询逻辑,按自然优先级顺序确定先响应哪个中断请求。自然优先级由硬件形成。

六、中断系统的应用实例
(一)按键控制与中断响应
在一个简单的电子设备中,通过按键来控制设备的功能。将按键连接到外部中断 0 引脚,当按键按下时,触发外部中断 0。在主程序中,可以进行一些设备的初始化工作,如设置显示内容、初始化变量等。当按键按下产生中断时,在中断服务程序中读取按键状态,判断是何种按键操作,然后根据按键操作执行相应的功能,如切换显示模式、调整参数设置等。这样,无论主程序正在执行什么任务,一旦有按键操作,都能够及时响应,提高了用户操作的实时性体验。

中断类型号和中断服务程序入口地址如图所示:



编写中断函数时应遵循下列规则。
1不能进行参数传递。如果中断过程包括任何参数错误信息。 2无返回值。如果定义一个返回值,将产生错误。但是,如果返回整型值,编译器将不产生错误信息,因为整型值是默认值,编译器不能清楚识别。
在任何情况下,不能直接调用中断函数,否则编译器会产生错误。因为退出中断过程是由指令RETI完成的。这个指令影响8051的硬件中断系统,直接调用中断函数时硬件上没有中断请求存在, 所以这个指令的结果是不定的,并且通常是致命的。
不同的中断函数使用不同的寄存器组。这样可以避免中断嵌套调用时的资源冲突。

(二)数据采集与定时中断
在一个数据采集系统中,需要每隔一定时间采集一次传感器的数据。利用定时器中断来实现定时采集功能。例如,设置定时器 1 工作在模式 1,每隔 1 秒产生一次中断。在主程序中,进行传感器的初始化、数据存储区的初始化等工作。当定时器 1 中断发生时,在中断服务程序中启动 ADC(模数转换器)对传感器数据进行采集,将采集到的数据存储到预先定义好的存储区中,并可以进行一些简单的数据处理,如滤波、判断数据是否超出正常范围等。通过定时中断,能够保证数据采集的时间间隔准确性,提高数据采集系统的可靠性和稳定性。

(三)多中断源协同工作
在一个较为复杂的单片机应用系统中,可能同时存在多个中断源协同工作。例如,一个智能家居控制系统,既有外部中断用于检测门窗传感器的状态变化(如门窗打开或关闭),又有定时器中断用于定时控制灯光的开关时间,还有串口中断用于与上位机(如手机 APP)进行通信,接收远程控制命令。通过合理设置中断优先级和编写各个中断源的中断服务程序,可以实现系统的高效运行。例如,将门窗传感器的外部中断设置为较高优先级,以便及时检测到安全相关的事件;将串口中断设置为中等优先级,确保能够及时接收和处理远程控制命令;将定时器中断设置为相对较低优先级,用于日常的定时控制任务。当多个中断同时发生时,按照优先级顺序依次处理,保证系统在各种情况下都能正常运行并对重要事件做出快速响应。

七、中断系统编程与注意事项
(一)中断服务程序的编写
在编写中断服务程序时,需要注意以下几点。

中断服务程序要尽可能简洁高效,避免在中断服务程序中执行过于复杂或耗时过长的操作,以免影响其他中断的响应和主程序的正常执行。因为中断服务程序的执行会暂停主程序,如果中断服务程序执行时间过长,可能会导致主程序出现卡顿或其他中断得不到及时响应的情况。
在中断服务程序中,要注意保护现场和恢复现场。由于中断的发生会导致程序执行流程的跳转,可能会影响一些寄存器或变量的值。因此,在进入中断服务程序时,可以先将一些可能会被修改的寄存器的值保存到堆栈中(保护现场),在中断服务程序执行完毕返回主程序之前,再将这些保存的值从堆栈中弹出恢复到相应的寄存器中(恢复现场),以确保主程序能够继续正常执行。
中断服务程序的入口地址必须正确设置。不同的单片机对中断服务程序入口地址有特定的规定,例如 8051 单片机的外部中断 0 入口地址为 0003H,定时器 0 中断入口地址为 000BH 等。在编写程序时,要确保中断服务程序的第一条指令位于相应的入口地址处,或者通过跳转指令将程序流程引导到实际的中断服务程序代码处。
(二)中断相关寄存器的初始化设置
在主程序的初始化部分,要正确设置中断允许寄存器(IE)和中断优先级寄存器(IP)。首先,要根据应用需求确定需要开启哪些中断源,将相应的中断允许位置 1,并设置好总中断允许位(EA)。然后,根据中断优先级的要求,设置中断优先级寄存器中各个中断源的优先级位。例如,如果要开启外部中断 0 和定时器 0 中断,并将外部中断 0 设置为高优先级,定时器 0 中断设置为低优先级,可以进行如下设置:

EA = 1;  // 开启总中断
EX0 = 1;  // 开启外部中断 0
ET0 = 1;  // 开启定时器 0 中断
PX0 = 1;  // 设置外部中断 0 为高优先级
PT0 = 0;  // 设置定时器 0 中断为低优先级
(三)中断冲突与调试
在实际应用中,可能会遇到中断冲突的问题。例如,多个中断源同时请求且优先级设置不当,或者中断服务程序中存在逻辑错误导致程序死锁或异常。当出现中断相关的问题时,可以通过以下方法进行调试。

使用调试工具(如单片机开发环境中的调试器),设置断点在中断服务程序中,观察程序执行流程和寄存器的值变化,检查是否按照预期进入和执行中断服务程序,以及在中断服务程序中是否出现错误操作。
检查中断相关寄存器的设置是否正确,尤其是中断允许位和优先级位的设置是否符合应用需求。
对于中断冲突的问题,可以尝试调整中断优先级设置,或者优化中断服务程序的执行逻辑,避免出现长时间占用中断资源或死锁的情况。例如,如果发现某个低优先级中断长时间得不到执行,可以检查高优先级中断服务程序中是否存在无限循环或耗时过长的操作,并进行相应的修改。
(四)中断请求撤除的三种方式

硬件自动撤除

方式介绍:在一些单片机的中断系统中,部分中断源的中断请求信号在硬件上能够自动撤除。例如,某些单片机的脉冲触发方式的外部中断,当外部引脚检测到一个有效的脉冲信号后,硬件会自动将中断请求标志位清零,从而完成中断请求的撤除。
具体实例:以 MCS - 51 单片机的外部中断为例,当外部中断采用下降沿触发方式时,CPU 响应中断后,硬件会自动将相应的中断标志位 IE0(外部中断 0)或 IE1(外部中断 1)清零。这是因为单片机的硬件电路在设计时就考虑到了这种情况,在响应中断后,自动完成中断请求标志的清除,使得下一次中断请求能够被正确识别。
应用场景:这种方式适用于外部脉冲信号作为中断源,且脉冲信号具有明确的触发边沿(如下降沿或上升沿)的情况。在实时性要求较高,并且中断请求信号比较规则的简单系统中,硬件自动撤除方式可以简化软件设计,提高系统的响应效率。
软件撤除

方式介绍:对于一些不能由硬件自动撤除中断请求的情况,需要通过软件编程来实现中断请求的撤除。通常是在中断服务程序中,通过向特定的寄存器写入相应的值来清除中断请求标志位。
具体实例:在某些单片机的串口中断中,当接收完一帧数据后会产生中断请求,此时中断标志位 RI(接收中断标志)被置位。在中断服务程序中,需要通过软件指令(如在8051单片机中,使用 “CLR RI” 指令)将 RI 标志位清零,以撤除本次的中断请求。否则,在后续的程序执行过程中,由于 RI 标志位仍然为 1,会被误认为是又有新的接收中断请求,导致程序出现错误。
应用场景:适用于硬件没有自动清除机制或者需要在软件层面进行更精细控制的中断源。比如在复杂的通信系统中,对于串口数据的接收和发送中断,为了确保数据的正确处理和下一次通信的正常进行,需要在软件中严格按照通信协议和数据处理流程来清除中断请求标志。
硬件配合软件撤除

方式介绍:这种方式结合了硬件和软件的操作来撤除中断请求。硬件部分可能会对中断请求信号进行初步的处理,降低信号的干扰等影响,而软件部分则负责最终的中断请求标志位清除等操作。
具体实例:在一些通过电平触发方式的外部中断系统中,当外部引脚电平为有效电平(如低电平)时,中断请求标志位被置位。CPU 响应中断后,硬件电路可能会将外部引脚的电平暂时拉高(或者进行其他隔离处理),以防止连续的中断请求。但是,中断请求标志位仍然需要在软件中清除。例如,在某些改进型的单片机应用系统中,当外部中断采用电平触发时,硬件先将外部引脚与中断检测电路进行隔离,然后在中断服务程序中,通过读取外部引脚的当前电平状态,并根据一定的逻辑判断后,清除中断请求标志位。
应用场景:这种方式适用于外部干扰较大,电平触发方式的中断源,且对中断请求的准确性和稳定性要求较高的情况。例如,在工业现场的环境监测系统中,传感器输出的电平信号作为外部中断源触发单片机进行数据采集,现场可能存在电磁干扰等情况,通过硬件配合软件撤除中断请求的方式,可以有效减少误触发,确保系统稳定可靠地运行。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xzt2003756/article/details/144476118

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

18

帖子

0

粉丝