一、中断处理机制概述
中断是CPU在执行程序过程中,遇到急需处理的事件时,暂时停止当前程序的执行,转而执行处理该事件的中断服务程序,并在处理完毕后返回原程序继续执行的过程。S3C2440提供了丰富的中断源,包括内部中断和外部中断,以及支持子中断的功能。
二、中断处理得流程
上图为中断处理的框图,首先中断源分为有子中断和无子中断两类;
(1)当有子中断时,SUBSRCPND和SRCPND会自动置位,紧接着需要将中断屏蔽寄存器和次级中断屏蔽寄存器(SUBMASK和INTMSK以及INTSUBMSK设置为0)使能(开启中断服务),此时表明中断设置成功;
接下来使用INTOFFSET中断偏移寄存器可以准确定位到中断处理函数的地址处,进而进行中断处理;需要注意的是在中断处理函数中,当处理完业务之后,必须将之前因中断产生而置位的中断标志位清除(一般写入1即可),顺序必须遵循如上框图,从左至右,依次清除;
(2)无子中断的处理过程和有子中断的基本一致,省略掉子中断的那一部分即可;
二、中断实现
外部中断:通过引脚接收
S3C2440有24个外部中断引脚
EXTINT0 —》设置信号
EINTMASK–》信号使能
EINTPEND–》 信号标志
void deal_eint8_23(void)
{
if(EINTPEND & (1 << EINT8))
{
EINTPEND |= (0x01 << EINT8);
}
}
void deal_irq_c(void)
{
unsigned int irq_num = INTOFFSET;
switch(irq_num)
{
case EINT8_23:
deal_eint8_23();
break;
default:
break;
}
SRCPND |= (1 << irq_num);
INTPND = INTPND;
}
void eint8_init(void)
{
//配置GPG0功能位eint8
GPGCON &= ~(0x3 << 0);
GPGCON |= (0x2 << 0);
//设置eint8的触发方式
EXTINT1 &= ~(0x7 << 0);
EXTINT1 |= (0x2 << 0);
//使能eint8
EINTMASK &= ~(0x1 << 8);
//使能eint8_23
INTMSK &= ~(0x1 << 5);
}