2019独角兽企业重金招聘Python工程师标准>>>

本文转自:http://www.techbulo.com/1313.html

从今天开始就正式进入到tiny4412的开发学习中了,今天主要看了一下Tiny4412的启动流程及存储器映射及Exynos4412数据手册,用汇编写了一个跑马灯程序(后续会有C语言版本的出来),先说一下我的开发环境吧:

  • 开发板:Tiny4412 增强版 (底板是Tiny4412ADK 1312)
  • 开发工具:UltraEdit
  • 宿主机:VmWare Ubuntu12.04(64bit)
  • 编译工具:arm-linux-gcc4.5.1

一、控制原理说明

先看一下原理图:

如上图可知,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四个引脚为输出功能。

第二步:设置其对应的数据寄存器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灯全灭。这样就实现了跑马灯效果。

程序代码中,也有相关解释这里不做过多说明。

.text
.globl _start
_start:/* Setup GPM4_0、GPM4_1、GPM4_2、GPM4_3为输出 */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]            // 读出原值led_loop:bic r1, r1, #0xf        // 清除bit[0-3]为0 全亮str r1, [r0]          // 写入GPM4DATldr r2, =0xffffffbl led_delayorr r1, r1, #0xe      /* GM4_0 亮 */str r1, [r0]ldr r2, =0xffffffbl led_delaybic r1, r1, #0x2     /* GM4_1 亮 */orr r1, r1, #0x1str r1, [r0]ldr r2, =0xffffffbl led_delaybic r1, r1, #0x4     /* GM4_2 亮 */orr r1, r1, #0x2str r1, [r0]ldr r2, =0xffffffbl led_delaybic r1, r1, #0x8     /* GM4_3 亮 */orr r1, r1, #0x4str r1, [r0]ldr r2, =0xffffffbl led_delaybl led_loopled_delay:                /* 循环 */sub r2, r2, #0x1    //sub 减法cmp r2, #0x0        //将r0 与0比较bne led_delay     //b是跳ne是不相等,不相等就跳到led_delaymov pc, lr           //lr里存的是调用函数时的下一条指令地址,将lr的值赋给pc程序计数器就可以完成返回

2. MakeFile说明

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.dis
clean: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说明

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识别出来,然后执行如下命令:
  • ./sd_fusing.sh /dev/sdb ../../hardware_code/led/led.bin

如图所示,SD卡烧写成功,将SD卡插到Tiny4412开发板上,并设置为SD卡启动,这时你就会看到LED灯在闪烁。

说明:sd_fusing.sh是一个shell脚本,这个脚本文件,一键烧写程序到SD卡中。我们会在下节分析这个脚本。

四、上电实验

如下图所示,可以看到4个led轮流着点亮及熄灭

五、链接脚本分析

以 led目录下的led.lds为例,它的内容如下:

SECTIONS {. = 0x02023400;.text : { *(.text) }.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : { *(.data*) }.bss ALIGN(4) : { *(.bss) *(COMMON) }
}

第2行表示程序的连接地址从0x02023400开始,这表示我们的程序运行之前,应该位于内存地址
0x02023400字节处。 BL1会把BL2复制到0x02023400地址处,再启动它。
第3~6行,表示从0x02023400开始,依次排放程序的代码段、只读数据段、数据段、BSS段。
我们对这些“段”还没有概念,这将在后续章节介绍。

转载于:https://my.oschina.net/cht2000/blog/1622224

Tiny4412使用汇编点亮LED,实现流水灯效果相关推荐

  1. 一、点亮LED和流水灯设计

    点亮LED和流水灯设计 参考书籍:51单片机C语言教程 视频链接:参考视频 单片机型号:巫妖王51单片机V2版 单片机概述 什么是单片机? Micro Controller Unit简称MCU,即单片 ...

  2. 点灯合集(点亮LED、流水灯、8x8点阵、点阵拓展)——附程序

    点灯合集 一.点亮LED 简介: LED闪烁: Proteus仿真图: 视频展示: 代码: 二.流水灯 Proteus仿真图: 代码: 代码一: 代码二(优化): 三.行列扫描原理 四.8x8点阵 简 ...

  3. 基于51单片机的汇编/C程序:拨码开关控制八位LED实现流水灯

    基于51单片机的汇编程序:拨码开关控制八位LED实现流水灯 2022-03-08,51单片机学习笔记 功能 打开K1循环左移,打开K2循环右移,打开K3两侧到中心来回点亮,打开K4单双数位置交替点亮. ...

  4. 蓝桥杯小白系列之汇编点亮led灯

    蓝桥杯小白系列之汇编点亮led灯 1.源代码 2.逐条分析 (1)ORG 0000H (2)START: 伪指令,编译器可识别,单片机不可识别,可以随便起. (3)蜂鸣器设置 蓝桥板插电以后蜂鸣器常会 ...

  5. 嵌入式实验-汇编点亮LED 灯

    嵌入式实验-汇编点亮LED 灯 一.实验目的 通过本次实验,使学生能够操作 S5PV210实验平台,搭建并使用交叉编译环境,具备初步的嵌入式裸机平台应用开发能力. 二.实验原理 由原理图可知,点亮 2 ...

  6. 基于51单片机的汇编程序:拨码开关控制八位LED实现流水灯

    基于51单片机的汇编程序:拨码开关控制八位LED实现流水灯 2022-03-08,51单片机学习笔记 功能 打开K1循环左移,打开K2循环右移,打开K3两侧到中心来回点亮,打开K4单双数位置交替点亮. ...

  7. 51单片机通过CD4051实现流水灯效果+Proteus仿真

    51单片机通过CD4051实现流水灯效果+Proteus仿真 Proteus仿真效果 CD4051 CD4051是一款八选一模拟开关电路,内置3个地址选择端(A0-A2),低有效的使能输入端( E), ...

  8. 一步步点亮LED3_从零开始手写汇编点亮LED

    1.GPxCON.GPxDAT寄存器分析 GPJ0端口一共有8个引脚,分别记作:GPJ0_0 ~ GPJ0_7,相关重要寄存器就是GPJ0CON和GPJ0DAT GPJ0CON寄存器中设置8个引脚的工 ...

  9. 8个流水灯c语言程序按顺序亮,求由AT89S52单片机,8个LED,流水灯程序,要求八灯一盏接一盏闪烁,且循环不灭,,要求用c语...

    厦小伙子 t--) for(bt=0; } temp=0x80;/i8 个流水灯反向逐个闪动 { P2=~temp;<8;/ 声明延时函数 void main(void) { uint i.05 ...

最新文章

  1. go 语言 链表 的增删改查
  2. 现代简明魔法 php内核,你所必须知道的PHP 9种非常有用的函数和特征!
  3. Java Web专题(一)
  4. BufferedWriter_字符缓冲输出流
  5. 开关灯(jzoj 3926)
  6. Elementary Methods in Number Theory Exercise 1.2.31
  7. 实战!手把手教你如何编写一个Linux驱动并写一个支持物联网的LED演示demo
  8. vue路由(router)设置:父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失
  9. 音频播放IOS:AVAudioPlayer音频播放器
  10. mysql大于等于、小于等于的写法
  11. SDUT—Python程序设计实验六(字典与集合)
  12. MacOS Catalina 10.15.1 (19B88) — 苹果操作系统
  13. JAVA进阶—注解,对象克隆,设计模式
  14. 恶搞好朋友 java
  15. R语言模拟疫情传播-gganimate包
  16. 深度学习语义分割论文笔记(待完善)
  17. dns服务器未响应wifi用不上,为你解答dns服务器未响应导致无法上网怎么办
  18. 「 LaTex 」写论文,修改公式内行距的方法
  19. Qt 信号与槽基础操作
  20. 深圳二手房房源市场研究(上)

热门文章

  1. 详解PHP中的双引号“ “
  2. 基于Java实现(PC)民航订票管理系统【100010185】
  3. 定积分求解(1)cos(bx)*e^(-x^2)在负无穷到正无穷的积分
  4. 深圳将在2015年推广家庭服务机器人
  5. Java基础 - 标识符
  6. 连接跟踪TCP协议状态转换
  7. Nodejs学习路线图
  8. 项目经理必看!常用的项目管理工具及方法
  9. 前端渲染10w条数据
  10. python安装第三方插件出现的错误