首要理清楚要预备的几个方面
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; //铲除符号 pend是中止标志位
//康复环境
__asm__(
}
在OK6410里边我感觉中止有一点比较特别,便是能够选用向量方法处理中止,这儿就需要知道,先来个表格
便是这个,这儿能够看到,external interrupt0到external interrupt3一起归于VIC0组,这样它在运用向量方法时就会共用向量地址,所以在一起用external interrupt0和external interrupt1时就会呈现external interrupt1的按键没有用,便是由于向量地址被external interrupt0占用了,所以我用了external interrupt0和external interrupt5,external interrupt5归于V%&&&&&%1,向量地址在external interrupt0的向量地址的基础上加4。
This time can be OK