文档章节

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

 幸福阶梯
发布于 2017/04/29 23:02
字数 779
阅读 11
收藏 0
点赞 0
评论 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文件。最后将目标文件烧写到开发板中。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 92
码字总数 159283
作品 0
深圳
程序员
NodeMCU学习笔记之初始化工作

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

丛林听雨 ⋅ 2016/11/04 ⋅ 0

Arduino初初教程2——I/O口输出应用

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

小堤 ⋅ 2013/05/28 ⋅ 0

单片机开发——点亮你的LED小灯

LED(light-emitting diode),即发光二极管,俗称 LED 小灯,它的种类很多,参数也不尽相同,我们板子上用的是普通的贴片发光二极管。这种二极管通常的正向导通电压是 1.8V到 2.2V 之间,工作...

乐搏学院 ⋅ 2016/11/08 ⋅ 0

Linux 嵌入式驱动开发:LED控制(1)--- 依赖于linux内核程序

硬件原理图分析。由原理图得知LED电路是共阳极的,并分别由2440的GPB5、GPB6、GPB7、GPB8口控制的 2. 去掉内核已有的LED驱动设置,因为IO口与mini2440开发板的不一致,根本就不能控制板上的L...

宁宁爸 ⋅ 2015/12/10 ⋅ 0

MicroPython:TPYBoard 开发板如何运行第一个脚本?

首先,链接开发板。通过 USB 线连接你的 PC 机(windows,mac,linux皆可)。你不可能搞错因为仅有这么一种连接方式。当连接成功后开发板将上电和进入开机程序,绿色的 LED 灯应该在半秒或更少...

bodasisiter ⋅ 2016/08/09 ⋅ 1

Linux创始人Torvolds荣获2014年IEEE计算机先驱奖

IEEE计算机学会网站刚刚发布了今年IEEE计算机先驱奖的结果。Linux操作系统的创始人LinusTorvalds[1]因为“先驱性地通过开源方式开发Linux内核的工作”而获奖。 IEEE计算机先驱奖(IEEECompu...

番茄炒蛋 ⋅ 2014/05/06 ⋅ 23

嵌入式软件学习方法 嵌入式软件知识

目前嵌入式软件的学习主要主要面向的几个操作系统是,Linux,WINCE、VxWorks等等。其中Linux是开源免费的,而且其源代码是开放的,更加适合我们学习嵌入式软件。下面我们介绍一下嵌入式软件学...

创客学院 ⋅ 04/12 ⋅ 0

Beaglebone Black的启动

Beaglebone Black的启动 第1章 准备开始 Beaglebone Black上最显眼的恐怕就是板子两侧的扩展端口,一侧有46个端口,共92个端口Beaglebone Black的启动。并且,每个数字端口有8种不同的模式供...

大学霸 ⋅ 2015/03/26 ⋅ 1

字符设备驱动基础篇5——驱动如何操控硬件(动静态映射操作LED)

以下内容源于朱有鹏嵌入式课程的学习,,如有侵权,请告知删除。 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html 这里的映射,是指物理地址和虚拟地址的对应关系。 这里的动静态,...

oqqHuTu12345678 ⋅ 2017/07/16 ⋅ 0

MicroPython 如何嵌入汇编

MicroPython 包涵可内联的汇编,允许用户使用汇编语言作为 Python 的子程序,且你可以像正常使用函数般使用它们。 1、返回值 内联汇编函数用特定的函数装饰器标示。我们从最简单的例子下手:...

bodasisiter ⋅ 2016/09/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 4分钟前 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 16分钟前 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 19分钟前 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 33分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 49分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 53分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 56分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部