用中断的方式都控制LED
2011-08-17 11:39
274 查看
#include "2410lib.h" #include "Option.h" #include "2410slib.h" #include "def.h" #include "2410addr.h" #include "stdlib.h" #include "string.h" #include "mmu.h" #include "timer.h" #define LED_OPEN1 ~(1<<5) #define LED_OPEN2 ~(1<<6) #define LED_OPEN3 ~(1<<7) #define LED_CLOSE1 (1<<5) #define LED_CLOSE2 (1<<6) #define LED_CLOSE3 (1<<7) int flag = 1; static void __irq key_handler(void); //初始化led的端口 void led_port_init(void) { rGPGCON &= 0xffff03ff; rGPGCON |= 0x00005400; } //初始化按键 void key_init(void) { //init GPIO(F) rGPFCON &= 0xfffffffC; rGPFCON |= 0x00000002; //init EINT 0 register 初始化控制EINT0这个中断的外部中断控制器 rEXTINT0 &= ~(0x7); //rEINTPEND 用来记录有没有发生中断,如果要清楚就置1即可 //rEINTMASK 用来指示要不要屏蔽这个中断 //设置ISR pISR_EINT0 = (U32)key_handler; EnableIrq(BIT_EINT0);//设置INTMASk 寄存器 } void dely(int tt) { int i = 0; int j = 0; for(;i < tt; i++) { for(;j < 100000000; j++); } } void led_run(void) { if(flag) { rGPGDAT |= LED_CLOSE1 | LED_CLOSE2 | LED_CLOSE3; dely(100); flag = 0; } else { rGPGDAT &= LED_OPEN1 & LED_OPEN2 & LED_OPEN3; dely(100); flag = 1; } } //按键中断函数 static void __irq key_handler(void) { if(rINTPND == BIT_EINT0)//去判断srcpnd这寄存器 { ClearPending(BIT_EINT0); led_run(); } } int Main() { MMU_Init(); led_port_init(); key_init(); while(1); }
在这里讲中断主要是为了让自己能搭起一个框架,以后关于中断的程序能有一个的模板.
这个程序的主要作用很简单,就是通过按键来产生中断,从而控制led的亮与灭...
第一步:对中断引脚的初始化
我的开发板EINT0这个中断是有GPF0触发的,所以先对这个引脚进行初始化,初始化的工作就是工作GPFCON控制器让引脚为中断的引脚。通过配置不同的值可以让引脚有不同的功能,这里的功能就是产生 中断的功能。
第二步:对于该中断内部的设置
中断内部的设置包含了:按键怎么样的情况下算触发中断,内部的pnd要清除(pnd寄存器是用来记录这个中断是否发生),还有就是内部mask(不能屏蔽该中断)
当然有的中断不用全部都设置,就像EINT0~3好像就不用,因为这几位都是保留的。
第三步:就是设置中断处理函数
这一步应该是比较关键的一步,中断函数是你自己设定的,不过你要把你写的中断处理函数赋值给相对应的地方,这个讲深了就是高级编程与底层之间的联系,关于这个就是arm本身的中断处理过程了。
最好在之前能先调用一下clearpending函数,清除一下srcpnd与intpnd两个寄存器,设置完处理函数以后就用enableirq这个函数去初始化intmsk这个寄存器,让他不会被屏蔽。
这就是关于中断的一个流程,掌握这个的话以后就可以以不变应万变了。
但是关于这个程序还有一点就是关于MMU_Init这个函数是必须的,原因好像是关于中断向量表的转移,我查阅了网上的一些资料,而对于具体还不是清楚,但是宏观上是这样的。
中断向量表本身是在0地址处,但是我们在运行程序的时候是在0x30000000处,所以程序产生的中断其实是不能找到想对应的中断处理程序,而MMU_Init好像有一部分的作用就是讲中断向量表也转移到0x30000000地址处,那样就可以运行了。不过真正的原因还在想的过程中,不过这样是可以解决问题的。下次会对这个问题进行解答的....
相关文章推荐
- 第三个实验 通过中断方式让按键控股按键控制LED
- ARM裸机——FS2410按键控制LED(中断方式)
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- 定时器 T3定(8 位)通过中断方式控制 LED
- 利用中断方式控制树梅派的GPIO
- 用查询方式去控制led灯(ARM 驱动开发)
- .net micro framework的入门例程-点灯神话-3.按键中断控制LED
- 创龙TMS320C6748开发板———Timer配置 + Timer触发中断 + GPIO控制LED闪烁
- Tiny210 中断控制LED灯的亮和灭
- 6.0 外部中断控制LED灯
- 【51单片机实验】INT0中断控制LED
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第二版;接受部分可用,但是容易掉帧,采用的读取dm9000中断寄存器的方式获取数据
- OK6410利用矢量中断通过按键控制LED灯
- Wince外部中断控制LED详解---动态申请
- 4、定时器T1通过查询方式控制LED1周期性闪烁(轮训方式)
- 中断——按键控制LED状态
- 用定时器T0的中断控制8位LED闪烁
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第三版;采用外部引脚中断方式获取中断,优化掉帧现象
- CC2530学习笔记の外部中断——按键控制LED
- Wince外部中断控制LED详解---动态申请