OK6410按键中断点亮lED
1.LED初始化
2.按键初始化
3.中断初始化
4.中断处理程序
首先初始化LED,以前说过了,不说
按键初始化,这里既然要用到中断,就不用传统的延时消抖的办法了,直接用中断。
只要把对应的位设置成10,就是外部中断了
这里用XEINT0和XEINT5,有理由的,为什么选这两个后面会说
void button_init()
{
*(GPNCON)=0x802;
}
接下来中断初始化,一下说的比较清楚了,寄存器的名字直接在s3c6410里面查找就可以了,为什么选XEINT0和XEINT5的原因在注释最长的那一行里面
void init_irq()
{
//配置按键中断下降沿触发
*(EINT0CON0)=0b010;
//取消中断屏蔽
*(EINT0MASK)=0x0;
//打开中断
*(VIC0INTENABLE)=0x3;
*(VIC0VECTADDR0)=(int)k1_isr; //把中断处理程序的地址写入中断向量表
*(VIC0VECTADDR1)=(int)k2_isr; //注意external interrupt0和external interrupt1属于同一个VIC0,使用同一个中断向量地址,所以这里用XEINT1和XEINT5
//设置cpsr寄存器使用向量方式中断,打开总中断
__asm__(
"mrc p15,0,r0,c1,c0,0\n" //使用中断向量表
"mrs r0,cpsr\n"
}
中断处理程序
void k1_isr()
{
//保存环境
__asm__(
"sub lr, lr, #4\n"
);
//中断处理
led_off();
//清除中断
EXT_INT_0_PEND = ~0x0;
//恢复环境
__asm__(
}
在OK6410里面我感觉中断有一点比较特殊,就是可以采用向量方式处理中断,这里就需要知道,先来个表格
就是这个,这里可以看到,external interrupt0到external interrupt3共同属于VIC0组,这样它在使用向量方式时就会共用向量地址,所以在同时用external interrupt0和external interrupt1时就会出现external interrupt1的按键没有用,就是因为向量地址被external interrupt0占用了,所以我用了external interrupt0和external interrupt5,external interrupt5属于VIC1,向量地址在external interrupt0的向量地址的基础上加4。
This time can be OK
OK6410按键中断点亮lE 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)