嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

如果要点亮OK6410 ARM板上的LED也不是一个简单的事情,之前我们学习51、stm32点亮一个LED是一件很简单的事情,今天我们就来体验一下ARM11的特别之处。

点亮LED的第一步:查看板卡LED对应的原理图,去控制和配置哪些引脚,从下面的原理图中可以确定LED1-LED4 对应的芯片引脚为:GPM0-GPM3。

嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

再来看下底板上LED原理图,看下是输出高电平点亮还是低电平点亮,下图很明显我们需要输出低电平才可以点亮LED。

嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

点亮LED的第二步:查看ARM芯片手册,操作哪些寄存器可以完成LED的点亮,这里主要关注的就是芯片的GPIO章节,具体关注的就是怎么操作GPM0-GPM3 四个引脚,先来截一个图,清楚的看到GPM的三个寄存器:配置寄存器、数据寄存器、上拉下拉寄存器,此外还给出的寄存器的地址和初始值,这里重点关注下配置寄存器和数据寄存器的地址,等下我们要通过这个地址来操作。

嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

接下来再看下GPMCON寄存器中的每一位的作用,这里只截取了GPM0-GPM3,从下表中可以看出GPMCON寄存器的每四位对应一个GPM引脚的状态,当设置为0000时为输入模式,当设置为0001时为输出模式……………其余的暂时不管。这里很明显我们需要设置为输出模式。

嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

接着就是GPMDAT寄存器,这里描述的很清楚,当端口被配置为输入模式时,我们可以直接从端口引脚独处相应的状态,当端口被配置为输出模式时,端口引脚的状态就会根据我们是定的值而发生改变,这里我们肯定是要GPM0-GPM3都输出低电平。

嵌入式Linux 笔记基于(OK6410开发板)-----------6.使用汇编伪指令点亮LED

点亮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系统)

上一篇:arm9_uboot_分析源码


下一篇:linux从head.s到start_kernelstart_kernel之---内核解压到重定位分析