《嵌入式linux应用程序开发完全手册》LED裸板硬件编程(汇编)学习笔记
先来一个最简单的试验一下,我们的思路和想法对不对!对于刚刚从51单片机过来的开发者而言,对arm的操作有一些不同,由于单片机的极其简单决定了它对管脚的操作也极其容易,管脚复用也不多。但对于ARM则大大不同,对于2440光IO口都有130个,而其中很大一部分IO都有二次,三次复用,所以对它的操作变得间接了---对寄存器的配置。对所有的IO,甚至所有的操作都归结于对相应寄存器的配置了。所以我们先来看一下本节我们涉及到的IO寄存器。
这里我们要实现点亮led1,就是GPB5上连的那个led,如果你不确定哪个灯是led1,你不妨结合原理图和实板去找一下。
> 从mini2440的原理图上找出4个led的连接关系:
led1---GPB5
led2---GPB6
led3---GPB7
led4---GPB8
>从2440的datasheet上找出GPB的寄存器地址和相应位功能与配置方法。
GPBCON---0x56000010
GPBDAT---0x56000014
GPBUP---0x56000018
>根据2440 GPBCON的位描述,GPB5对应位[11:10],如果[11:10]==[00]表示设置GPB5端口为input功能,如果为[01]则为output功能,[10]则为nXBACK 功能,[11]保留。显然,我们要让GPB5对应的管脚有输出功能。
>上面将GPB5设置成了输出,而输出什么呢?我们就要看一下GPBDAT这个寄存器了,它对应于[10:0],这11位对应于相应的IO口,而我们用的是第GPB5,当然就是把GPBDAT的第5位设置成0就可以将led1这边拉低了哦,根据LED的驱动电路,可以看出是低电平触发,所以它自然也就亮起来了。
下面就看一下实现的程序吧:(如果你看不懂下面的几句简单程序,那就sorry了,你得回去看一下arm指令与汇编了,其实也可以一起看了,边看arm体系结构与编程边跟我一起来学习),如果板子在运行过程中led本身就亮起来了,可以在下面的代码中加入熄灭所有led然后再点亮相应的led 就可以了。
这上面的代码很简单,就不多讲了,再多讲恐怕谁都要砸砖头了,看一下Makefile吧,因为对于初学者,往往有点惧怕makefile,总感觉它太复杂,实际上我们平时的使用并不会使用它多么复杂的功能,都是一些简单的功能,复杂的功能我们一般都使用auto自动自成,所以呀攻破它对于你后面的开发学习将有莫大的好处,不需要特别的复杂的学习,只需要随着使用的过程中学习就行了。
这个makefile也很简单,我仅说明其中一点:-Ttext 0x00000000表示,指定了程序运行的地址为0x00000000,具体arm-linux-ld的使用详细说明,请参考其文档,我这里就不多说了。
然后将生成的led.bin或者led_elf文件用命令load_image 下载到ram中,然后使用resume命令从0x0处运行就可以了。