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. [LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

    描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历结果: [ [3] ...

  2. git 提交代码场景

    1.首次提交代码到master git init git add . git commit -m '' git remote add origin +address git push -u origi ...

  3. 漏洞复现——bash远程解析命令执行漏洞

    漏洞描述:Bash脚本在解析某些特殊字符串时出现逻辑错误导致可以执行后面的命令,在一些cgi脚本中,数据是通过环境变量来传递的,这样就会形成该漏洞 漏洞原理:bash通过以函数名作为环境变量名,以“( ...

  4. 6月5 Smarty变量调节器

    变量调节器:<{$a|变量调节器}> 主要修改此页面的信息来了解变量调节器:test0605/main.php和模板文件:main0605.html 1.利用给定的变量调节器 capita ...

  5. 解决audio 在部分移动端浏览器不能自动播放(目前包括ios、微博)

    问题描述:项目需要在页面加载完成后自动播放音乐,但在ios中却无法自动播放,需要用户主动触发 解决办法: $('html').one('touchstart',function(){ document ...

  6. HDU-6336-构造

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...

  7. HashTable Queue Stack SortedList BitArray

    HashTable 由于是非泛型集合,因此存储进去的都是object类型,不管是键还是值. Hashtable不允许排序 key不允许重复 键不允许为null Queue和Queue<T> ...

  8. 快速学习HTML

    1.先写基本的框架标签 2.HTML基本标签 段落标签 <p></p> 空格标签   标题标签 <h1></h1>……<h6></h6 ...

  9. 六、持久层框架(Hibernate)

    一.乐观锁 Hibernate使用乐观锁来处理脏数据问题. 比如有这样一个制造脏数据的场景: 1.通过session1得到id=1的对象product1 2.在product1原来的价格基础上增加10 ...

  10. PHP如何自定义PHP内置函数

    其实对于PHP程序员,有个纯PHP的解决方案.在php.ini里有个配置项 auto_prepend_file,可以设置一个PHP文件作为每次执行前自动加载的文件. 在这个文件里写函数,你就可以当成定 ...