嵌入式bootloader开发之九----键盘中断控制LED灯(Tiny 6410)
2013-11-12 13:28
232 查看
概要:
本节主要记录在Tiny 6410开发板中编写的裸机程序按键中断控制LED灯的亮灭。
Tiny6410中配置了8个用户定义的按键,本文使用了KEY1来控制LED1~LED4的亮灭。按键和LED的电路图如下:
![](http://img.blog.csdn.net/20131112130601109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVmYmFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20131112130616421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVmYmFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
K1对应的是外部中断EINT0,LED1~LED4的配置方法和文章嵌入式bootloader开发之六(Tiny
6410)所描述的一样,不再做做陈述,主要记录下外部中断的配置方法以及如何使用VIC来进行中断控制和如何编写裸机中断处理程序。
从原理上来说外部中断和上一篇中所描述的watchdog中断类似,只是外部中断多了一些额外的配置,需要配置中断触发的方式,主要可以分为两种:电平触发和边沿触发。
电平触发又可以分为高电平和低电平触发,而边沿触发又可以分为上升沿、下降沿和上下都触发的方式。另外要配置中断允许寄存器EINT0 ENABLE,使得硬件可以发出中断信号,具体配置代码如下:
从按键的电路连接图可以看出当按键未按下时为高,按下时为低,所以设置其为下降沿触发中断,在中断处理函数中,打印相应的信息,控制LED灯的亮灭,同时清除中断信号和中断处理函数地址寄存器VIC0ADDRESS,具体代码如下:
LED灯的亮灭控制使用比较简单的方法来实现,全局变量flag指示当前是否要关还是打开LED灯。
本节主要记录在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灯。
相关文章推荐
- 嵌入式bootloader开发之十一-------裸机程序LED开发(Tiny 6410)
- 嵌入式bootloader开发之七---裸机watchdog中断开发(Tiny 6410)
- 嵌入式bootloader开发之三(Tiny 6410)
- 嵌入式bootloader开发之十----虚拟机环境配置(Tiny 6410)
- 嵌入式bootloader开发之四(Tiny 6410)
- 嵌入式bootloader开发之八----NAND Flash读写擦除操作实现(Tiny 6410)
- 嵌入式bootloader开发之一(Tiny 6410)
- 嵌入式bootloader开发之二(Tiny 6410)
- 嵌入式bootloader开发之五(Tiny 6410)
- 嵌入式Linux LED,键盘,AD驱动程序开发
- Tiny6410按键轮询方式控制LED的SD卡启动裸机程序
- [置顶] ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
- 嵌入式系统开发之中断控制的实现
- ARM嵌入式学习--OK6410裸板程序--2.GPIO控制LED跑马灯(从ARM汇编跳转到C语言)
- ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED
- 嵌入式开发之外部中断控制
- 嵌入式系统学习(五)-NanoPi2基础实例开发(裸机程序按钮控制LED灯)
- OK6410利用矢量中断通过按键控制LED灯
- 【嵌入式】——arm裸机开发 step by step 之 按键控制 LED 和 蜂鸣器
- 黑莓开发新手入门教学帖,如何制作一个能控制LED颜色的程序(一)