如果要点亮OK6410 ARM板上的LED也不是一个简单的事情,之前我们学习51、stm32点亮一个LED是一件很简单的事情,今天我们就来体验一下ARM11的特别之处。
点亮LED的第一步:查看板卡LED对应的原理图,去控制和配置哪些引脚,从下面的原理图中可以确定LED1-LED4 对应的芯片引脚为:GPM0-GPM3。
再来看下底板上LED原理图,看下是输出高电平点亮还是低电平点亮,下图很明显我们需要输出低电平才可以点亮LED。
点亮LED的第二步:查看ARM芯片手册,操作哪些寄存器可以完成LED的点亮,这里主要关注的就是芯片的GPIO章节,具体关注的就是怎么操作GPM0-GPM3 四个引脚,先来截一个图,清楚的看到GPM的三个寄存器:配置寄存器、数据寄存器、上拉下拉寄存器,此外还给出的寄存器的地址和初始值,这里重点关注下配置寄存器和数据寄存器的地址,等下我们要通过这个地址来操作。
接下来再看下GPMCON寄存器中的每一位的作用,这里只截取了GPM0-GPM3,从下表中可以看出GPMCON寄存器的每四位对应一个GPM引脚的状态,当设置为0000时为输入模式,当设置为0001时为输出模式……………其余的暂时不管。这里很明显我们需要设置为输出模式。
接着就是GPMDAT寄存器,这里描述的很清楚,当端口被配置为输入模式时,我们可以直接从端口引脚独处相应的状态,当端口被配置为输出模式时,端口引脚的状态就会根据我们是定的值而发生改变,这里我们肯定是要GPM0-GPM3都输出低电平。
点亮LED的第三步:开始写代码。到了很让人兴奋的一步了,要写代码了,比较悲催的是,这次我们需要用汇编来写,为了让大家都可以看懂这些代码,我们先学习下面4条汇编指令:
指令 |
意义 |
LDR R0,[R1] |
从R1地址处读出值到R0 |
STR R0,[R1] |
将R0的值写入地址为R1处 |
B halt |
跳转到halt处 |
LDR R0,=0x12345678 |
伪指令 R0 的值为0x12345678 |
MOV R0,R1 |
将R1的值赋给R0,R1也可以是立即数(#1)
|
明白上面一些基础指令,开始写代码,第一个裸机程序尽可能简单些,具体代码如下:
.global _start
/*点亮LED LED1~LED4 :GPM0~GPM3*/
_start:
/*硬件相关设置*/
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/*设置GPM0 GPM1 GPM2 GPM3 为输出模式*/
ldr r1,= 0x7F008820
ldr r0,= 0x1111
str r0,[r1]
/*设置GPM0 输出低电平*/
ldr r1,= 0x7F008824
ldr r0,= 0x10000
str r0,[r1]
halt:
b halt
点亮LED的第四步:编译生成bin文件。烧写到ARM开发板的文件需要是编译后的.bin文件,这一点和单片机不太一样,之前我们都是使用keil软件,一键下载就可以,什么都不用管。现在不一样了, 来感受下这个复杂的过程:
将编写的led.S通过MobaXterm工具复制到Linux系统下进行编译(我这里用的是白问网的ubuntu系统)