文档章节

Linux驱动开发——使用汇编语言点亮一个LED

 幸福阶梯
发布于 2017/04/29 23:02
字数 779
阅读 12
收藏 0

电路原理图如下:

其中,LED和2440的GPF4端口相连;GPF4端口输出低电平LED点亮。

S3C2440A芯片的GPF端口信息如下:

汇编语言如下:

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************       
.text
.global _start
_start:     
            LDR     R0,=0x56000050          @ R0设为GPFCON寄存器。此寄存器
                                                             @ 用于选择端口B各引脚的功能:
                                                             @ 是输出、是输入、还是其他
            MOV     R1,#0x00000100        
            STR     R1,[R0]                          @ 设置GPF4为输出口, 位[8:7]=0b01
            
            LDR     R0,=0x56000054          @ R0设为GPBDAT寄存器。此寄存器
                                                             @ 用于读/写端口B各引脚的数据
            MOV     R1,#0x00000000         @ 此值改为0x00000010,
                                                             @ 可让LED1熄灭
            STR     R1,[R0]                           @ GPF4输出0,LED1点亮
MAIN_LOOP:
            B       MAIN_LOOP

代码中主要指令解释:

@后面的东西都是注释;

.text:是伪指令,表示其下面的语句都属于代码段;

.global:将本文件中的某个程序标号定义为全局的,比如上面的代码表示_start是个全局函数;

LDR:大范围的地址读取伪指令;

LDR  R0,  =0x56000050 //表示将GPF端口配置寄存器地址0x56000050(常数)赋给寄存器R0;

MOV:可以把一个寄存器的值赋给另一个寄存器,或把一个常数赋给寄存器;

MOV  R1,  #0x00000100   //#将常数0x00000100赋给寄存器R1;

STR:将寄存器中的值存储到内存中;

STR   R1,   [R0]  //将R1寄存器中的数据保存到地址为R0的内存单元中;实际上就是将0x00000100数据保存到GPF引脚配置地址0x56000050当中,从而完成对GPF引脚的配置,就是将GPF4引脚配置为输出引脚。

LDR  R0,  =0x56000054 //表示将GPF端口数据寄存器地址0x56000050(常数)赋给寄存器R0;

MOV  R1,  #0x00000000 //将常数0x00000000赋给寄存器R1;

STR  R1,   [R0]  //将将R1寄存器中的数据保存到地址为R0的内存单元中;其实就是将0x00000000数据保存到内存地址为0x56000054当中,就是使GPF4输出低电平。

B:跳转指令,可以在程序中实现跳转功能;在程序中首先定义一个代码块MAIN_LOOP,而后跳转到MAIN_LOOP,死循环,程序一直在这里执行。

Makefile文件如下:

led_on.bin : led_on.S

        arm-linux-gcc -g -c -o led_on.o led_on.S

        arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf

        arm-linux-objcopy -O binary -S led_on_elf led_on.bin

clean:

        rm -f   led_on.bin led_on_elf *.o

主要指令介绍:

arm-linux-gcc:交叉编译工具, 将汇编源码文件led_on.S经过预处理、编译、汇编生成OBJ目标文件led_on.o;

arm-linux-ld:用于将多个目标文件、库文件连接成可执行文件。

arm-linux-objcopy:用来复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。

编辑完源码之后,可以将源码和Makefile文件一起拷贝到Ubuntu里面,然后执行make命令,生成led_on.bin文件。最后将目标文件烧写到开发板中。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 92
码字总数 159283
作品 0
深圳
程序员
Mini2440上的第一个程序——点亮Led

手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习。 我使用的是友善之臂的Mini2440开发板、韦东山的《嵌入式Linux应用开发完成手册》及其视频教程。所以,本篇...

icuic
07/15
0
0
NodeMCU学习笔记之初始化工作

NodeMCU学习笔记之初始化工作 丛林听雨2016-11-04132 阅读 工作初始化 NodeMCU是一个开源的可以运行脚本的微控制器,直接支持WiFi链接和GPIO,而且成本低廉。是物联网开发的不二之选。板子是...

丛林听雨
2016/11/04
0
0
我做了一个霸气侧漏的极客专属版万圣节南瓜机器人!

万圣节就要到了,极客、程序员们如何玩转万圣节?先来一个错误示范: emmmm....确实,指望装扮搞怪在“妖魔鬼怪”横行的万圣节上取胜,显然不是我们这种技术人员的强项,所以我们公司的程序员...

Vincross
2017/10/31
0
1
Arduino初初教程2——I/O口输出应用

Arduino除了能驱动LED之外,还可以通过I/O输出驱动蜂鸣器和数码管。 LED(发光二极管),能将电能转化为光能,其也具有单向导电性,反向击穿电压约5V。它的正向伏安特性曲线很陡,使用时必须...

小堤
2013/05/28
0
0
嵌入式linux系统的开发——GPIO及LED/KEY的功能实现

GPIO功能注册和控制 MT7688支持引脚功能的复用,通过配置GPIO1MODE和GPIO2MODE寄存器可指定引脚的功能,通常在dts文件中对引脚功能进行注册。 MT7688引脚的GPIO注册位于/target/linux/ramip...

元宵大师
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 事件

ContextRefreshedEvent Event raised when an {@code ApplicationContext} gets initialized or refreshed. ContextClosedEvent Event raised when an {@code ApplicationContext} gets clos......

Canaan_
37分钟前
1
0
leetcode两数之和

leetcode中求两数之和解决方法 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 给定 nums = [2, 7, 11, ...

lar555
54分钟前
1
0
js实现限制网页内容复制

转载 在我们做的网页发到网上后,如果访客看到比较喜欢的内容,只要复制就可以变为自己的,自己辛辛苦苦弄半天还不及人家的一下复制,有时为了只让访客看到,而不能让它们复制内容,就用Jav...

lc_comeon
58分钟前
1
0
jenkins将spring boot项目发布到阿里云镜像中

1、spring boot项目 1.1 pom.xml配置 <artifactId>xxx-docker</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.......

xixingzhe
今天
0
0
qsv格式可以在电视上播放吗

  大家都知道qsv格式是爱奇艺的独家缓存格式,是加密的,一般的播放器是无法播放的,只能在爱奇艺播放器上播放,如果想要在电视上播放,就必须要安装爱奇艺播放器,比较麻烦。其实还有一种...

萤火的萤火
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部