中断实验(4)

下面我们来看看interrupt.c这个文件,这个程序主要是处理中断和清除中断,处理中断说白了就是规定了我们按下每个按键后按什么规则处理他们。清除中断,如果我们不及时在中断处理完后清除他们,arm就会不断地执行中断,无法跳回正常的程序。

下面是代码:

#define INTOFFSET (*(volatile unsigned long *) 0x4A000014)
#define EINTPEND (*(volatile unsigned long *) 0x560000a8)
#define SRCPND (*(volatile unsigned long *) 0X4A000000)
#define INTPND (*(volatile unsigned long *) 0X4A000010)
#define GPBDAT (*(volatile unsigned long *)  0x56000014)    //同样,这里规定了下面要用到的一些寄存器

int delay(unsigned long i)                      //这是一个延迟函数
{
for(;i>0;i--);
}

void EINT_Handle()                              //处理中断的函数从这里开始
{
unsigned long oft = INTOFFSET;     //INTOFFSET寄存器的功能则很简单,它的作用只是用于表明哪个中断正在被处理,我们把它的值取出来放在oft里面
unsigned long i=0x5FFF;                  //这是一个延迟循环的基数
unsigned long j=3;                            //这个值后面会用到

switch( oft )                                       //开始判断中断是哪个按钮引起的
{
case 1:                                         //如果是1,那么是K1引起的终端,为什么是1,可以参考之前的文章,用查询方式控制LED灯亮灭
{
GPBDAT |= (0x0f<<5);              //这一小段程序是跑马灯
GPBDAT &=~(1<<5);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<6);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<7);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<8);
delay(i);
GPBDAT |= (0x0f<<5);
break;
}
case 4:                                          //K2引起的中断,下面的代码是倒着跑马灯
{
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<8);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<7);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<6);
delay(i);
GPBDAT |= (0x0f<<5);
GPBDAT &=~(1<<5);
delay(i);
GPBDAT |= (0x0f<<5);
break;
}
case 2:
{
GPBDAT |=(0x0f<<5);
GPBDAT &=~(1<<5) & ~(1<<8);
delay(i);
GPBDAT |=(0x0f<<5);
GPBDAT &=~(1<<6) & ~(1<<7);
delay(i);
GPBDAT |=(0x0f<<5);
GPBDAT &=~(1<<6) & ~(1<<7);
delay(i);
GPBDAT |=(0x0f<<5);
GPBDAT &=~(1<<5) & ~(1<<8);
delay(i);
GPBDAT |=(0x0f<<5);   
break;
}
case 0:
{
for(;j>0;j--)
{
GPBDAT &=~(1<<5) & ~(1<<6) & ~(1<<7) & ~(1<<8);
delay(i);
GPBDAT |=(0x0f<<5);
delay(i);
}
break;
}
default:
break;
}
if (oft == 1 || oft ==4 || oft ==0 || oft ==2)                       //这里开始清除中断,无论是哪个按钮引起的中断都要把它清除
{
EINTPEND = (1<<4);                                       //这个主要是为了清除K2引起的中断,对已其他几个没用
SRCPND = 1<<0 | 1<<1 | 1<<2 | 1<<4;           //清除中断的顺序一定不能错, 先EINTPEND,再SRCPND,最后INTPND
INTPND = 1<<0 | 1<<1 | 1<<2 | 1<<4;              //清除寄存器里的中断就是向相应的位上写1
}
}


到此为止,所有关于中断的代码已经结束了,读者自己体会,记得这个是裸板程序...但这个小系列并没有结束,下一篇将介绍关于编译这4段程序的Makefile的一些讲解还有一些工具的使用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值