资源描述:
《arm裸机实验之用按键控制led灯》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、ARM裸机实验之用按键控制LED灯嵌入式可以说是一门很复杂的学科,要想学透并不容易,初学者可以从裸机实验开始学起,所以我为大家准备了一些裸机实验,供大家学习参考,高手就不用看了,呵呵额。。。。。想当初我学嵌入式时,觉的有点单片机的基础,学起ARM来应该不难,没想到事实并不是我想的那样,单片机相比ARM来说差的远了,呵呵,也并不是说ARM很不好学,只要找到合适的方法,肯下功夫,一段时间之后,你就会收到满意的效果的,好了,进入主题。。。。。。。主机操作系统:linuxredhat9.0目标板:TQ2440ARM:S3C
2、2440SDRAM:64MNORFLASH:2MNANDFLASH:256M记得当初刚开始学的时候,总是想先弄明白ARM是通过什么方式控制它的IO端口的,现在我还是先从这方面开始讲起吧。。。。。。通过三星公司S3C2440的数据手册可知,它有9组GPIO端口,分别是GPA-GPJ(没有GPI),它的每组端口的输入和输出都是通过配置相关的寄存器来实现的,比如说GPB这一组,GPB共有11个IO端口GPB0-GPB10,相应的控制寄存器为GPBCON、GPBDAT、GPBUP。GPBCON用来设置GPB端口是用来输出还
3、是输入还是用来做第二功能,GPBDAT则是控制IO口的输出电平或从中得到输入电平,GPBUP是决定各个端口是否使用上拉电阻功能。正因为这样给了我们很大方便,使得我们通过修改寄存器就可以控制端口。下面就来看看我们的程序吧。首先说要实现的功能:用开发板上的4个按键来控制4个LED灯的亮灭,哪个键按下,相应的灯就亮起,键松开,灯就灭掉。电路连接情况:4个按键分别接的是GPF0、GPF1、GPF2、GPF44个LED灯分别接的是GPB5、GPB6、GPB7、GPB8先来一个简单的程序,让4个LED灯全亮,看一下整个程序的流
4、程:.text.globalstart_start:ldrr0,=0x56000010movr1,#0x15400strr1,[r0]ldrr0,=0x56000014movr1,#0x0strr1,[r0]main_loop:bmain_loop整个程序只有几行,下面咱们来一行一行分析:ldrr0,=0x56000010查看S3C2440数据手册可知其中0x56000010就是寄存器GPBCON的地址。这句意思是把这个地址值赋给r0.movr1,#0x15400这句是把要传到GPBCON中的值先赋给r1.strr
5、1,[r0]这句的意思就是把r1的值传给以r0中的值为地址所指向的存储空间中,这就完成了设置GPBCON的值。ldrr0,=0x56000014movr1,#0x0strr1,[r0]后面这三行就是给控制GPB端口高低电平的寄存器赋值,使引脚都输出低电平,根据电路图,这时4个LED灯就会全部点亮了。这是源程序,放到linux系统里面,在同一文件夹下还要编写Makefile文件,这样编译起来比较省事。Makefile文件内容如下:led.bin:led.Sarm-linux-gcc-g-c-oled.oled.Sar
6、m-linux-ld-Ttext0x0000000-gled.o-oled_elfarm-linux-objcopy-Obinary-Sled_elfled.binclean:rm-fled.binled_elf*.o这里暂不介绍Makefile文件的写法,以后会有专门章节讲解的。下面是通过按键控制LED灯亮灭的程序,程序分为两部分,由于我们打算用C语言编写,所以要先用汇编语言做一下初始化工作,包括关闭看门狗和设置堆栈。汇编语言程序:.text.globalstart_start:ldrr0,=0x53000000
7、movr1,#0;关闭看门狗strr1,[r0]ldrsp,=1024*4;设置堆栈blmain;跳转到main函数main_loop:blmain_loop保存为:led2.SC语言程序:/*定义各个端口寄存器,GPB用于LED灯的输出控制,GPF用于按键的输入控制*/#defineGPBCON*((volatileunsignedlong*)0x56000010)#defineGPBDAT*((volatileunsignedlong*)0x56000014)#defineGPFCON*((volatileun
8、signedlong*)0x56000050)#defineGPFDAT*((volatileunsignedlong*)0x56000054)/*初始化各个端口寄存器*/voidIO_init(){GPBCON=0x55<<10;//将GPB5-8端口设为输出,用于控制LED灯的两灭GPBDAT=0x0f<<5;//初始化LED灯,使其初始状态为熄灭//G