中断触发方式
1.边沿触发:上、下、双
2.电平触发:高、低
中断处理流程:
1. 中断控制器汇集各类外设发出的中断信号,然后告诉CPU
2.CPU保存当前程序的运行环境,调用中断服务程序ISR来处理中断(如数据的压栈)
3. 在ISR中通过读取中断控制寄存器、外设的相关寄存器来识别是哪个中断,并进行相应的处理
4.清除中断:通过读写相关中断控制寄存器和外设相关寄存器来实现。最后恢复被中断程序的环境,继续执行
中断控制寄存器
SUBSRCPND寄存器(SUB SOURCE PENDING)
INTSUBMSK寄存器(INTERRUPT SUBMSK)
SRCPND寄存器(SOURCE PENDING)
INTMSK寄存器(INTERRUPT MASK)
INTMOD寄存器(INTRRUPT MODE)
PRIORITY寄存器
INTPND寄存器(INTERRUPT PENDING)
INTOFFSET寄存器(INTERRUPT OFFSET)
s3c2440
按键中断点亮LED
void key_init(void);
static void __irq key_handler(void);
/*************************************************
延时函数
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
rGPBCON &= ~(3<<10);// ÇåÁã
rGPBCON |= (1<<10);
}
/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
rGPBDAT &=~(1<<5); /*LEDÁÁ»¹ÊÇÃð£¿*/
delay(1000);
rGPBDAT |=(1<<5);
delay(1000);
}
/*************************************************
主函数
**************************************************/
void Main(void)
{
MMU_Init();
Led1_init();
key_init();
while(1);
}
/*************************************************
按键初始化
**************************************************/
void key_init(void)
{
rGPGCON &= ~(0x3<<0);
rGPGCON |= (0x2<<0);
rEXTINT1 &= ~(0xf<<0);
rEINTPEND |= (1<<8);
rEINTMASK &= ~(1<<8);
/*ÉèÖÃISR*/
pISR_EINT8_23=(U32)key_handler;
EnableIrq(BIT_EINT8_23);
}
/*************************************************
按键中断处理函数
**************************************************/
static void __irq key_handler(void)
{
if(rINTPND==BIT_EINT8_23)
{
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8))
{
rEINTPEND |= 1<< 8;
Led1_run();
}
}
}
轮询按键点亮LED
/*************************************************
延时函数
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
rGPBCON &= ~(3<<10);// ÇåÁã
rGPBCON |= (1<<10);
}
/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
rGPBDAT &=~(1<<5); /*LEDÁÁ»¹ÊÇÃð£¿*/
delay(1000);
rGPBDAT |=(1<<5);
delay(1000);
}
/***************************************************
按键初始化
***************************************************/
void key_init(void)
{
rGPGCON &= ~((3<<0) | (3<<6) | (3<<10) | (3<<12) | (3<<14) | (3<<22)) ;
}
/*************************************************
主函数
**************************************************/
void Main(void)
{
MMU_Init();
Led1_init();
key_init();
while(1)
{
if(!(rGPGDAT & (1<<0)))
{
Led1_run();
}
else if(!(rGPGDAT & (1<<3)))
{
Led1_run();
}
else if(!(rGPGDAT & (1<<5)))
{
Led1_run();
}
else if(!(rGPGDAT & (1<<6)))
{
Led1_run();
}
else if(!(rGPGDAT & (1<<7)))
{
Led1_run();
}
else if(!(rGPGDAT & (1<<11)))
{
Led1_run();
}
}
}