- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM裸机实验之用按键控制LED灯
ARM裸机实验之用按键
控制LED灯
嵌入式可以说是一门很复杂的学科,要想学透并不容易,初学者可以从裸机实验开始学起,所以我为大家准备了一些裸机实验,供大家学习参考,高手就不用看了,呵呵额。。。。。
想当初我学嵌入式时,觉的有点单片机的基础,学起ARM来应该不难,没想到事实并不是我想的那样,单片机相比ARM来说差的远了,呵呵,也并不是说ARM很不好学,只要找到合适的方法,肯下功夫,一段时间之后,你就会收到满意的效果的,好了,进入主题。。。。。。。
主机操作系统:linux redhat9.0
目标板 :TQ2440
ARM: S3C2440
SDRAM:64M
NOR FLASH : 2M
NAND FLASH:256M
记得当初刚开始学的时候,总是想先弄明白ARM是通过什么方式控制它的IO端口的,现在我还是先从这方面开始讲起吧。。。。。。
通过三星公司S3C2440的数据手册可知,它有9组GPIO端口,分别是GPA-GPJ(没有GPI),
它的每组端口的输入和输出都是通过配置相关的寄存器来实现的,比如说GPB这一组,GPB共有11个IO端口GPB0-GPB10,相应的控制寄存器为GPBCON、GPBDAT、GPBUP。
GPBCON用来设置GPB端口是用来输出还是输入还是用来做第二功能,GPBDAT则是控制IO口的输出电平或从中得到输入电平,GPBUP是决定各个端口是否使用上拉电阻功能。
正因为这样给了我们很大方便,使得我们通过修改寄存器就可以控制端口。下面就来看看我们的程序吧。
首先说要实现的功能:用开发板上的4个按键来控制4个LED灯的亮灭,哪个键按下,相应的灯就亮起,键松开,灯就灭掉。
电路连接情况:4个按键分别接的是GPF0、GPF1、GPF2、GPF4
4个LED灯分别接的是GPB5、GPB6、GPB7、GPB8
先来一个简单的程序,让4个LED灯全亮,看一下整个程序的流程:
.text
.global start
_start:
ldr r0,=0 mov r1,#0x15400
str r1,[r0]
ldr r0,=0 mov r1,#0x0
str r1,[r0]
main_loop:
b main_loop
整个程序只有几行,下面咱们来一行一行分析:
ldr r0,=0 查看S3C2440数据手册可知其中0是寄存器GPBCON的地址。这句意思是把这个地址值赋给r0.
mov r1,#0x15400 这句是把要传到GPBCON中的值先赋给r1.
str r1,[r0]这句的意思就是把r1的值传给以r0中的值为地址所指向的存储空间中,这就完成了设置GPBCON的值。
ldr r0,=0 mov r1,#0x0
str r1,[r0]
后面这三行
就是给控制GPB端口高低电平的寄存器赋值,使引脚都输出低电平,根据电路图,这时4个LED灯就会全部点亮了。
这是源程序,放到linux系统里面,在同一文件夹下还要编写Makefile文件,这样编译起来比较省事。Makefile文件内容如下:
led.bin:led.S
arm-linux-gcc -g -c -o led.o led.S
arm-linux-ld -Ttext 0x0000000 -g led.o -o led_elf
arm-linux-objcopy -O binary -S led_elf led.bin
clean:
rm -f led.bin led_elf *.o
这里暂不介绍Makefile文件的写法,以后会有专门章节讲解的。
下面是通过按键控制LED灯亮灭的程序,程序分为两部分,由于我们打算用C语言编写,所以要先用汇编语言做一下初始化工作,包括关闭看门狗和设置堆栈。
汇编语言程序:
.text
.global start
_start:
ldr r0,=0 mov r1,#0 ;关闭看门狗
str r1,[r0]
ldr sp,=1024*4 ;设置堆栈
bl main ;跳转到main函数
main_loop:
bl main_loop
保存为 :led2.S
C语言程序:
/*定义各个端口寄存器,GPB用于LED灯的输出控制,GPF用于按键的输入控制*/
#define GPBCON *((volatile unsigned long *)0
#define GPBDAT *((volatile unsigned long *)0
#define GPFCON *((volatile unsigned long *
文档评论(0)