STC15中断系统介绍
- ✨本篇参考来源于STC官方stc15系列手册:538页- 589页。(文末提供该摘取部分的文档资料)
🎉在官方提供的手册资料中,一个系列一份手册,手册内容涵盖了数据手册和参考手册以及例程案例。对于学习着来说,一份接近15K页的文档,即使有目录,也不好翻阅其相关的内容。所以有必要进行拆解学习。
🌼中断系统
- 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
- 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件 ,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
- 当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的 服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
🔰中断响应规则
- 低优先级中断可被高优先级中断所中断,反之不能。
- 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断.
🌻STC15系列单片机的中断请求源
🍁中断结构图
- 外部中断0(INT0)和外部中断1(INT1)既可上升沿触发,又可下降沿触发。请求两个外部中断的标志位是位于寄存器TCON中的IE0/TCON.1和IE1/TCON.3。当外部中断服务程序被响应后,中断标志位IE0和IE1会自动被清0。TCON寄存器中的IT0/TCON.0和IT1/TCON.2决定了外部中断0和1是上升沿触发还是下降沿触发。如果ITx = 0(x = 0,1),那么系统在INTx(x = 0,1)脚探测到上升沿或下降沿后均可产生外部中断。如果ITx = 1(x = 0,1),那么系统在INTx( x= 0,1)脚探测下降沿后才可产生外部中断。外部中断0(INT0)和外部中断1(INT1)还可以用于将单片机从掉电模式唤醒。
- 定时器0和1的中断请求标志位是TF0和TF1。当定时器寄存器THx/TLx(x = 0,1)溢出时,溢出标志位TFx(x = 0,1)会被置位,如果定时器0/1的中断被打开,则定时器中断发生。当单片机转去执行该定时器中断时,定时器的溢出标志位TFx(x = 0,1)会被硬件清除。
- 外部中断2(INT2)、外部中断3(INT3)及外部中断4(INT4)都只能下降沿触发。外部中断2~4的中断请求标志位被隐藏起来了,对用户不可见。当相应的中断服务程序被响应后或EXn=0(n=2,3,4),这些中断请求标志位会立即自动地被清0。外部中断2(INT2)、外部中断3(INT3)及外部中断4(INT4)也可以用于将单片机从掉电模式唤醒。
- 定时器2的中断请求标志位被隐藏起来了,对用户不可见。当相应的中断服务程序被响应后或ET2=0,该中断请求标志位会立即自动地被清0
- 定时器3和定时器4的中断请求标志位同样被隐藏起来了,对用户不可见。当相应的中断服务程序被响应后或ET3=0 / ET4=0,该中断请求标志位会立即自动地被清0
- 当串行口1发送或接收完成时,相应的中断请求标志位TI或RI就会被置位,如果串口1中断被打开,向CPU请求中断,单片机转去执行该串口1中断。中断响应后,TI或RI需由软件清零。
- 当串行口2发送或接收完成时,相应的中断请求标志位S2TI或S2RI就会被置位,如果串口2中断被打开,向CPU请求中断,则单片机转去执行该串口2中断。中断响应后,S2TI或S2RI需由软件清零。
- 当串行口3发送或接收完成时,相应的中断请求标志位S3TI或S3RI就会被置位,如果串口3
中断被打开,向CPU请求中断,则单片机转去执行该串口3中断。中断响应后,S3TI或S3RI需由
软件清零。 - 当串行口4发送或接收完成时,相应的中断请求标志位S4TI或S4RI就会被置位,如果串口4中断被打开,向CPU请求中断,则单片机转去执行该串口4中断。中断响应后,S4TI或S4RI需由软件清零。
- A/D转换的中断是由ADC_FLAG/ADC_CONTR.4请求产生的。该位需用软件清除。
- 低压检测(LVD)中断是由LVDF/PCON.5请求产生的。该位也需用软件清除。
- 当同步串行口SPI传输完成时,SPIF/SPCTL.7被置位,如果SPI中断被打开,则向CPU请求中断,单片机转去执行该SPI中断。中断响应完成后,SPIF需通过软件向其写入“1”清零。
- 比较器中断标志位CMPIF=(CMPIF_p || CMPIF_n),其中CMPIF_p是内建的标志比较器上升沿中断的寄存器,CMPIF_n是内建的标志比较器下降沿中断的寄存器;当CPU 去读取 CMPIF的数值时会读(CMPIF_p || CMPIF_n);当CPU 对CMPIF写“0”后CMPIF_p及CMPIF_n会被自动设置为“0”。因此,当比较器的比较结果由LOW变成HIGH时,那么内建的标志比较器上升沿中断的寄存器CMPIF_p会被设置成1,即比较器中断标志位CMPIF也会被设置成1,如果比较器上升沿中断已被允许,即PIE(CMPCR1.5)已被设置成1,则向CPU请求中断,单片机转去执行该比较器上升中断;同理,当比较器的比较结果由HIGH变成LOW时,那么内建的标志比较器下降沿中断的寄存器CMPIF_n会被设置成1,即比较器中断标志位CMPIF也会被设置成1,如果比较器下降沿中断已被允许,即NIE(CMPCR1.4)已被设置成1,则向CPU请求中断,单片机转去执行该比较器下降中断。中断响应完成后,比较器中断标志位CMPIF不会自动被清零,用户需通过软件向其写入“0”清零它。
-
各个中断触发行为总结如下表所示:
🌷中断向量入口地址/查询次序/优先级/请求标志/允许位表
📝在Keil C中如何声明中断函数
void Int0_Routine(void) interrupt 0;
void Timer0_Rountine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Rountine(void) interrupt 3;
void UART1_Routine(void) interrupt 4;
void ADC_Routine(void) interrupt 5;
void LVD_Routine(void) interrupt 6;
void PCA_Routine(void) interrupt 7;
void UART2_Routine(void) interrupt 8;
void SPI_Routine(void) interrupt 9;
void Int2_Routine(void) interrupt 10;
void Int3_Routine(void) interrupt 11;
void Timer2_Routine(void) interrupt 12;
void Int4_Routine(void) interrupt 16;
void S3_Routine(void) interrupt 17;
void S4_Routine(void) interrupt 18;
void Timer3_Routine(void) interrupt 19;
void Timer4_Routine(void) interrupt 20;
void Comparator_Routine(void) interrupt 21;
void PWM_Routine(void) interrupt 22;
void PWMFD_Routine(void) interrupt 23;
📋中断寄存器
- STC15W4K32S4系列新增6通道带死区控制的PWM波形发生器的中断相关特殊功能寄存器:
- 中断允许寄存器IE
- EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。
- ELVD : 低压检测中断允许位,ELVD=1,允许低压检测中断,ELVD=0,禁止低压检测中断。
- EADC : A/D转换中断允许位,EADC=1,允许A/D转换中断,EADC=0,禁止A/D转换中断。
- 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允许中断,EX0=0禁止中断.
- IE2 : 中断允许寄存器 (不可位寻址)
-
- ET4:定时器4的中断允许位:
ET4=1,允许定时器4产生中断;
ET4=0,禁止定时器4产生中断
- ET4:定时器4的中断允许位:
-
- ET3:定时器3的中断允许位:
ET3=1,允许定时器3产生中断;
ET3=0,禁止定时器3产生中断
- ET3:定时器3的中断允许位:
-
- ES4 : 串行口4中断允许位:
ES4=1,允许串行口4中断;
ES4=0,禁止串行口4中断
- ES4 : 串行口4中断允许位:
-
- ES3 : 串行口3中断允许位:
ES3=1,允许串行口3中断;
ES3=0,禁止串行口3中断。
ET2:定时器2的中断允许位。
ET2=1,允许定时器2产生中断;
ET2=0,禁止定时器2产生中断
- ES3 : 串行口3中断允许位:
-
- ESPI:SPI中断允许位。
ESPI=1,允许SPI中断;
ESPI=0,禁止SPI中断。
- ESPI:SPI中断允许位。
-
- ES2 : 串行口2中断允许位。
ES2=1,允许串行口2中断;
ES2=0,禁止串行口2中断。
- ES2 : 串行口2中断允许位。
- INT_CLKO (AUXR2) : 外部中断允许和时钟输出寄存器
-
- EX4 : 外部中断4(INT4)中断允许位,EX4=1允许中断,EX4=0禁止中断。外部中断4(INT4)只
能下降沿触发。
- EX4 : 外部中断4(INT4)中断允许位,EX4=1允许中断,EX4=0禁止中断。外部中断4(INT4)只
-
- EX3 : 外部中断3(INT3)中断允许位,EX3=1允许中断,EX3=0禁止中断。外部中断3(INT3)也
只能下降沿触发。
- EX3 : 外部中断3(INT3)中断允许位,EX3=1允许中断,EX3=0禁止中断。外部中断3(INT3)也
-
- EX2 : 外部中断2(INT2)中断允许位,EX2=1允许中断,EX2=0禁止中断。外部中断2(INT2)同
样只能下降沿触发。
- EX2 : 外部中断2(INT2)中断允许位,EX2=1允许中断,EX2=0禁止中断。外部中断2(INT2)同
MCKO_S2, T2CLKO, T1CLKO,T0CLKO与中断无关.
-
IP : 中断优先级控制寄存器 (可位寻址)
-
- PPCA: PCA中断优先级控制位。
当PPCA=0时,PCA中断为最低优先级中断(优先级0)
当PPCA=1时,PCA中断为最高优先级中断(优先级1)
- PPCA: PCA中断优先级控制位。
-
- PLVD: 低压检测中断优先级控制位。
当PLVD=0时,低压检测中断为最低优先级中断(优先级0)
当PLVD=1时,低压检测中断为最高优先级中断(优先级1)
- PLVD: 低压检测中断优先级控制位。
-
- PADC: A/D转换中断优先级控制位。
当PADC=0时,A/D转换中断为最低优先级中断(优先级0)
当PADC=1时,A/D转换中断为最高优先级中断(优先级1)
- PADC: A/D转换中断优先级控制位。
-
- PS: 串口1中断优先级控制位。
当PS=0时,串口1中断为最低优先级中断(优先级0)
当PS=1时,串口1中断为最高优先级中断(优先级1)
- PS: 串口1中断优先级控制位。
-
- PT1: 定时器1中断优先级控制位。
当PT1=0时,定时器1中断为最低优先级中断(优先级0)
当PT1=1时,定时器1中断为最高优先级中断(优先级1)
- PT1: 定时器1中断优先级控制位。
-
- PX1: 外部中断1优先级控制位。
当PX1=0时,外部中断1为最低优先级中断(优先级0)
当PX1=1时,外部中断1为最高优先级中断(优先级1)
- PX1: 外部中断1优先级控制位。
-
- PT0: 定时器0中断优先级控制位。
当PT0=0时,定时器0中断为最低优先级中断(优先级0)
当PT0=1时,定时器0中断为最高优先级中断(优先级1)
- PT0: 定时器0中断优先级控制位。
-
- PX0: 外部中断0优先级控制位。
当PX0=0时,外部中断0为最低优先级中断(优先级0)
当PX0=1时,外部中断0为最高优先级中断(优先级1)
- PX0: 外部中断0优先级控制位。
-
IP2 : 中断优先级控制寄存器 (不可位寻址)
-
- PX4: 外部中断4(INT4)优先级控制位。
当PX4=0时,外部中断4(INT4)为最低优先级中断(优先级0)
当PX4=1时,外部中断4(INT4)为最高优先级中断(优先级1)
- PX4: 外部中断4(INT4)优先级控制位。
-
- PPWMFD: PWM异常检测中断优先级控制位。
当PPWMFD=0时,PWM异常检测中断为最低优先级中断(优先级0)
当PPWMFD=1时,PWM异常检测中断为最高优先级中断(优先级1)
- PPWMFD: PWM异常检测中断优先级控制位。
-
- PPWM: PWM中断优先级控制位。
当PPWM=0时,PWM中断为最低优先级中断(优先级0)
当PPWM=1时,PWM中断为最高优先级中断(优先级1)
- PPWM: PWM中断优先级控制位。
-
- PSPI: SPI中断优先级控制位。
当PSPI=0时,SPI中断为最低优先级中断(优先级0)
当PSPI=1时,SPI中断为最高优先级中断(优先级1)
- PSPI: SPI中断优先级控制位。
-
- PS2: 串口2中断优先级控制位。
当PS2=0时,串口2中断为最低优先级中断(优先级0)
当PS2=1时,串口2中断为最高优先级中断(优先级1)
- PS2: 串口2中断优先级控制位。
中断优先级控制寄存器IP和IP2的各位都由可用户程序置“1”和清“0”。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IP2寄存器的内容只能用字节操作指令来更新。STC15系列单片机复位后IP和IP2均为00H,各个中断源均为低优先级中断。
- TCON : 定时器/计数器中断控制寄存器 (可位寻址)
-
- TF1: T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置
“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。
- TF1: T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置
-
- TR1: 定时器1的运行控制位。
-
- TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置
“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软件清0)。
TR0: 定时器0的运行控制位。
- TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置
-
- IE1:外部中断1(INT1/P3.3)中断请求标志。IE1=1,外部中断向CPU请求中断,当CPU响应
该中断时由硬件清“0”IE1。
- IE1:外部中断1(INT1/P3.3)中断请求标志。IE1=1,外部中断向CPU请求中断,当CPU响应
-
- IT1:外部中断1中断源类型选择位。IT1=0,INT1/P3.3引脚上的上升沿或下降沿信号均可触发
外部中断1。IT1=1,外部中断1为下降沿触发方式。
- IT1:外部中断1中断源类型选择位。IT1=0,INT1/P3.3引脚上的上升沿或下降沿信号均可触发
-
- IE0:外部中断0(INT0/P3.2)中断请求标志。IE0=1,外部中断0向CPU请求中断,当CPU响
应外部中断时,由硬件清“0”IE0。
- IE0:外部中断0(INT0/P3.2)中断请求标志。IE0=1,外部中断0向CPU请求中断,当CPU响
-
- IT0:外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的上升沿或下降沿均可触发外部
中断0。IT0=1,外部中断0为下降沿触发方式。
- IT0:外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的上升沿或下降沿均可触发外部
- SCON : 串行口控制寄存器 (可位寻址)
-
- RI: 串行口1接收中断标志。若串行口1允许接收且以方式0工作,则每当接收到第8位数据时
置1;若以方式1、2、3工作且SM2=0时,则每当接收到停止位的中间时置1;当串行口以方式2或方式3工作且SM2=1时,则仅当接收到的第9位数据RB8为1后,同时还要接收到停止位的中间时置1。RI为1表示串行口1正向CPU申请中断(接收中断),RI必须由用户的中断服务程序清零。
- RI: 串行口1接收中断标志。若串行口1允许接收且以方式0工作,则每当接收到第8位数据时
-
- TI: 串行口1发送中断标志。串行口1以方式0发送时,每当发送完8位数据,由硬件置1;若以方式1、方式2或方式3发送时,在发送停止位的开始时置1。TI=1表示串行口1正在向CPU申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序时并不将TI清零,TI必须由用户在中断服务程序中清零。
SCON寄存器的其他位与中断无关。
- S2CON : 串行口2控制寄存器 (不可位寻址)
-
- S2RI: 串行口2接收中断标志。若串行口2允许接收且以方式0工作,则每当接收到第8位数据时
置1;若以方式1、2、3工作且S2SM2=0时,则每当接收到停止位的中间时置1;当串行口2以方式2或方式3工作且S2SM2=1时,则仅当接收到的第9位数据S2RB8为1后,同时还要接收到停止位的中间时置1。S2RI为1表示串行口2正向CPU申请中断(接收中断),S2RI必须由用户的中断服务程序清零。
- S2RI: 串行口2接收中断标志。若串行口2允许接收且以方式0工作,则每当接收到第8位数据时
-
- S2TI:串行口2发送中断标志。串行口2以方式0发送时,每当发送完8位数据,由硬件置1;若以方式1、方式2或方式3发送时,在发送停止位的开始时置1。S2TI=1表示串行口2正在向CPU申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序时并不将S2TI清零,S2TI必须由用户在中断服务程序中清零。
S2CON寄存器的其他位与中断无关。
- S3CON : 串行口3控制寄存器 (不可位寻址)
-
- S3RI: 串行口3接收中断标志。若串行口3允许接收且以方式0工作,则每当接收到第8位数据时
置1;若以方式1、2、3工作且S3SM2=0时,则每当接收到停止位的中间时置1;当串行口3以方式2或方式3工作且S3SM2=1时,则仅当接收到的第9位数据S3RB8为1后,同时还要接收到停止位的中间时置1。S3RI为1表示串行口3正向CPU申请中断(接收中断),S3RI必须由用户的中断服务程序清零。
- S3RI: 串行口3接收中断标志。若串行口3允许接收且以方式0工作,则每当接收到第8位数据时
-
- S3TI:串行口3发送中断标志。串行口3以方式0发送时,每当发送完8位数据,由硬件置1;若以方式1、方式2或方式3发送时,在发送停止位的开始时置1。S3TI=1表示串行口3正在向CPU申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序时并不将S3TI清零,S3TI必须由用户在中断服务程序中清零。
S3CON寄存器的其他位与中断无关。
- S4CON : 串行口4控制寄存器 (不可位寻址)
-
- S4RI: 串行口4接收中断标志。若串行口4允许接收且以方式0工作,则每当接收到第8位数据时
置1;若以方式1、2、3工作且S4SM2=0时,则每当接收到停止位的中间时置1;当串行口4以方式2或方式3工作且S4SM2=1时,则仅当接收到的第9位数据S4RB8为1后,同时还要接收到停止位的中间时置1。S4RI为1表示串行口4正向CPU申请中断(接收中断),S4RI必须由用户的中断服务程序清零。
- S4RI: 串行口4接收中断标志。若串行口4允许接收且以方式0工作,则每当接收到第8位数据时
-
- S4TI:串行口4发送中断标志。串行口4以方式0发送时,每当发送完8位数据,由硬件置1;若
以方式1、方式2或方式3发送时,在发送停止位的开始时置1。S4TI=1表示串行口4正在向CPU申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序时并不将S4TI清零,S4TI必须由用户在中断服务程序中清零。
- S4TI:串行口4发送中断标志。串行口4以方式0发送时,每当发送完8位数据,由硬件置1;若
S4CON寄存器的其他位与中断无关。
- PCON : 电源控制寄存器
-
- LVDF : 低压检测标志位,同时也是低压检测中断请求标志位。
在正常工作和空闲工作状态时,如果内部工作电压Vcc低于低压检测门槛电压,该位自动置1,与低压检测中断是否被允许无关。即在内部工作电压Vcc低于低压检测门槛电压时,不管有没有允许低压检测中断,该位都自动为1。该位要用软件清0,清0后,如 内部工作电压Vcc继续低于低压检测门槛电压,该位又被自动设置为1。
在进入掉电工作状态前,如果低压检测电路未被允许可产生中断,则在进入掉电模式后,该低压检测电路不工作以降低功耗。如果被允许可产生低压检测中断,则在进入掉电模式后,该低压检测电路继续工作,在内部工作电压Vcc低于低压检测门槛电压后,产生低压检测中断,可将MCU从掉电状态唤醒。
- LVDF : 低压检测标志位,同时也是低压检测中断请求标志位。
电源控制寄存器PCON中的其他位与低压检测中断无关.
- IE : 中断允许寄存器 (可位寻址)
-
- EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
- EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
-
- ELVD : 低压检测中断允许位,ELVD=1,允许低压检测中断,ELVD=0,禁止低压检测中断。
还有A/D转换控制寄存器和比较器控制寄存器以及PWM 的控制寄存器相关没有介绍。
- 可以参考另外一篇《STC15系列CCP/PWM/PCA介绍》
📚STC15相关章节拆分资料
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1GSWoJiHuvSmYi9VnaNEp9g
提取码: ir93