您的位置:首页 > 其它

嵌入式bootloader开发之九----键盘中断控制LED灯(Tiny 6410)

2013-11-12 13:28 232 查看
概要:

本节主要记录在Tiny 6410开发板中编写的裸机程序按键中断控制LED灯的亮灭。

Tiny6410中配置了8个用户定义的按键,本文使用了KEY1来控制LED1~LED4的亮灭。按键和LED的电路图如下:





K1对应的是外部中断EINT0,LED1~LED4的配置方法和文章嵌入式bootloader开发之六(Tiny
6410)所描述的一样,不再做做陈述,主要记录下外部中断的配置方法以及如何使用VIC来进行中断控制和如何编写裸机中断处理程序。

从原理上来说外部中断和上一篇中所描述的watchdog中断类似,只是外部中断多了一些额外的配置,需要配置中断触发的方式,主要可以分为两种:电平触发和边沿触发。

电平触发又可以分为高电平和低电平触发,而边沿触发又可以分为上升沿、下降沿和上下都触发的方式。另外要配置中断允许寄存器EINT0 ENABLE,使得硬件可以发出中断信号,具体配置代码如下:

void key_init(void)
{
GPNCON &= ~(0x3);
GPNCON |= (0x2);//set to external interrupt
GPNPUD &= ~(0x3);//
EINT0CON0 &= ~(0x7);
EINT0CON0 |= 0x2;//falling-edge trigger
EINT0MASK &= ~(0x1);//enable EINT0
}


从按键的电路连接图可以看出当按键未按下时为高,按下时为低,所以设置其为下降沿触发中断,在中断处理函数中,打印相应的信息,控制LED灯的亮灭,同时清除中断信号和中断处理函数地址寄存器VIC0ADDRESS,具体代码如下:

//ISR Entry
void irq_handler(void)
{
__asm__ volatile (
" sub lr,lr,#4\n"//修改返回地址
" stmfd sp,{r0-r14}\n"//保存程序执行现场
" sub sp,sp,#60\n"//修改sp指针,若直接使用stmfd sp!,{r0-r14}会提示warning
" mov lr,pc\n"//设置中断处理程序的返回地址
" ldr pc,=do_irq\n"//调用中断处理函数do_irq
" ldmfd sp,{r0-r13,pc}^\n"//中断处理完毕,恢复程序执行现场
);
}

void do_irq(void)
{
if(flag){
flag=0;
led_on(0xE);
}else{
flag=1;
led_off();
}

show("key1 entered!\n");
EINT0PEND &= 0x1;//清除EINT0中断
VIC0ADDRESS = 0;//清除中断处理程序中断
}


LED灯的亮灭控制使用比较简单的方法来实现,全局变量flag指示当前是否要关还是打开LED灯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: