您的位置:首页 > 其它

用中断的方式都控制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地址处,那样就可以运行了。不过真正的原因还在想的过程中,不过这样是可以解决问题的。下次会对这个问题进行解答的....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: