新闻中心

EEPW首页>嵌入式系统>设计应用> OK6410按键中断点亮lED

OK6410按键中断点亮lED

作者: 时间:2016-11-21 来源:网络 收藏
首先理清楚要准备的几个方面
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,0n" //使用中断向量表
"orr r0,r0,#(1<<24)n"
"mcr p15,0,r0,c1,c0,0n"
"mrs r0,cpsrn"
"bic r0, r0, #0x80n" //cpsr第7位清零,取消中断不使能
"msr cpsr_c, r0n"
:
:
);
}
中断处理程序
void k1_isr()
{
//保存环境
__asm__(
"sub lr, lr, #4n"
"stmfd sp!, {r0-r12, lr}n"
:
:
);
//中断处理
led_off();
//清除中断
EXT_INT_0_PEND = ~0x0; //清除标记 pend是中断标志位
VIC0ADDRESS = 0; //把向量地址清零,方便下次用向量方式处理中断
VIC1ADDRESS = 0; //
//恢复环境
__asm__(
"ldmfd sp!, {r0-r12, pc}^ n"
:
:
);
}
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


评论


技术专区

关闭