7822|7

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

mini2440的按键控制LED小程序~~~ [复制链接]

看到坛子里很多人拿到板子后不知道第一步该如何做,

在网上看到一个朋友的博客,感觉还不错,对于购买板子的朋友应该有所帮助,所以呈现出来:

来源:http://adreaman.com/0524arm-mini2440-led-key-non-os.html


mini2440是当前最经济的arm9开发板了,目前就是500多元一块,麻雀虽小,重要的那几个部件也还算齐全,用它来做计算机系统底层的学习工具很合适。而且关于s3c2410/2440系列的教程资料和经验文章在网上很多,大家遇到问题时多google一下也能快速地解决。

先拿一个最初步的LED控制程序上手吧。我的实验开发环境是基于ubuntu9.04系统。

控制硬件的行为,说到底就是设置其对应的寄存器。mini2440开发板有四个LED灯(下图黄色部分,得把LED屏先取下来才能看到,用螺丝刀取下四角的四颗螺丝),还有六个按键(很小,在cmos电池的旁边排成两列,下图红色圈住的部分),我们可以通过配置这些硬件对应的寄存器的值(根据映射在内存空间的地址),来控制它们。例如,四个LED灯有一个配置寄存器(在mini2440板上对应标称为GPBCON)和一个数据寄存器(对应标称为GPBDAT),这两个寄存器都是32bit的整数数值。



四个LED灯分别使用GPBCON寄存上的4组“2bit位”来配置其是否是输出状态,例如,LED1使用第11、12bit,LED2使用第13、14bit,LED3使用第15、16bit,LED4使用第17、18bit。当把这两位(从高位到低位的顺序看,即[bit12、bit11]这样为一组)设置为00则表示输入状态,01(对于LED1就是bit12为0,bit11为1)表示输出状态,10为特殊功能,11保留待用。GPBDAT寄存器的其中4个bit对应着4个LED灯的数值状态。第6个比特对应LED1,第7个比特对应LED2,第8个比特对应LED3,第9个比特对应LED4。在这样的布局下,我们习惯把LED1对应的某些GPBCON位称为GPBCON5,LED2对应的称为GPBCON6,LED3对应的称为GPBCON7 … 以此类推。因为GPBCON&(0×1<<2*5)不为0表示LED1使用的第11、12位处于输入状态,GPBCON&(0×1<<2*6)不为0表示LED2使用的第13、14位处于输入状态…同理,GPBCON &= ~(0×3<<2*5)即设置LED1为输入状态,GPBCON &= ~(0×3<<2*6)即设置LED2为输入状态… 类似的,GPBDAT对应LED1为GPBDAT5(1<<5),对应LED2为GPBDAT6(1<<6)…



六个按键使用的是是GPGCON寄存器上的4组“2bit位”来配置其是否处于输入状态,例如,(参照上图中六个按键布局,是根据按键在CMOS电池上方(北部)的布局画的),右上的按键对应GPGCON的第23、24比特,左下的按键对应GPGCON的第1、2比特。GPGDAT寄存器的其中6个比特,对应着6个按键的数值状态。与LED同样地,我们习惯称这几个按键为GPG11、GPG7、GPG6、GPG5、GPG3、GPG0。GPGDAT11、GPGDAT7等等依次对应六个按键。

我们着重关注的是寄存器的输入状态和输出状态。如前所述,将GPBCON的第14位设置为0,第13位设置为1,就表示LED2被设置为输出状态。此时,如果GPBDAT的第7个bit(GPBDAT6)为0(低电平),那么LED2就被点亮,如果GPBDAT6为1(高电平),那么LED2就处于熄灭状态。将GPGCON11的值设置为00(也就是令右上角按键输入状态),则如果这个按键按下,GPGDAT11的值为0(低电平),如果未被按下,则GPGDAT11的值为1(高电平)。

则这里有一个疑问是,LED的输入状态以及按键的输出状态应该是不会在任何场景出现的,应该是没有任何用处的吧。

有了上面这些基础,我们就可以很容易地写出按键控制LED点亮或熄灭的程序了。我写的测试的程序可在这里下载,很简单,有很清楚的注释说明,就不在这里解释了。这个头文件在今后的程序中也可以复用。

程序写完了,怎么跑在没有操作系统的开发板上?没有操作系统也就是说我们目前没有一个可以自启动并被引导的正常运转在cpu和内存的程序,所以我们要自己做这些 –引导我们的程序运转起来。我们要用的方法是,将程序烧入Nandflash,然后使用从Nandflash启动来直接运行我们的程序。使用Nandflash时,s3c2440会将Nandflash的最开始4k的内容加载到SDRAM内存中自动运行,而我们目前的小程序的可运行bin格式的size远远未到4K的大小,所以,我们就将程序放入Nandflash的开始处然后从Nanflash启动系统就可以了。

在我们平时为linux或windows编译C程序时,编译器会自动为我们的C代码链接接一个初始化程序运行环境的小程序,crt0.S文件就是这个程序的汇编格式,在各种操作系统以及其编译器都会有对应的文件。我们的2440目前没有跑操作系统,所以我们要自己写一个crt0.S文件:

代码准备ok,接下来就可以开始准备编译了,如果你还没有交叉编译环境,可以在这里下载交叉编译器(86M),然后解压到一个目录下,再把该目录添加到你的linux系统的PATH环境变量中即可。你可以在终端命令行输入$PATH来检查是否安装成功。(需要重启系统)
然后,再创建一个Makefile文件:


这一切准备就绪之后,就可以将上述文件(2440_GPX.h , led_key.c , crt0.S , Makefile)放在一个文件夹下,在命令行终端进入该目录后输入make命令,就可以开始编译,一切顺利的话,就可以得到led_key.bin文件,这就是我们要烧入Nandflash的文件。
首先,用随机附带的Jtag小板将开发板的JTag口和PC并口连接起来,然后将mini2440的启动选择开关拨到使用Nandflash启动的一边,然后拨动电源开关给电。使用Jflash-s3c2440程序将刚刚编译的bin文件烧写入NandFlash中(进入Jflash-s3c2440的所在目录,然后输入“sudo ./Jflash-s3c2440 bin文件位置加文件名    /t=5” 回车),根据命令行的提示,先选0(表示烧写2440的nandflash),再选0(表示从0地址开始烧写),等待一会烧写完成之后再次出现提示符,此时输入2(表示完成退出)。举例如下:
[email=adreaman@adreaman-laptop:~/Jflash$] [/email]

到这里,大功告成,拨动开发板电源重启开发板,按动按键,看看是不是像我们的设计一样。Enjoy it!

最新回复

很有帮助 希望楼主继续写下去!  详情 回复 发表于 2009-11-25 16:14

赞赏

1

查看全部赞赏

点赞 关注

回复
举报

2771

帖子

0

TA的资源

裸片初长成(中级)

沙发
 
好!
 
 

回复

2131

帖子

0

TA的资源

至上芯片

板凳
 
不错项一下,楼主努力!
 
个人签名处处留心皆学问!
 
 

回复

57

帖子

0

TA的资源

纯净的硅(高级)

4
 
好,顶一下
 
 
 

回复

131

帖子

0

TA的资源

五彩晶圆(初级)

5
 
楼主应该写一个操作系统的例子给大家看看
 
 
 

回复

131

帖子

0

TA的资源

五彩晶圆(初级)

6
 
我写了一个简单的 或者说是改写了一个吧 哈哈 大家有兴趣去看看啊
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

7
 
不错,LZ写的很详细了!支持!
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

8
 
很有帮助 希望楼主继续写下去!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表