一、“中断”与定时器的关系
前面我们学习过了定时器,实际上定时器的一般用法都是采取中断的方式进行实现的。需要明确的是,定时器和中断不是一回事,定时器是单片机模块的一个资源,确确实实存在的一个模块,而中断是单片机中的一种运行机制。在单片机系统中,中断机制允许处理器在执行主程序的过程中,暂停当前任务,转去处理中断事件。处理完毕后,再返回原来暂停的地方继续执行任务。这种机制可以实现实时响应,提高系统的实时性。
二、“中断”相关概念
1. 中断:是指在突发事件到来时先中止当前正在进行的工作,转而去处理突发事件,待突发事件处理完成后,再返回到原先被中止的工作处,继续进行随后的工作。
中断源:中断管理系统能够处理的突发事件。
中断请求:中断源向CPU提出的处理请求。
中断响应:由中断管理系统处理突发事件的过程。
中断函数:针对中断源和中断请求提供的服务函数。
中断嵌套:在中断服务过程中执行更高级别的中断服务。
2. 中断标志位与中断使能位
① 中断标志位:中断标志位是用于表示中断请求的寄存器位。当中断源产生中断请求时,相应的中断标志位会被设置为 1。中断处理程序通过检查这些标志位来确定哪个中断源产生了中断,然后执行相应的中断服务程序。
② 中断使能(允许)位:中断使能位是用于控制中断请求是否被响应的寄存器位。当中断使能位为 1 时,中断请求会被响应并产生中断标志位;当中断使能位为 0 时,中断请求不会被响应。
3. 中断源
① 外部中断:中断源信号由外部引脚P3.2和P3.3输入。
② 内部中断:中断信号由内部单元产生。
4. 中断号
"中断号"是系统分配给每个中断源的代号,用于识别和处理不同类型的中断事件。中断号的主要作用是在中断处理过程中,CPU通过中断号来识别不同的中断源,以便采取适当的处理措施。在采用向量中断方式的中断系统中,CPU会根据中断号找到对应的中断服务程序的入口地址,实现程序的转移。这样,每个中断源都可以独立地触发中断事件,并且CPU可以准确地识别和处理这些事件。
简而言之,“中断服务程序”与“中断号”之间的关系,就像是“子程序”与“函数名”之间的关系。在执行“子程序”时,CPU根据“函数名”进行跳转;在执行“中断服务程序”时,CPU根据“中断号”查找相应的中断服务程序。
上述的中断函数名可进行自定义,只要符合函数的命名规则即可。
三、与“中断”相关的寄存器
串行控制寄存器SCON会在后面的“串口”部分进行讲解。
1. 定时器控制寄存器TCON的IE1、IT1、IE0、IT0位寄存器
IE1:外部中断1(INT1/P3.3)的中断请求标志位。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”。(IE:Interrupt Enable)
IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)输入低电平时,将IE1置1 。当IT1=1时,外部中断1为下降沿触发方式,当INT1(P3.3)输入信号出现下降沿时,将IE1置1。(IT:Interrupt Type)
IE0:外部中断0(INT0/P3.2)的中断请求标志位。IE0=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”。
IT0:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2)输入低电平时,将IE0置1 。当IT0=1时,外部中断0为下降沿触发方式,当INT0(P3.2)输入信号出现下降沿时,将IE0置1。
当两外部中断采用低电平触发的方式时,外部中断源(输入到INT0/1)必须一直保持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.2/P3.3要变为高电平),否则将产生另一次中断。(后面会在“定时器&中断的应用”中,会对“外部中断的触发方式”进行详细介绍。)
2. 中断使能(允许)寄存器IE (IE:Interrupt Enable) —— 可位寻址
EA:CPU的总中断允许控制位,。EA=0,CPU屏蔽所有的中断申请;EA=1,CPU开放中断,各中断的产生由各自的允许位决定。EA的作用是使中断允许形成两级控制,即各中断源首先受EA控制,其次还受各中断源自己的中断允许位控制。
ET2:定时/计数器2溢出中断允许位(8052用)。ET2=1,允许T2中断;ET2=0,禁止T2中断。
ES:串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。
ET1:定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
ET0:定时/计数器T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。
EA:Enable All ET:Enable Timer ES:Enable Serial EX:Enable External
3. 中断优先级寄存器IP (IP:Interrupt Priority) —— 可位寻址
PT2:定时/计数器T2的中断优先级控制位。只用于52子系列。
PS:串口中断优先级控制位。PS=1,串行口中断定义为高优先级中断;PS=0,串行口中断定义为低优先级中断。
PT1:定时/计数器T1的中断优先级控制位。PT1=1,定时/计数器T1定义为高优先级中断;PT1=0,定时/计数器T1定义为低优先级中断。
PX1:外部中断1的中断优先级控制位。PX1=1,外部中断1定义为高优先级中断;PX1=0,外部中断1定义为低优先级中断。
PT0:定时/计数器T0的中断优先级控制位。PT0=1,定时/计数器 T0定义为高优先级中断;PTO=0,定时/计数器T0定义为低优先级中断。
PX0:外部中断0的中断优先级控制位。PX0=1,外部中断0定义为高优先级中断;PX0=0,外部中断0定义为低优先级中断。
PS:Priority Serial PT:Priority Timer PX:Priority External
四、中断优先级
1. 抢占优先级:
上面的IP寄存器的每一位,表示对应中断的抢占优先级,每一位的复位值都是0,当把某一位设置为1的时候,这一位的优先级就比其他位的优先级高了。比如设置了PT0位为1后,当单片机在主循环或者任何其他中断程序中执行时,一旦定时器T0发生中断,作为更高的优先级,程序马上就会跑到T0的中断程序中来执行。反过来,当单片机正在T0中断程序中执行时,如果有其他中断发生了,还是会继续执行T0中断程序,直到把T0中的中断程序执行完后,才会去执行其他中断程序。标志位被置1的中断源(抢占优先级),其优先级还按照固有优先级进行排序。
当进入低优先级中断中执行时,如又发生了高优先级的中断,则立刻进入高优先级中断执行,处理完高优先级中断后,再返回处理低优先级中断,这个过程就称为中断嵌套,也称为抢占。所以抢占优先级的概念就是,优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。当然反过来,优先级低的中断是不能打断优先级高的中断的。
2. 固有优先级:
在上面“中断相关概念”的介绍中,已经给出了中断的默认优先级(固有优先级)。注意,在中断优先级的编号中,一般都是数字越小优先级越高。从表中可以看到一共有1~5共5级的优先级,这里的优先级与抢占优先级的一个不同点就是,它不具有抢占的特性,也就是说即使在低优先级中断执行过程中又发生了高优先级的中断,那么高优先级的中断也只能等到低优先级中断执行完后才能得到响应。(此处提到的“高优先级”,指固有优先级中的高优先级。)
3. 既然固有优先级不能抢占,那么这个优先级有什么用呢?
多个中断同时存在时的仲裁。比如说有多个中断同时发生了,当然实际上发生这种情况的概率很低,但另外一种情况就常见得多了,那就是出于某种原因暂时关闭了总中断,即EA=0,执行完一段代码后又重新使能了总中断,即 EA=1,那么在这段时间里就很可能有多个中断都发生了,但因为总中断是关闭的,所以它们当时都得不到响应,而当总中断再次使能后,它们就会在同一时间请求响应,很明显,这时也必需有个先后顺序才行,这就是非抢占优先级的作用,谁优先级最高先响应谁,然后按编号排队,依次得到响应。
中断优先级处理的原则:
① CPU同时接收到几个中断时,首先响应级别最高的中断请求。
② 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
③ 正在进行的低优先级中断服务,能被高优先级中断请求所中断。