760 likes | 935 Views
第六章 中 断 本章学习目标 掌握单片机中断系统 掌握单片机中断处理过程 掌握中断程序设计 理解中断使用过程中需要注意的问题. §6.1 中断的概念. 中断是计算机中的一个很重要的技术 , 它既和硬件 有关,也和软件有关。正是因为有了中断技术,才使得 计算机的控制功能更加灵活、效率更高、使得计算机的 发展和应用大大的前进了一步,中断功能的强弱已成为 衡量一台计算机功能完善与否的重要指标。例如,下面 的情况下,就需要采用中断技术。 当计算机正在正常运行一个程序段的时候,如果有一个紧急的事件出现,又必须要立即处理这个紧急的事件;
E N D
第六章 中 断 本章学习目标 • 掌握单片机中断系统 • 掌握单片机中断处理过程 • 掌握中断程序设计 • 理解中断使用过程中需要注意的问题
§6.1中断的概念 中断是计算机中的一个很重要的技术,它既和硬件 有关,也和软件有关。正是因为有了中断技术,才使得 计算机的控制功能更加灵活、效率更高、使得计算机的 发展和应用大大的前进了一步,中断功能的强弱已成为 衡量一台计算机功能完善与否的重要指标。例如,下面 的情况下,就需要采用中断技术。 • 当计算机正在正常运行一个程序段的时候,如果有一个紧急的事件出现,又必须要立即处理这个紧急的事件; • 计算机一边工作一边随时准备处理一个事件,但又不确定该事件出现的确切时刻,像处理防火防盗事件一样。
计算机采用中断技术,大大提高了工作效率和 处理问题的灵活性,主要表现在3个方面: • 可及时处理控制系统中许多随机发生的事件; • 较好的解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作; • 具备了处理故障的能力,提高了系统自身的可靠性。
中断类似于主程序调用子程序,但它们又有区别,各自的主要特点如表所示。中断类似于主程序调用子程序,但它们又有区别,各自的主要特点如表所示。 表6-1 中断和调用子程序之间的主要区别
§6.2单片机的中断系统及其管理 一、中断源及其优先级管理 1、中断源 中断源是指能发出中断请求,引起中断的装置或事件。 STC15F2K60S2单片机提供14个中断请求源: • 5个外部中断请求 • 3个片内定时/计数器溢出中断请求 • 2个片内异步串行口(UART)中断请求 • 1个ADC中断 • 1个SPI中断 • 1个低电压检测中断 • 1个PCA中断。
(1)定时/计数器T0和T1的控制寄存器TCON • 该寄存器同时锁存了T0和T1的溢出中断请求标志及外部中断请求标志。 • TCON(地址为88H,复位值为00H)的各位定义如下:
1)IT0:外部中断触发方式控制位。可由软件置1或清“0”。1)IT0:外部中断触发方式控制位。可由软件置1或清“0”。 0:电平触发方式。当输入低电平时,置位IE0。 1:边沿触发方式。输入脚上电平由高到低的负跳变时,置位IE0。 2)IT1:外部中断触发方式控制位,与IT0类似。
3)IE0:外部中断0请求标志。 • 当IT0=0即电平触发方式时,在每个指令周期的最后一个时钟周期采样IT0,若为低电平,由硬件置位IE0 。 • 当IT0=1即边沿触发方式时,当某个指令周期的最后一个时钟周期采样到为高电平,下一个指令周期的最后一个时钟周期采样到为低电平时,由硬件置位IE0。 • IE0=1表示向CPU请求中断。当CPU响应中断转向中断服务程序时,由硬件自动清0中断标志。 4)IE1:外部中断1请求标志,其意义和IE0相同。
4)TR0:定时/计数器T0启动/停止控制位。 5)TR1:定时/计数器T1启动/停止控制位,详细介绍,请参考“定时器”一章。
6)TF0:定时/计数器T0溢出中断标志。 T0启动计数后,从初值开始加1计数。当计数器产生进位时,由硬件置TF0为1,向CPU申请中断,若CPU响应中断,在进入中断服务后,CPU自动将TF0清0。TF0也可用软件清0(查询方式)。 7)TF1:定时/计数器T1的中断标志,功能和TF0类似。
(2)串行口1控制寄存器SCON • 用于对串行口1的工作方式进行控制,其最低两位锁存串行口1发送中断标志TI和接收中断标志RI。 • SCON(地址为98H,复位值为00H)各位的定义如下: TI或RI只要有一个为1,表示串行口申请中断
1)RI:串行口1接收中断标志。 RI=1表示串行口1接收器已经接收到数据,所以向CPU申请中断,以便将接收到的数据存到预先安排好的数据区。RI必须由用户在中断处理程序中用指令清0。 2)TI:串行口1发送中断标志。 TI=1表示串行口发送器已经发送完上一个数据,所以向CPU申请中断,以便发送下一个数据。TI必须由用户在中断处理程序中用指令清0。
(3)串口2控制寄存器S2CON • 寄存器S2CON(地址为9AH,复位值为00H)用于确定串口2的操作方式和控制串口2的某些功能,并设有接收和发送中断标志(S2RI及S2TI)位。 • S2CON各位的定义如下:
(4)电源控制寄存器PCON • 电源控制寄存器PCON(地址为87H,复位值为30H) • 寄存器的各位定义如下: 与中断有关的位是LVDF。 LVDF是低电压检测标志位,同时也是低电压检测中断请求标志位。
(5)PCA控制寄存器CCON • CCON(地址为D8H,复位值为00xx x000B 1)CF:PCA计数器溢出标志位。 当PCA计数器溢出时,CF由硬件置位。如CMOD寄存器的ECF位置位,CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清0。 2)CCF2/CCF1/CCF0:PCA各个模块的标志。
(6)SPI状态寄存器SPSTAT • SPSTAT(地址为CDH,复位值为00xx xxxxB) • 各位的定义如下:
SPIF是SPI传输完成标志。 当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(ESPI=1,EA=1),将产生中断。SPIF标志通过软件向其写入1而清0。 • WCOL位的作用以及SPI模块在 “数据通信”一章中介绍。
(7)ADC控制寄存器ADC_CONTR • ADC_CONTR(地址为C5H,复位值为0XX00000B)各位的定义如下: 位ADC_FLAG是A/D转换结束标志。 A/D转换完成后,ADC_FLAG=1。此时,若允许A/D转换中断(EADC=1,EA=1),则由该位申请产生中断。也可由软件查询该标志位判断A/D转换是否结束, ADC_FLAG一定要软件清“0”
2、中断的允许、禁止及优先级 (1)中断的允许和禁止 STC15F2K60S2单片机中没有专门的开中断和关中断指令,中断的允许和禁止是通过设置IE、IE2和外部中断允许和时钟输出寄存器INT_CLKO的相应位实现的。 单片机对中断源的允许和禁止由两级控制组成,即总控制和对每个中断源的分别控制。
1)中断允许寄存器IE • 中断允许寄存器IE(地址为A8H,复位值为00H) 1)EA:中断允许总控制位。 0:禁止中断系统,所有中断源的中断请求均被禁止,称为关中断。 1:允许中断系统,所有中断源的中断请求均可以被允许,称为开中断;某一个中断源的请求是否允许,还要由该中断源所对应的中断允许控制位决定。
2)ELVD:低电压检测中断允许控制位。 1:允许低电压检测中断; 0:禁止低电压检测中断。 3)EADC:ADC中断允许控制位。 1:允许ADC中断; 0:禁止ADC中断。
4)ES:串行口1中断允许控制位。 1:允许串行口1中断; 0:禁止串行口1中断。 5)ET1:定时器1中断允许控制位。 1:允许定时器1中断; 0:禁止定时器1中断。
6)EXl:外部中断中断允许控制位。 1:允许外部中断1中断; 0:禁止外部中断1中断。 7)ET0:定时器0中断允许控制位。 1:允许定时器0中断; 0:禁止定时器0中断。 8)EX0:外部中断源中断允许控制位。 1:允许外部中断0中断; 0:禁止外部中断0中断。
2)中断允许寄存器IE2 • (地址为AFH,复位值为XXXXXX00B) ① ET2:定时器2的中断允许位。 1:允许定时器2产生中断; 0:禁止定时器2产生中断。 ② ESPI:SPI中断允许控制位。 1:允许SPI中断;0:禁止SPI中断。 ③ ES2:串行口2中断允许控制位。 1:允许串行口2中断; 0:禁止串行口2中断。
3)外部中断使能和时钟输出寄存器INT_CLKO • 外部中断使能和时钟输出寄存器INT_CLKO(地址为8FH,复位值为X0000000B,不能进行位寻址)各位的定义如下:
①EX4:外部中断4中断允许位。 1:允许外部中断4中断; 0:禁止外部中断4中断。外部中断4下降沿触发。 ②EX3:外部中断3中断允许位。 1:允许外部中断3中断; 0:禁止外部中断3中断。外部中断3下降沿触发。 ③EX2:外部中断2中断允许位。 1:允许外部中断2中断; 0:禁止外部中断2中断。外部中断2下降沿触发。
4)PCA比较/捕获寄存器CCAPMn(n=0,1,2,下同。地址分别对应DAH, DBH和DCH,复位值均为X0000000B),各位的定义如下: ECCFn:使能CCFn中断。寄存器CCON的比较/捕获标志CCFn用来产生中断。
5)PCA工作模式寄存器(CMOD) CMOD(地址为D9H,复位值为0XXX0000B)各位的定义如下: ECF:PCA计数器溢出中断使能位。ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。
STC15F2K60S2单片机复位后,各中断允许寄存器控制位均被清“0”,即禁止所有中断。如果需要允许某些中断,可在程序中将相应中断控制位置为1。STC15F2K60S2单片机复位后,各中断允许寄存器控制位均被清“0”,即禁止所有中断。如果需要允许某些中断,可在程序中将相应中断控制位置为1。 • 用户可通过对IE、IE2和INT_CLKO中相应的位进行置1或清0的操作来允许或禁止各中断源的中断申请。禁止某个中断源申请中断,也称为屏蔽某个中断源。欲使某中断源允许中断,必须同时使EA=1,即同时使CPU允许中断。所以EA相当于中断允许的“总开关”。
(2)中断的优先级 • 外部中断2、外部中断3、定时器T2和外部中断4,不能设置为高优先级,其他中断源通过特殊功能寄存器(IP和IP2)中的相应位,可设为高、低二级优先级,实现二级中断嵌套,与传统8051单片机两级中断优先级完全兼容。
STC15F2K60S2单片机对中断优先级的处理原则 • 低优先级中断可被高优先级中断所中断,反之不能。 • 任何一种中断(不管是高优先级还是低优先级),一旦得到响应,不会再被它的同级中断所中断。
同一优先级的中断源同时申请中断时,按照事先约定的硬件查询顺序响应中断。这相当于在每个优先级内,还同时存在另一个辅助优先级结构(称为默认的优先级)同一优先级的中断源同时申请中断时,按照事先约定的硬件查询顺序响应中断。这相当于在每个优先级内,还同时存在另一个辅助优先级结构(称为默认的优先级) • STC15F2K60S2单片机各中断默认的优先级如表6-2所示。其中,默认中断优先级次序号越小,优先级越高。
1)中断优先级寄存器IP • 中断优先级寄存器IP(地址为B8H,复位值为00H)各位的定义如下: 每一位对应其相应的中断源的优先级控制位。 1:高优先级;0:低优先级。
2)第二中断优先级低字节寄存器IP2 • 第二中断优先级低字节寄存器IP2(地址为B5H,复位值为XXXXXX00B): 1)PSPI:SPI中断优先级控制位。 1:SPI中断为高优先级; 0:SPI中断为低优先级。 2)PS2:串口2中断优先级控制位。 1:串口2中断为高优先级; 0:串口2中断为低优先级。
例如, 如果要允许外部中断0中断,需要将EX0和EA 都置1。 如果要允许A/D转换中断,则需要将EADC和 EA都置1。
二、单片机中断处理过程 1、单片机响应中断的条件和过程 当中断源向CPU发出中断请求时,如果中断 的条件满足,CPU将进入中断响应周期。单片 机响应中断的条件是: • 中断源有请求。 • 相应的中断允许位设置为1。 • 无同级或高级中断正在处理; • CPU中断开放(EA=1)。
在每个指令周期的最后一个时钟周期,CPU对各中断源采样,并设置相应的中断标志位。CPU在下一个指令周期的最后一个时钟周期按优先级顺序查询各中断标志,如查到某个中断标志为1,将在下一个指令周期按优先级的高低顺序响应中断并进行处理。在每个指令周期的最后一个时钟周期,CPU对各中断源采样,并设置相应的中断标志位。CPU在下一个指令周期的最后一个时钟周期按优先级顺序查询各中断标志,如查到某个中断标志为1,将在下一个指令周期按优先级的高低顺序响应中断并进行处理。
CPU响应中断时,将执行如下操作: • 当前正被执行的指令执行完毕; • PC值被压入堆栈; • 现场保护; • 阻止同级别其他中断; • 将中断服务程序的入口地址(中断向量地址)装载到程序计数器PC; • 执行相应的中断服务程序。
每个中断服务程序的入口地址之间只相隔8个单元,一般中断服务程序的长度都超过8个字节,这时可以将中断服务程序存放到存储器的其他区域,然后在中断入口处安排一条转移指令LJMP,转向中断服务程序。例如:每个中断服务程序的入口地址之间只相隔8个单元,一般中断服务程序的长度都超过8个字节,这时可以将中断服务程序存放到存储器的其他区域,然后在中断入口处安排一条转移指令LJMP,转向中断服务程序。例如: ORG 0003H ;外部中断0入口地址 LJMP X0_ISR ··· ;其他程序代码 X0_ISR: ;外部中断0服务程序 ··· RETI
使用C语言编写单片机中断应用程序时,用中断号使用C语言编写单片机中断应用程序时,用中断号 区分每一个中断。例如, void X0_ISR(void) interrupt 0{} //外部中断0中断函数 void T0_ISR (void) interrupt 1{} //定时器T0 中断函数 void X1_ISR(void) interrupt 2{} //外部中断1中断函数 void T1_ISR (void) interrupt 3{} //定时器T1中断函数 void UART1_ISR (void) interrupt 4{} //串行口1中断函数 void ADC_ISR (void) interrupt 5{} //ADC中断函数 void LVD_ISR (void) interrupt 6{} //低电压检测LVD中断函数
void PCA_ISR (void) interrupt 7{} //PCA中断函数 void UART2_ISR (void) interrupt 8{} //串行口2中断函数 void SPI_ISR (void) interrupt 9{} //SPI通信中断函数 void X2_ISR(void) interrupt 10{} //外部中断2中断函数 void X3_ISR(void) interrupt 11{} //外部中断3中断函数 void T2_ISR (void) interrupt 12{} //定时器T2中断函数 void X4_ISR(void) interrupt 16{} //外部中断4中断函数
在程序的运行过程中,并不是任何时刻都可以响应中断请求。出现下列情况时,CPU不会响应中断请求:在程序的运行过程中,并不是任何时刻都可以响应中断请求。出现下列情况时,CPU不会响应中断请求: • 中断允许总控制位EA=0或发出中断请求的中断源所对应的中断允许控制位为0。 • CPU正在执行一个同级或高级的中断服务程序。 • 当前执行指令的时刻不是指令周期的最后一个时钟周期。 • 正在执行的指令是中断返回指令RETI或者是访问IE或IP的指令时,CPU至少要再执行一条指令才能响应中断请求。
2、中断服务 • 中断服务程序从入口地址开始执行,直到执行返回指令RETI为止。RETI指令表示中断服务程序的结束。 • 中断服务程序由四个部分组成,即保护现场、中断服务、恢复现场以及中断返回。 • 由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况决定是否需要保护。在C语言程序中不需要进行现场保护。
在编写中断服务程序时应注意以下两点: • 单片机响应中断后,不会自动关闭中断系统。如果用户程序不希望出现中断嵌套,则必须在中断服务程序的开始处关闭中断,禁止更高优先级的中断请求中断当前的服务程序。 • 为了保证保护现场和恢复现场能够连续进行,可在保护现场和恢复现场之前先关中断,当现场保护或现场恢复结束后,再根据实际需要决定是否需要开中断。
三、中断请求的撤除 中断源向CPU发出中断请求后,中断请求信号分别锁 存在特殊功能寄存器中。 当某个中断源的请求被CPU响应后,应将相应的中断 请求标志清除。CPU在处理中断结束并返回到主程序 后,如果中断请求标志没有及时清除,会引起CPU多次 甚至反复响应该中断源的中断请求,从而使CPU进入死 循环的现象;而撤除过早,有可能中断尚未响应,造成 请求信号的丢失。所以,及时撤除中断请求是很重要的。
1、定时器/计数器T0、T1中断请求的撤除 • 当CPU响应T0或T1的中断请求后,由硬件自动清除相应的中断请求标志TF0或TF1。所以在处理定时器/计数器的中断时,无需关心清除中断请求标志的问题。 2、外部中断请求的撤除 • CPU响应外部中断0和外部中断1后,由硬件自动清除中断请求标志IE0和IE1。 • 外部中断2、3和4的中断请求标志对用户不可见,CPU响应外部中断2~4后,由硬件自动清除中断请求标志,无需用户清0。
3、串行口中断请求的撤除 CPU响应串行口中断后,不能由硬件自动清除 串行口中断标志(UART1为TI和RI,UART2为 S2TI和S2RI)。由于串行口的发送中断和接收 中断使用相同的入口地址,所以,CPU响应串 行中断后,首先应检测这两个中断标志位,以判 断是发送中断还是接收中断。当检测结束后,应 通过软件将串行口中断标志清0。