用查询方式去控制led灯(ARM 驱动开发)
2011-08-10 23:07
555 查看
查询方式也是一个用于外设的方式,不过由于这种方式对cpu的综合利用率极为低,不过还是可以通过它去学习一些知识....
最近在学习关于ARM9 的裸机程序开发,发现驱动程序的开发也没有想象中的那么难。当然这是因为我现在写的还是简单的东西,但是本质的东西还是没有变化的。关于驱动程序的开发,我觉得重点在于你对他的各个寄存器的了解和对原理图的认识,在这个基础上你结合C语言我觉得学习起来就相对容易些。不过本身这个东西关于到硬件,比起以前学的pc程序开发要考虑到更加多的东西,和细微的东西。虽然是裸机开发,但是还是基于了三星公司本身的源代码做的开发,有点像三星公司给你了一个库,这个库帮助完成了很多的东西,比如硬件的初始化,还有一些常用函数的定义等,所以学习arm嵌入式开始的路还很长很长...
下面是我做的一个小程序,主要是用程序查询方式去监视arm底板上的按键,如果按键按下了就让led灯作出反应(如果本身是亮的,那么就灭了,如果本来是灭的那就亮),这样的操作。
最近在学习关于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(); } } }
相关文章推荐
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- ARM裸机——FS2410按键控制LED灯(查询方式)
- ARM裸机程序开发——按键控制LED灯
- Linux驱动开发之五---按键驱动(查询方式)(Tiny6410)
- ARM-Linux--ADC 驱动(查询方式)
- 控制LED灯的流驱动开发文档
- ARM裸机开发(一)LED控制
- 定时器 T1 通过查询方式控制 LED1 周期性闪烁
- arm 驱动基础:通过次设备号精确控制led亮灭
- ARM开发之用linux通用GPIO接口宏函数操作IO口-----LED字符驱动为例
- 4、定时器T1通过查询方式控制LED1周期性闪烁(轮训方式)
- ARM裸机程序开发10(LED控制程序)
- arm 驱动基础:查询方式的按键驱动程序
- Linux驱动开发--通过按键控制led灯
- arm 驱动基础:查询方式的按键驱动程序
- 用定时器T0查询方式P0口8位控制LED闪烁
- ARM裸机——FS2410按键控制LED(中断方式)
- ARM开发之杂项设备的编写----以LED驱动为例
- 嵌入式Linux驱动开发(二)——字符设备驱动之控制LED
- ARM开发之linux字符型驱动的编写----LED驱动为例