一、中断基础概念
中断:指计算机执行现行程序的过程中,出现某些急需处理的异常情况和特殊请求(满足中断条件),cpu暂时终止现行程序,而转去对随机发生的更紧迫的事件进行处理,在处理完毕后,cpu将自动返回原来的程序继续执行。(中断根据中断条件分类有,外部中断、定时中断等)
外部中断:使用外部中断是通过配置某一个IO,使得能够检测外部的中断信号;开启中断后,CPU自动检测中断条件,当外部中断条件满足时,cpu暂时终止现行程序,而转去处理中断函数的代码,处理完毕后,cpu将自动返回原来的程序继续执行。
1、外部中断开关逐级管理
要使用中断功能,首先要开启CPU的中断功能,中断功能的开启是逐级管理模式。本文以外部中断为例,如下图,只有对应的逐级开关都被开启时,才能开启对应的中断功能。其他类型的中断开启类似。
(1)中断总开关 EA,开启CPU总中断(EA=1);
(2)中断组开关PxIE,开启某一组IO的外部中断(PxIE=1);
(3)中断组内开关PxIEN,开启组内对应具体某IO口的中断(PxIEN=1);
注意:P0IE属于IEN1寄存器,而IEN1寄存器地址为0xB8,可以被8整除,所以P0IE被单独定义了可以直接赋值操作;而P1IE和P2IE属于IEN2寄存器,而IEN2寄存器的地址为0x9A,无法被8整除,所以IEN2的每个位没有被单独定义,只能通过配置IEN2寄存器来配置P1IE和P2IE。
(4)对应寄存器:
EA
PxIE
PxIEN
2、中断触发方式
外部中断方式分为上升沿触发和下降沿触发,其触发方式的设置由寄存器PICTL控制。
3、中断标志
(1)端口中断标志(PxIF寄存器)
PxIF标志位的作用是:哪个IO组触发中断,相应的PxIF位就为1。
(2)端口中断状态标志(PxIFG寄存器)
PxIFG寄存器的作用是:进入中断后,用于判断是相应IO组内哪个IO口触发了中断,哪个位就为1;中断条件发生在 I/O 引脚之一上面,P0-P2 中断标志寄存器 P0IFG、P1IFG 或 P2IFG 中相应的中断状态标志将设置为 1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态标志被清除,该标志写入 0。这个标志必须在清除 CPU 端口中断标志(PxIF)之前被清除。
4、中断函数
(1)中断向量
二、外部中断配置流程
根据上述外部中断的介绍,开启同一个外部中断流程如下:
(1)案例,通过P0_1口作为引起下降沿触发外部中断,使得P0_1控制的LED灯进行亮暗翻转。
#include<iocc2530.h>
//初始化一个按键中断
void initInterrupt()
{
P0SEL &= 0xfd; //中断口是P0_1
P0DIR &= 0xfd;
P0INP &= 0xfd;
P2INP &= 0xdf;
EA = 1; //开启总中断
P0IE = 1; //开启组中断
P0IEN |= 0x02; //开启位中断
PICTL |= 0x01;//下降沿触发
}
// 初始化一个LED P1_0
void initLED()
{
P1SEL &= 0xfe;
P1DIR |= 0x01;
P1_0 = 1;
}
void main()
{
initInterrupt(); //初始化一个按键中断
initLED(); // 初始化一个LED
while(1);
}
#pragma vector=P0INT_VECTOR
__interrupt void P0_INT(void)
{
if(P0IFG & 0x02) //判断是否是相应的IO位引起的中断
{
delayms( 10 ) ;
if(P0_1 == 0)
{
P1_0 = ~P1_0;
}
}
P0IFG = 0; //清除中断标志
P0IF = 0; //清除中断标志
}