1. 确定硬件连接

  打开OK6410底板电路图,找到LED,可以发现NLEDx为0时LED点亮。

  找到LED的控制引脚,发现LED控制引脚通过连接器连到了核心板:

  打开核心板电路图,找到对应的连接器中相同位置下的引脚,发现核心板上的命名与底板相同。

  注意:设计者为了方便会将核心板与底板连接处的端口命名为相同的名字,但判断两者的连接位置与端口名其实是没有关系的。从底板上可以看出4个LED所在的连接器引脚编号分别为47,49,46和39,因此在核心板上应该找连接器上这几个编号的引脚,核心板连接器上47,49,46和39号引脚才是与底板LED相连的引脚,只不过设计者为了方便,将核心板上这几个引脚也命名为NLED1~4。

  继续在核心板上寻找,能找到NLEDx控制的引脚为GPM0~3

2. 确定GPM相关寄存器的地址和要写入的值

  打开6410的芯片手册,找到GPM相关寄存器

  可以发现有3个寄存器与GPM相关,三个寄存器的地址分别为0x7F008820、0x7F008824、0x7F008828,其中GPMCON用于配置引脚功能

  我们要控制LED需要把GPM0~3都配置成输出模式,因此GPMCON的位[15:0]应为0x1111。GPMDAT用于控制引脚输出电平

  如果要控制LED全亮,则GPMDAT位[3:0]应为0x0,全灭则为0xF。GPMPUD用于使能引脚的上下拉,一般会将LED控制引脚配置为上拉模式(注意区分信号的输入输出和电流的流入流出,GPMCON配置输出指的是信号从6410输出到外部,当输出信号为0的时候电流会流入6410芯片)。因此GPMPUD的位[7:0]应为0xAA。

3. 编写汇编代码

  编写led.s

 .section .text
.global _start
_start:
LDR R0, =0x7F008820 @GPMCON,也可以认为是GPM寄存器基地值 LDR R1, [R0] @取出GPMCON的值
LDR R2, =0xFFFF
BIC R1, R1, R2
LDR R2, =0x1111
ORR R1, R1, R2
STR R1, [R0] @配置GPM0~3为输出模式 LDR R1, [R0, #] @取出GPMDAT的值
ORR R1, R1, #0xF
STR R1, [R0, #] @GPMDAT低4位置1,所有LED关闭 LDR R1, [R0, #] @取出GPMPUD的值
BIC R1, R1, #0xFF
ORR R1, R1, #0xAA
STR R1, [R0, #] @GPM0~3使能上拉
loop:
LDR R1, [R0, #]
BIC R1, R1, #0xF
ORR R1, R1, #0xE
STR R1, [R0, #] @点亮第一个LED
BL delay LDR R1, [R0, #]
BIC R1, R1, #0xF
ORR R1, R1, #0xD
STR R1, [R0, #] @点亮第二个LED
BL delay LDR R1, [R0, #]
BIC R1, R1, #0xF
ORR R1, R1, #0xB
STR R1, [R0, #] @点亮第三个LED
BL delay LDR R1, [R0, #]
BIC R1, R1, #0xF
ORR R1, R1, #0x7
STR R1, [R0, #] @点亮第四个LED
BL delay
B loop
delay:
LDR R2, =0x1000000
delay_loop:
SUB R2, R2, #
CMP R2, #
BNE delay_loop
MOV PC, LR .end

  输入命令:

  arm-none-linux-gnueabi-gcc -c led.s -o led.o

  arm-none-linux-gnueabi-ld -Ttext 0 led.o -o led.elf

  arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin

  此时生成了可执行文件led.bin

4. 下载文件

  连接minicom,重启后进入U-boot,输入dnw 50008000

  在虚拟机中输入:sudo dnw led.bin

  下载成功后在开发板中输入:go 50008000

  此时可以看到4个LED呈流水灯效果。

  注意:我是利用U-boot下载程序,此时U-boot已经运行起来了,而U-boot已经做了很多初始化工作了,如设置堆栈指针、关闭看门狗、指定外设基地址等,如果想要将程序烧写进Nandflash的0地址,则这些初始化工作必须自己做。

四、使用汇编编写LED裸机驱动的更多相关文章

  1. Tiny6410之LED裸机驱动

    操作步骤: 第一步:查看开发板电路原理图 找到LED 的管脚所对应的寄存器 nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 由原理图可知 ...

  2. Tiny6410之按键裸机驱动

    操作步骤: 第一步:查看开发板电路原理图 找到LED 和按键的管脚所对应的寄存器 LED:(见Tiny6410之LED裸机驱动) nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 ...

  3. Tiny4412之蜂鸣器驱动与led灯驱动

    一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...

  4. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  5. 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发

    在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...

  6. BeagleBone Black教训四局:简单LED对照实验

    BBB教训四局:简单LED对照实验 学习BBB董事会最终目的是做同样的想象单片机控制.但控制是不一样的想法,在所有(Linux在本质上,硬件设备的控制,以虚拟文件有关的设备下的读写),研究了几天头都大 ...

  7. PC逆向之代码还原技术,第四讲汇编中减法的代码还原

    目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...

  8. 四、分离分层的 platform驱动

    学习目标: 学习实现platform机制的分层分离,并基于platform机制,编写led设备和驱动程序: 一.分离分层 输入子系统.usb设备比驱动以及platform类型的驱动等都体现出分离分层机 ...

  9. BeagleBone Black板第四课:简单LED控制实验

    BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...

随机推荐

  1. python记录_day17 类与类之间的关系

    一.依赖关系 a类的对象是b类方法的参数 这种关系是我用着你,但你不属于我,比如公司和临时工的关系,是很弱的一种关系 class Zhiwu: def __init__(self,name,atk): ...

  2. poj2117-tarjin求割点

    http://poj.org/problem?id=2117 求移除一个点以及与它相邻边后,剩下的图中最大的联通子图的数量是多少. 跑一遍tarjin统计下拆除某个点剩下的子图数量即可.注意给出的图不 ...

  3. PY3 多组输入

    在c语言你能使用while(scanf(“%d”,x) !=EOF)判断输入是否碰到文件结束符(EOF). 但是在python你不能使用while((x=input())!=EOF). 这有两种方法可 ...

  4. CRM 价格批导

    日了,好多代码....COPY别人的,懒得改了 *----------------------------------------------------------------------* *** ...

  5. MySQL5.6复制技术(3)-MySQL主从复制线程状态转变

    一.主库线程状态(State)值 以下列表显示了主从复制中主服务器的Binlog Dump线程的State列中可能看到的最常见状态(SHOW PROCESSLIST).如果Binlog Dump线程在 ...

  6. OCP知识点讲解 之 检查点队列与增量检查点

    原创 http://blog.chinaunix.net/uid-26762723-id-3271558.html 检查点的主要目的是以对数据库的日常操作影响最小的方式刷新脏块.脏块不断的产生,如何将 ...

  7. Hadoop--之RPC开发

    Hadoop--之RPC开发   介绍: 百度百科: RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.R ...

  8. Django之用户认证功能

    前言 做web应用对登录做用户身份认证,然后设置session是必不可少的,因为我们就需要把有权限访问本站视图的用户,单独建一张表记录到数据库里: Django作为一个大而全的框架,已经为我们做好了这 ...

  9. sigmoid belief network boltszmann machine

    because of explaining away, the hidden weights in sigmoid belief network is no longer independent

  10. Java Web(二) Servlet详解

    什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...