本节介绍STC 8051单片机中断原理及功能,内容包括中断原理、中断系统结构、中断优先级处理、中断优先级控制寄存器、中断向量表。
STC单片机中的中断系统是为了8051 CPU具有实时处理外界紧急事件能力而设置的一种机制。
当8051 CPU正在处理某个事件的时候,即正在正常执行一段程序代码时,外界发生了紧急事件,这个紧急事件可以通过STC单片机的外部引脚或内部信号送给8051 CPU,8051 CPU就需要做出判断是不是需要立即处理这个紧急事件。如果CPU允许立即处理这个事件,则暂时停止当前正在执行的程序代码,而跳转到用于处理该紧急事件的程序代码,即通常所说的中断服务程序。当处理完紧急事件,也就是执行完处理该紧急事件的程序代码后,再继续处理前面所打断的正常执行的程序代码。这个过程称为中断,如图5.15所示。下面对这个过程进行说明:
图5.15 中断处理过程
①外设在中断线上产生脉冲。中断控制器设置中断标志,并向CPU发出请求。
②CPU响应并开始执行中断服务程序(Interrupt Service Routine,ISR)。中断控制器在进入ISR入口时,清除中断标志。
③CPU从中断返回。
④外设在中断线上产生脉冲。中断控制器设置中断标志,并向CPU发出请求。
⑤CPU响应并开始执行中断服务程序ISR。中断控制器在进入ISR入口时,清除中断标志。
⑥当正在执行ISR时,外设在中断线上产生脉冲。中断控制器设置中断待处理标志。
⑦CPU从中断服务程序返回。当设置中断标志时,中断控制器产生一个中断。
⑧CPU开始执行ISR。中断控制器在进入ISR入口时,清除中断标志。
⑨CPU从中断服务程序返回。
注:④~⑨表示中断嵌套。
为了方便读者对后续内容的学习,下面对中断系统的一些术语进行说明:
1)中断系统
在STC单片机中,用于实现中断过程的功能部件称为中断系统。
2)中断源
可以打断当前正在执行程序的紧急事件称为中断源。
3)中断优先级
当有多个紧急事件同时需要8051 CPU进行处理时,就存在CPU到底先处理哪个紧急事件的问题。在8051 CPU中,为这些紧急事件设置了优先级。也就是8051 CPU总是先处理优先级最高的紧急事件,总是最后处理优先级最低的紧急事件。
对于具有相同优先级的紧急事件来说,将按照产生事件的前后顺序进行处理。
4)中断嵌套
当8051 CPU正在处理一个中断源的时候,即正在执行相应的中断服务程序时,外部又出现了一个优先级更高的紧急事件需要进行处理。如果8051 CPU允许,则暂停处理当前正在执行的中断处理程序,转而去执行用于处理优先级更高的紧急事件的中断服务程序。这种允许高优先级中断打断当前中断处理程序的机制称为中断嵌套,如图5.16所示。
注意: 不允许中断嵌套的中断系统则称为单级中断系统。
思考与练习5-24: 在STC 8051单片机中,中断定义为 。
图5.16 中断嵌套结构
思考与练习5-25: 在STC 8051单片机中,中断源定义为 。
思考与练习5-26: 在STC 8051单片机中,中断优先级定义为 。
思考与练习5-27: 如果允许CPU响应中断请求,请用图表示CPU响应并处理中断的过程。
在STC15W4K32S系列的单片机中,提供了21个中断源,如图5.17所示。
(1)外部中断0(INT0)。
(2)定时器0中断。
(3)外部中断1(INT1)。
(4)定时器1中断。
(5)串口1中断。
(6)A/D转换中断。
(7)低电压检测(LVD)中断。
(8)CCP/PWM/PCA中断。
(9)串口2中断。
(10)SPI中断。
(11)外部中断 。
(12)外部中断 。
(13)定时器2中断。
(14)外部中断 。
(15)串口3中断。
(16)串口4中断。
(17)定时器3中断。
(18)定时器4中断。
(19)比较器中断。
(20)PWM中断。
(21)PWM异常检测中断。
图5.17 中断系统结构
从图5.17中可以看出,在这21个中断中,外部中断2、外部中断3、定时器2中断、外部中断4、串口3中断、串口4中断、定时器3中断、定时器4中断和比较器中断的优先级总是固定为最低优先级(0级)外,其他的中断都具有两个中断优先级,可以实现两级中断嵌套。另外,用户可以通过中断允许寄存器IE的B7比特位EA,以及相应中断的允许位,使能或者禁止8051 CPU响应该中断。通常把8051 CPU禁止响应中断称为屏蔽中断(中断屏蔽)。下面对用于使能或者禁止中断的寄存器进行说明。
在STC15W4K32S4系列单片机内,8051 CPU是否允许和禁止响应所有中断源,以及是否允许每一个中断源,这都是由内部的中断允许寄存器IE控制,如表5.20所示。该寄存器位于SFR地址为0xA8的位置。当复位时,将该寄存器设置为00000000B。
表5.20 中断允许寄存器IE的各位含义
注意: 该寄存器可以位寻址。
表中:
1)EA
8051 CPU的全局中断使能控制位。当该位为1时,表示CPU可以响应各种不同类型的紧急事件(中断);当该位为0时,表示CPU禁止响应任何类型的紧急事件(中断)。
2)ELVD
低电压检测中断允许位。当该位为1时,表示允许低电压检测产生中断事件;当该位为0时,表示禁止低电压检测产生中断事件。
3)EADC
ADC转换中断允许位。当该位为1时,表示允许ADC转换产生中断事件;当该位为0时,表示禁止ADC转换产生中断事件。
4)ES
串行接口1中断允许位。当该位为1时,表示允许串行接口1产生中断事件;当该位为0时,表示禁止串行接口1产生中断事件。
5)ET1
定时/计数器T1的溢出中断允许位。当该位为1时,表示允许T1溢出产生中断事件;当该位为0时,表示禁止T1溢出产生中断事件。
6)EX1
外部中断1中断允许位。当该位为1时,表示允许外部中断1产生中断事件;当该位为0时,表示禁止外部中断1产生中断事件。
7)ET0
定时/计数器T0的溢出中断允许位。当该位为1时,表示允许T0溢出产生中断事件;当该位为0时,表示禁止T0溢出产生中断事件。
8)EX0
外部中断0中断允许位。当该位为1时,表示允许外部中断0产生中断事件;当该位为0时,表示禁止外部中断0产生中断事件。
该寄存器用于使能和禁止其他紧急事件,该寄存器位于SFR地址为0xAF的位置,如表5.21所示。当复位时,该寄存器的内容设置为x0000000B。
表5.21 中断允许寄存器IE2的各位含义
其中:
1)ET4
定时器4中断允许位。当该位为1时,表示允许定时器4产生中断事件;当该位为0时,表示禁止定时器4产生中断事件。
2)ET3
定时器3中断允许位。当该位为1时,表示允许定时器3产生中断事件;当该位为0时,表示禁止定时器3产生中断事件。
3)ES4
串行接口4中断允许位。当该位为1时,表示允许串行接口4产生中断事件;当该位为0时,表示禁止串行接口4产生中断事件。
4)ES3
串行接口3中断允许位。当该位为1时,表示允许串行接口3产生中断事件;当该位为0时,表示禁止串行接口3产生中断事件。
5)ET2
定时器2中断允许位。当该位为1时,表示允许定时器2产生中断事件;当该位为0时,表示禁止定时器2产生中断事件。
6)ESPI
SPI接口中断允许位。当该位为1时,表示允许SPI接口产生中断事件;当该位为0时,表示禁止SPI接口产生中断事件。
7)ES2
串行接口2中断允许位。当该位为1时,表示允许串行接口2产生中断事件;当该位为0时,表示禁止串行接口2产生中断事件。
外部中断允许和时钟输出寄存器。该寄存器是STC15系列单片机新增加的寄存器,该寄存器位于SFR地址为0x8F的位置,如表5.22所示。当复位时,该寄存器的内容设置为x0000000B。
表5.22 中断允许和时钟输出寄存器INT_CLKO的各位含义
注意: 在此只介绍和中断有关的比特位。
表中:
1)EX4
外部中断4中断允许位。当该位为1时,表示允许外部中断4产生中断事件;当该位为0时,表示禁止外部中断4产生中断事件。
注意: 外部中断4只能通过下降沿进行触发。
2)EX3
外部中断3中断允许位。当该位为1时,表示允许外部中断3产生中断事件;当该位为0时,表示禁止外部中断3产生中断事件。
注意: 外部中断3只能通过下降沿进行触发。
3)EX2
外部中断2中断允许位。当该位为1时,表示允许外部中断2产生中断事件;当该位为0时,表示禁止外部中断2产生中断事件。
注意: 外部中断2只能通过下降沿进行触发。
TCON寄存器称为定时器/计数器控制寄存器,如表5.23所示,该寄存器位于SFR地址为0x88的位置。当复位时,该寄存器的内容设置为00000000B。
表5.23 定时器/计数器控制寄存器TCON的各位含义
注意: 这里只介绍和中断有关的比特位含义。
表中:
1)IE1
外部中断1(INT1/P3.3)中断请求标志。当该位为1时,外部中断1向CPU请求中断。当CPU响应该中断后,由硬件自动清除该位。
2)IT1
外部中断1中断源类型选择位。当该位为0时,表示INT1/P3.3引脚上的上升沿或者下降沿信号均可以触发外部中断1;当该位为1时,表示外部中断1为下降沿触发方式。
3)IE0
外部中断0(INT0/P3.2)中断请求标志。当该位为1时,外部中断0向CPU请求中断。当CPU响应该中断后,由硬件自动清除该位。
4)IT0
外部中断0中断源类型选择位。当该位为0时,表示INT0/P3.2引脚上的上升沿或者下降沿信号均可以触发外部中断0;当该位为1时,表示外部中断0为下降沿触发方式。
对于上面的寄存器来说:
(1)对于IE寄存器的设置操作,可以通过下面的位操作指令:
SETB BIT CLR BIT
或通过下面的字节操作指令实现:
M OV IE,#DATA ANL IE,#DATA ORL IE,#DATA M OV IE,A
(2)对于IE2和INT_CLKO寄存器的设置操作,只能通过字节操作指令完成。
中断控制器提供了中断优先级处理的能力为每个中断分配不同的优先级。下面分析不同优先级的处理。
如果一个8051 CPU确认需要响应中断INTB,而CPU此时正在执行另一个中断INTA,这里有三种可能性用于处理这种情况。
(1)如果INTA的优先级比INTB低,则:
①在当前INTA正在执行的指令上停下来,即暂时停止运行INTA。
②将INTA的现场入栈,即保护现场,CPU开始转向执行INTB。
③当执行完INTB后,CPU跳转到刚才中断执行INTA指令的地方,继续执行INTA。
(2)如果INTA的优先级比INTB高,则:
①INTB一直等待,直到执行完INTA。
②一旦执行完INTA后,立即开始执行INTB。
(3)如果INTA和INTB有相同的优先级,则:
①如果正在执行INTA,则INTB等待执行完INTA。当执行完INTA后,开始执行INTB。
②如果正在执行INTB,则INTA等待执行完INTB。当执行完INTB后,开始执行INTA。
(1)如果INTA优先级低于INTB,则INTB获得仲裁权,开始执行。
(2)如果INTA优先级高于INTB,则INTA获得仲裁权,开始执行。
(3)如果INTA和INTB有相同的优先级,则具有低索引值的中断获得仲裁权,开始执行。
传统8051单片机具有两个中断优先级,即最高优先级和最低优先级,可以实现两级中断嵌套。在STC15系列单片机中,通过设置特殊功能寄存器IP1和IP2中的相应位,可以将部分中断设为带有2个中断优先级,除外部中断 、外部中断 和外部中断 以外,可以将其他所有中断请求源设置为2个优先级。
该寄存器用于设置部分中断源的优先级,其位于SFR地址为0xB8的位置,如表5.24所示。当复位时,该寄存器的内容设置为00000000B。
表5.24 中断优先级寄存器IP1各位的含义
注意: 该寄存器可位寻址。
表中:
1)PPCA
PCA中断优先级控制位。当该位为0时,PCA中断为最低优先级(优先级0);当该位为1时,PCA中断为最高优先级(优先级1)。
2)PLVD
低电压检测中断优先级控制位。当该位为0时,低电压检测中断为最低优先级(优先级0);当该位为1时,低电压检测中断为最高优先级(优先级1)。
3)PADC
ADC中断优先级控制位。当该位为0时,ADC转换中断为最低优先级(优先级0);当该位为1时,ADC转换中断为最高优先级(优先级1)。
4)PS
串口1中断优先级控制位。当该位为0时,串口1中断为最低优先级(优先级0);当该位为1时,串口1中断为最高优先级(优先级1)。
5)PT1
定时器1中断优先级控制位。当该位为0时,定时器1中断为最低优先级(优先级0);当该位为1时,定时器1中断为最高优先级(优先级1)。
6)PX1
外部中断1中断优先级控制位。当该位为0时,外部中断1为最低优先级(优先级0);当该位为1时,外部中断1为最高优先级(优先级1)。
7)PT0
定时器0中断优先级控制位。当该位为0时,定时器0中断为最低优先级(优先级0);当该位为1时,定时器0中断为最高优先级(优先级1)。
8)PX0
外部中断0中断优先级控制位。当该位为0时,外部中断0为最低优先级(优先级0);当该位为1时,外部中断0为最高优先级(优先级1)。
该寄存器用于设置部分中断源的优先级,其位于SFR地址为0xB5的位置,如表5.25所示。当复位时,该寄存器的内容设置为xxx00000B。
表5.25 中断优先级寄存器IP2各位的含义
注意: 该寄存器不可位寻址。
表中:
1)PX4
外部中断4中断优先级控制位。当该位为0时,外部中断4为最低优先级(优先级0);当该位为1时,外部中断4为最高优先级(优先级1)。
2)PPWMFD
PWM异常检测中断优先级控制位。当该位为0时,PWM异常检测中断为最低优先级(优先级0);当该位为1时,PWM异常检测中断为最高优先级(优先级1)。
3)PPWM
PWM中断优先级控制位。当该位为0时,PWM中断为最低优先级(优先级0);当该位为1时,PWM中断为最高优先级(优先级1)。
4)PSPI
SPI中断优先级控制位。当该位为0时,SPI中断为最低优先级(优先级0);当该位为1时,SPI中断为最高优先级(优先级1)。
5)PS2
串口2中断优先级控制位。当该位为0时,串口2中断为最低优先级(优先级0);当该位为1时,串口2中断为最高优先级(优先级1)。
思考与练习5-28: 在STC 8051单片机中,当有一个紧急事件需要CPU进行处理时,需要的前提条件是 。(提示:允许该事件发出中断请求,以及CPU允许响应该中断请求。)
前面提到,当CPU响应紧急事件的时候,要转向用于处理紧急事件的程序代码(这个程序代码通常称为中断服务程序),那问题就出现了,CPU是如何找到用于处理紧急事件程序代码的起始地址的呢?原来在8051 CPU的程序存储器空间内,专门开辟了一块存储空间用于保存处理不同类型事件的程序代码的起始地址,也称为中断服务程序入口地址。
在计算机中,把这个用于保存处理不同类型事件的程序代码起始地址的存储空间称为中断向量表。实际上,中断向量表就是程序存储器中的一块特定的存储空间而已,只不过这个存储空间的位置已经事先规定好了,用户不可以修改中断向量表所在地址空间的位置。
但是,用户可以做的工作是可以修改中断向量表中每个中断向量的内容,也就是为处理每个不同类型事件的程序代码指定起始地址,这就是所说的中断映射,如图5.18所示。中断源、中断向量和中断号的对应关系,如表5.26所示。
表5.26 中断源、中断向量和中断号的对应关系
注:中断向量表中的每个中断向量的内容实质上是一条指向中断服务程序入口地址的跳转指令。
从图5.18中可以看到,程序Flash存储空间的低地址区已经分配了中断向量表,所以这个区域禁止保存用户程序代码。因此,用户程序经常保存在程序Flash存储空间起始地址为0x100的地方。在程序存储器地址为0x0000的位置有一条跳转指令,用于避开中断向量表的区域。
思考与练习5-29: 在STC 8051单片机中,中断向量定义为 。
思考与练习5-30: 在STC 8051单片机中,中断向量表定义为 。
思考与练习5-31: 在STC 8051单片机中,对于每个紧急事件在中断向量表中给该事件分配了 字节,用于 。
思考与练习5-32: 在STC 8051单片机中,中断向量表的起始地址是 ,结束地址是 。
思考与练习5-33: 在STC 8051单片机中,中断向量表保存 个中断向量。
图5.18 中断向量表
图5.18(续)