您的位置:首页 > 其它

用查询方式去控制led灯(ARM 驱动开发)

2011-08-10 23:07 555 查看
查询方式也是一个用于外设的方式,不过由于这种方式对cpu的综合利用率极为低,不过还是可以通过它去学习一些知识....
最近在学习关于ARM9 的裸机程序开发,发现驱动程序的开发也没有想象中的那么难。当然这是因为我现在写的还是简单的东西,但是本质的东西还是没有变化的。关于驱动程序的开发,我觉得重点在于你对他的各个寄存器的了解和对原理图的认识,在这个基础上你结合C语言我觉得学习起来就相对容易些。不过本身这个东西关于到硬件,比起以前学的pc程序开发要考虑到更加多的东西,和细微的东西。虽然是裸机开发,但是还是基于了三星公司本身的源代码做的开发,有点像三星公司给你了一个库,这个库帮助完成了很多的东西,比如硬件的初始化,还有一些常用函数的定义等,所以学习arm嵌入式开始的路还很长很长...

下面是我做的一个小程序,主要是用程序查询方式去监视arm底板上的按键,如果按键按下了就让led灯作出反应(如果本身是亮的,那么就灭了,如果本来是灭的那就亮),这样的操作。

#include "2410lib.h"
#include "2410slib.h"
#include "2410addr.h"
#include "def.h"
#include "option.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;//flag是1就表示是亮的,如果是0就表示是灭的
//led port的初始化,这个根据不同的arm有一定的区别,比如我的是GPIO 中的G 端口去控制这个led灯,你的有可能是别的其他的..
void led_init(void)
{
//这个是对GPGCON寄存器的赋值,关于具体的赋值可以看你们的手册,上面会有很清楚的讲到,我这里是00表示input,01表示output,而我要的就是output
rGPGCON &= ~((3<<10) | (3<<12) | (3<<14));
rGPGCON |= (1<<10) | (1<<12) | (1<<14);
}

void key_init()
{
//对key的设置,比如我这里是k1这个按键,那么我就设置了GPF这个port
rGPFCON &= 0xfffffffc;
}

void dely(int tt)
{
int i = 0;
while(tt--)
{
for(;i < 10000000;i++);
}
}

int wait_key()
{
if(!(rGPFDAT & 0x1))//我的按键是GPF这个端口的0号位,低电平有效(也就是0有效),这里用来判断按键是否按下
dely(100);
if(!(rGPFDAT & 0x1))//这主要是用来防止不正常按键按下的时候
{
while(!(rGPFDAT & 0x1));//这用来判断按键被放开的时候,也就是只有当被按下的按键放掉的时候才算有按过的行为..
return 1;
}
else
{
return 0;
}
}

void led_run(void)
{
if(flag)
{
rGPGDAT |=  LED_CLOSE1 | LED_CLOSE2 | LED_CLOSE3;
flag = 0;
}
else
{
rGPGDAT &= LED_OPEN1 & LED_OPEN2 & LED_OPEN3;
flag = 1;
}

}
int Main()
{
led_init();
key_init();
while(1) //这个就是查询的过程
{
if(wait_key())//一直查询这个按键有没有按下,如果按下就调用led_run这个函数,不然就一直查询
{
led_run();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: