微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > OK6410按键中断点亮lED

OK6410按键中断点亮lED

时间: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,0\n" //使用中断向量表

"orr r0,r0,#(1<24)\n"

"mcr p15,0,r0,c1,c0,0\n"

"mrs r0,cpsr\n"

"bic r0, r0, #0x80\n" //cpsr第7位清零,取消中断不使能

"msr cpsr_c, r0\n"

:

:

);

}

中断处理程序

void k1_isr()

{

//保存环境

__asm__(

"sub lr, lr, #4\n"

"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

上一篇:PIC MSSP_SPI_74HC595
下一篇:LCD简易计算器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top