Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
本转载自:http://www.techbulo.com/1313.html
Tiny4412汇编流水灯代码,Tiny4412裸机LED操作
从今天开始就正式进入到tiny4412的开发学习中了,今天主要看了一下Tiny4412的启动流程及存储器映射及Exynos4412数据手册,用汇编写了一个跑马灯程序(后续会有C语言版本的出来),先说一下我的开发环境吧:
开发板:Tiny4412 增强版 (底板是Tiny4412ADK 1312)
开发工具:UltraEdit
宿主机:VmWare Ubuntu12.04(64bit)
编译工具:arm-linux-gcc4.5.1
为了便于分类管理,特意开了一个Tiny4412学习专区,希望对大家有所帮助,下面进入正题,说一下跑马灯程序。
一、控制原理说明
tiny4412核心板
先看一下原理图:
tiny4412-led原理图
tiny4412-led原理图
如上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。我们要做的工作就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低即可。
二、程序说明
1.led.S
由原理图可知,程序只进行了两步操作;
第一步:设置GPM4_0~GPM4_3相对应的控制寄存器GPM4CON,使GPM4_0~ GPM4_3四个引脚为输出功能。
Tiny4412-GPM4CON
第二步:设置其对应的数据寄存器GPM4DAT对应的4个bit位为0,使GPM4_0~ GPM4_3为低电平,4个LED灯全亮,等待一段时间将第0位设置为0,其余位设置为1,这样只有第一个灯亮;等待一段时间将第1位设置为0,其余位设置为1,这样只有第二个灯亮;等待一段时间将第2位设置为0,其余位设置为1,这样只有第三个灯亮;等待一段时间将第3位设置为0,其余位设置为1,这样只有第四个灯亮;等待一段时间使GPM4_0~ GPM4_3全为高电平,4个LED灯全灭。这样就实现了跑马灯效果。
程序代码中,也有相关解释这里不做过多说明。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
.text.globl _start_start:/** set GPM4 as output*/ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0ldr r1, [r0] // 先读出原值bic r1, r1, #0xff00 // 清除bit[15:8]bic r1, r1, #0xff // 清除bit[7:0]orr r1, r1, #0x1100 // 设置bit[15:8]为0b00010001orr r1, r1, #0x11 // 设置bit[7:0]为0b00010001str r1, [r0] // 写入GPM4CON/** set GPM4DAT as Low For leds*/ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E0ldr r1, [r0] // 读出原值leds_loop:bic r1, r1, #0xf // 清除bit[0-3]为0 全亮str r1, [r0] // 写入GPM4DATldr r2,=0xffffffbl delayorr r1, r1, #0xe // 设置bit[0]为0 LED1亮str r1, [r0] // 写入GPM4DATldr r2,=0xffffffbl delaybic r1, r1, #0x3 // 设置bit[1]为0 LED2亮orr r1, r1, #1str r1, [r0] // 写入GPM4DATldr r2,=0xffffffbl delaybic r1, r1, #0x6 // 设置bit[2]为0 LED3亮orr r1, r1, #2str r1, [r0] // 写入GPM4DATldr r2,=0xffffffbl delaybic r1, r1, #0xc // 设置bit[3]为0 LED4亮orr r1, r1, #4str r1, [r0] // 写入GPM4DATldr r2,=0xffffffbl delayorr r1, r1, #0xfstr r1, [r0] // 写入GPM4DAT 全灭ldr r2,=0xffffffbl delayb leds_loophalt_loop:b halt_loopdelay://跑马灯延时程序sub r2,r2,#1 //sub 减法cmp r2,#0x0 //将r0 与0比较bne delay //b是跳 ne 是不相等 ,不相等就跳到delaymov pc,lr //lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回 |
2. MakeFile说明
|
1
2
3
4
5
6
7
|
led.bin : led.Sarm-linux-gcc -c -o led.o led.Sarm-linux-ld -Tled.lds -N led.o -o led.elfarm-linux-objcopy -O binary -S led.elf led.binarm-linux-objdump -D -m arm led.elf > led.disclean:rm -f *.dis *.bin *.elf *.o |
当我们在Makefile所在目录下执行make命令时,系统会进行如下操作:
第一步 执行arm-linux-gcc -c -o led.o led.S命令将当前目录下存在的汇编文件led.S编译成led.o文件;
第二步 执行arm-linux-ld -Tled.lds -N led.o -o led.elf将.o文件链接成elf文件,-Tled.lds 其中led.lds位链接脚本,告诉连接器如何对程序进行链接,以及链接地址等等(下面会有讲解);
第三步 执行arm-linux-objcopy -O binary -S led.elf led.bin将elf文件抽取为可在开发板上运行的bin文件;
第四步 执行arm-linux-objdump -D -m arm led.elf > led.dis将elf文件反汇编,便于我们对程序的分析,查找错误等等;
3. 链接脚本led.lds说明
|
1
2
3
4
5
6
7
|
SECTIONS {. = 0x02023400;.text : { *(.text) }.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : { *(.data*) }.bss ALIGN(4) : { *(.bss) *(COMMON) }} |
本文不对链接脚本的具体语法进行介绍,读者可以自已自行google了解
第2行表示程序的连接地址从0x02023400开始,这表示我们的程序运行之前应该位于内存地址0x02023400字节处,
BL1会把 BL2复制到0x02023400地址处,再启动它。
第 3~6行,表示从 0x02023400 开始,依次排放程序的代码段、 只读数据段、数据段、BSS段。
三、程序编译及烧写
1.编译
通过FTP或者其他工具将led.s、Makefile、led.lds 三个文件上传到服务器上去,输入make命令进行编译将得到led.bin文件。
2.烧写
将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:
|
1
|
sudo ./sd_fusing.sh /dev/sdb ../01.led/led.bin |
Tiny4412-Prog
如图所示,SD卡烧写成功,将SD卡插到Tiny4412开发板上,并设置为SD卡启动,这时你就会看到LED灯在闪烁。
说明:sd_fusing.sh是一个shell脚本,这个脚本文件,一键烧写程序到 SD 卡中。我们分析该脚本程序,发现其核心命令就3条
|
1
2
3
4
5
|
dd iflag=dsync oflag=dsync if=/work/4412/tools/E4412_N.bl1.bin of=$1 seek=$signed_bl1_positiondd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_positionsync |
第 1行的命令用于将E4412_N.bl1.bin烧写到 SD卡的第 1个扇区 (扇区从 0编号 );
第 2行的命令用于将bl2.bin烧写到SD卡的第17个扇区;
第 3行的命令用于将内存缓冲区数据写入磁盘.
E4412_N.bl1.bin(BL1) 是由三星原厂提供, 没有源码;
bl2.bin 是通过 mkbl2 工具处理源文件得到,具体实现如下:
|
1
|
./mkbl2 leds_on.bin bl2.bin 14336 |
mkbl2 是用来生成 bl2.bin 的工具,通过编译 V310-EVT1-mkbl2.c 文件得到,具体如下:
|
1
|
gcc -o mkbl2 V310-EVT1-mkbl2.c |
通过分析 V310-EVT1-mkbl2.c源码,我们可以知道它主要做了这些工作:
1). 从源文件中读取14K 的数据到 Buf 当中;
2). 处理 Buf 中前14332 字节的数据,得到 4字节的checksum ;
3). 组装 Buf 中前 14332 字节的数据和 4字节的 checksum,得到一个新的 14K 的 Buf 数据;
4). 将 3) 中构建的Buf 数据写到bl2.bin文件中
四、上电实验
如下图所示,可以看到4个led轮流着点亮及熄灭
tiny4412流水灯效果
Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】的更多相关文章
- Tiny4412汇编流水灯代码,Tiny4412裸机LED操作[1]
从今天开始就正式进入到tiny4412的开发学习中了,今天主要看了一下Tiny4412的启动流程及存储器映射及Exynos4412数据手册,用汇编写了一个跑马灯程序(后续会有C语言版本的出来),先说一 ...
- Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]
在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE ...
- Linux下实现流水灯等功能的LED驱动代码及测试实例
驱动代码: #include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> ...
- 花样流水灯的verilog实现
LED(Light emitting diode)发光二极管将电能转化为可见光,正向电压导通,反向电压截止.对于该板子,二极管用低电压导通,其实验原理图为: 所谓流水灯,即让LED像水一样的点亮,从左 ...
- iMX287A多种方法实现流水灯效果
目录 1.流水灯在电子电路中的地位 2.硬件电路分析 3.先点个灯吧 4.shell脚本实现流水灯 5.ANSI C文件操作实现流水灯 6.Linux 系统调用实现流水灯 @ 1.流水灯在电子电路中的 ...
- 一步步玩pcDuino3--mmc下的裸机流水灯
第一部分是玩pcduino3下的裸机.这个过程能够让我们更好的理解嵌入式系统,熟悉我们使用的这个平台. 首先介绍下开发环境: 虚拟机:VMware® Workstati ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- 【ARM】2410裸机系列-流水灯
开发环境 1.硬件平台:FS2410(s3c2410) 2.主机:Ubuntu 12.04 LTS LED原理图 LED的GPIO的配置 配置GPFCON寄存器,设置GPF4-7为输出 配置GPF ...
随机推荐
- C++ STL容器之 stack
STL 中的 stack 是一种容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, size, back, push_back, pop_back),都能作为st ...
- loaction.reload(false)和location.reload(true) js发起请求
loaction.reload(false)和location.reload(true)差别: loaction.reload(false) 先判断页面有没修改,有的话就从服务器下载页面,没有就直接从 ...
- (转载)Catalan数——卡特兰数
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- 【04】 CSS开发注意事项
[04] CSS注意事项 1. 页面编码规范 1.1. 统一使用 UTF-8 编码,用@charset "utf-8"指定页面编码. 1.2. 全局字体设置: windows 7系 ...
- 【Codeforces 329B】Biridian Forest
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 找到出口到每个点的最短距离. 设你到出口的最短距离为temp 那么如果某个人到终点的距离<=temp,则他们肯定能遇到你 因为他们可以在 ...
- 餐巾(cogs 461)
[问题描述] 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分 ...
- cdq分治入门--BZOJ3262: 陌上花开
n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人. 裸的三维偏序.按照常规思路,一维排 ...
- PatentTips - Register file supporting transactional processing
BACKGROUND OF THE INVENTION With the rise of multi-core, multi-threaded data processing systems, a k ...
- QT-Embedded-4.5.3在海思35xx上移植
QT4.5.3在海思3520A上移植步骤-修订版 2015年3月29日星期日, 16:59:03 1.首先要保证已经安装了海思的交叉编译器: #arm-hi + Tab key to show wh ...
- POJ 3276 Face The Right Way【枚举】
题意: N头牛站成一条线,分别朝向前后两个方向,机器可以使连续K头牛同时改变方向,要求所有牛最终朝向前方,问机器操作次数的最小值及此时的最小K值. 分析: 第一眼看感觉是二分搜索K,再仔细读题, pl ...