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

概要:

         本节主要记录在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灯。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值